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

12

J'ai un script PHP que je dois exécuter en tant que tâche cron. Cependant, ce script doit avoir accès à l'API WP ( get_pages() , get_post_meta() et get_permalink() en particulier). J'ai suivi les instructions de enlace , 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 généré:

<!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-t-il des idées ou des suggestions?

    
posée ggutenberg 14.12.2010 - 15:47

4 réponses

17

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 pour s'exécuter. Voici comment je lance normalement 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...
    
réponse donnée prettyboymp 14.12.2010 - 16:21
4

Vous pouvez utiliser la commande wp-cli eval-file :

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

Ceci chargera d'abord l'environnement WP, puis exécutera votre fichier.

    
réponse donnée scribu 25.06.2012 - 12:53
1

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 que j’ai trouvé sur le Web. Cela fonctionnait parfaitement pour moi avec le noyau WP 3.7.1, puis 3.9 le cassait.

Le problème était que wp-load.php avait changé la façon dont il testait REQUEST_URI pour 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 dans la version 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;
}
    
réponse donnée sootsnoot 13.05.2014 - 16:23
0

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');
}
    
réponse donnée ewake 30.07.2016 - 03:02

Lire d'autres questions sur les étiquettes