web-dev-qa-db-fra.com

update_option ne fonctionne pas en autonome PHP scénario

J'ai un script autonome PHP dans le répertoire de mon thème WordPress que je lance une fois toutes les heures via un travail cron (ou manuellement si nécessaire). Toutes les autres fonctions WordPress fonctionnent à l'exception de la fonction update_option().

Une version simplifiée de mon script ressemble à ceci:

require_once('/path/to/site/wp-load.php');

$value = my_function();
update_option('my_option', $value);

et dans l'un des fichiers de mon thème, j'utilise le code suivant:

echo get_option('my_option');

Rien n'est imprimé et un var_dump indique que la valeur renvoyée est false.

Ma page wp-admin/options.php ne répertorie pas my_option non plus.

Je suis perdu, car sous ces lignes, j'utilise les fonctions WordPress suivantes pour interagir avec ma base de données WordPress:

  • get_posts
  • delete_post_meta
  • add_post_meta

Debugging my script, my_function renvoie une chaîne (environ 10 caractères) et aucune erreur n'est générée avec mes paramètres d'erreur PHP à E_ALL.

Dois-je inclure d'autres fichiers de base WordPress? Je pensais que wp-load.php était tout ce dont vous aviez besoin.


Version WordPress: 3.7

2
iglvzx

Je ne sais pas pourquoi cela ne fonctionne pas pour vous, mais ce qui suit fonctionne dans le fichier wp-content/test.php:

<?php
// doesn't make difference to have this or not, for the rest to work
define( 'WP_USE_THEMES', false ); 

require( $_SERVER['DOCUMENT_ROOT'] .'/wp-load.php' );

function my_function()
{
    return 'hello world';
}

$value = my_function();
update_option( 'my_option', $value );
var_dump( get_option( 'my_option' ) );
2
brasofilo

Ajoutez ces deux lignes dans votre fichier en haut

 $parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] );
 require_once( $parse_uri[0] . 'wp-load.php' );

Il charge tout WordPress, mais n'appelle pas wp () et n'invoque pas le chargeur de modèles (utilisé par les thèmes).

1
Bindiya Patoliya

Il semble que vous ayez besoin d’une sorte de bootstrap pour votre code. WordPress a déjà démarré tel que index.php ou wp-load.php ou même wp-blog-header.php.

Ce :

require_once('/path/to/site/wp-load.php');

n'est pas recommandé car le chemin peut être modifié. Ce que vous pouvez faire pour avoir du bootstrap, c'est:

// Load WP
$load = 'wp-load.php';
while( !is_file( $load ) ) {
if( is_dir( '..' ) ) 
    chdir( '..' );
else
    die( 'Could not find WordPress in this place!');
}
require_once( $load );

De cette façon, vous pourrez charger WordPress presque dans tous les cas.

1
JMau