web-dev-qa-db-fra.com

Accéder à l'API WordPress en dehors de WordPress (PHP en ligne de commande)

J'ai un script PHP que je dois exécuter en tant que travail cron. Toutefois, ce script doit avoir accès à l'API WP (notamment get_pages(), get_post_meta() et get_permalink()). J'ai suivi les instructions sur http://codex.wordpress.org/Integrating_WordPress_with_Your_Website , mais en vain.

Code:

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

Cependant, lorsque j'exécute php -q this_file.php à partir de la ligne de commande, le résultat suivant est obtenu:

<!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>

Quelqu'un a des pensées/suggestions?

12
ggutenberg

WordPress s'attend à ce que les variables $ _SERVER soient configurées comme s'il s'agissait d'une requête Web normale. Aussi, je suggérerais de charger wp-load.php au lieu de wp-blog-header.php car vous n'avez probablement pas besoin de la classe WP ou du chargeur de modèles à exécuter. Voici comment je lance normalement tous les scripts nécessaires pour interagir avec WP à partir de la ligne de commande:

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');

Mise à jour 2018:

De nos jours, Wordpress n’exige plus du tout $ _SERVER. Si vous devez simplement accéder aux fonctions de l'API Wordpress (par exemple, pour lire/écrire dans la base de données), il vous suffit de:

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

# your code goes here...
17
prettyboymp

Vous pouvez utiliser la commande wp-clieval-file:

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

Cela va d'abord charger l'environnement WP, puis exécuter votre fichier.

4
scribu

La réponse acceptée par @prettyboymp concerne les informations les plus utiles et les plus uniques sur l’accès à wordpress à partir d’un script php trouvé sur le Web. Cela fonctionnait parfaitement pour moi avec WP core 3.7.1, puis 3.9 le cassait.

Le problème était que wp-load.php a changé la façon dont il a testé le REQUEST_URI pour déterminer un chemin valide. Mais heureusement, un nouveau filtre a également été ajouté pour permettre de court-circuiter le test.

Donc, pour restaurer la fonctionnalité de la réponse en 3.9, j'ai ajouté define('SUNRISE', 'on'); à wp-config.php et créé le fichier wp-content/sunrise.php avec ce contenu:

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;
}
1
sootsnoot

Une variante de la réponse de @ prettyboymp pourrait être:

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');
}
0
ewake