Acceder a la API de WordPress fuera de WordPress (línea de comandos PHP)

12

Tengo un script PHP que necesito para ejecutar como un trabajo cron. Sin embargo, esta secuencia de comandos necesita acceso a la API de WP ( get_pages() , get_post_meta() y get_permalink() específicamente). He seguido las instrucciones en enlace , pero en vano.

Código:

require_once('../../../wp-blog-header.php');
$args = array(
    'child_of' => 2083
);
$pages = get_pages($args);

Sin embargo, cuando ejecuto php -q this_file.php desde la línea de comandos, obtengo el siguiente resultado:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Database Error</title>

</head>
<body>
    <h1>Error establishing a database connection</h1>
</body>
</html>

¿Alguien tiene algún comentario o sugerencia?

    
pregunta ggutenberg 14.12.2010 - 15:47

4 respuestas

17

WordPress espera que las variables $ _SERVER se configuren como si fuera una solicitud web normal. Además, sugeriría cargar wp-load.php en lugar de wp-blog-header.php ya que probablemente no necesite la clase WP o el cargador de plantillas para ejecutarse. Aquí es cómo normalmente comienzo cualquier secuencia de comandos que necesito para interactuar con WP desde la línea de comandos:

define('DOING_AJAX', true);
define('WP_USE_THEMES', false);
$_SERVER = array(
    "HTTP_HOST" => "mysite.com",
    "SERVER_NAME" => "mysite.com",
    "REQUEST_URI" => "/",
    "REQUEST_METHOD" => "GET"
);
require_once('current/wp-load.php');

Actualización 2018:

Hoy en día, Wordpress no requiere $ _SERVER en absoluto. Si simplemente necesita acceder a las funciones de la API de Wordpress (por ejemplo, para leer / escribir en la base de datos), todo lo que necesita es:

require_once('current/wp-load.php');

# your code goes here...
    
respondido por el prettyboymp 14.12.2010 - 16:21
4

Puede utilizar el comando wp-cli eval-file :

@daily /usr/bin/wp --path=/path/to/wp/ eval-file /path/to/that_file.php

Esto cargará primero el entorno WP, luego ejecutará su archivo.

    
respondido por el scribu 25.06.2012 - 12:53
1

La respuesta aceptada por @prettyboymp es sobre la información más útil y única sobre el acceso a wordpress desde un script php que he encontrado en la web. Funcionó perfectamente para mí con WP core 3.7.1, luego 3.9 lo rompió.

El problema fue que wp-load.php cambió la forma en que probó el REQUEST_URI para una ruta válida. Pero, afortunadamente, también agregó un nuevo filtro para permitir el cortocircuito en la prueba.

Para restaurar la funcionalidad de la respuesta en 3.9, agregué define('SUNRISE', 'on'); a wp-config.php y creé el archivo wp-content/sunrise.php con este contenido:

add_filter('pre_get_site_by_path', 'my_pre_get_site_by_path', 10, 5 /*null, $domain, $path, $segments, $paths*/ );
    function my_pre_get_site_by_path($input, $domain, $path, $segments, $paths) {
    if ($path == '/') {
        return get_blog_details(array('domain' => $domain, 'path' => PATH_CURRENT_SITE), false);
    }
    return $input;
}
    
respondido por el sootsnoot 13.05.2014 - 16:23
0

Una variación de la respuesta de @ prettyboymp podría ser:

if(in_array(php_sapi_name(), ['cli', 'cli-server'])) {
    foreach($_SERVER as $key => $val) {
        if(!getenv($key))
             putenv($key.'='.$val);
    }

    if(!getenv('HTTP_HOST'))
        putenv('HTTP_HOST='.gethostname());

    if(!getenv('SERVER_ADDR'))
        putenv('SERVER_ADDR='.gethostbyname(gethostname()));

    if(!getenv('REQUEST_URI'))
        putenv('REQUEST_URI=/');

    if(!getenv('REQUEST_METHOD'))
        putenv('REQUEST_METHOD=GET');
}
    
respondido por el ewake 30.07.2016 - 03:02

Lea otras preguntas en las etiquetas