web-dev-qa-db-ja.com

update_optionがスタンドアロンで機能しない PHP スクリプト

私は自分のWordPressテーマのディレクトリに独立したPHPスクリプトを持っていて、それをcronジョブを通して1時間に1回(または必要なら手動で)実行します。 update_option()関数を除いて、他のすべてのWordPress関数は機能しています。

私のスクリプトの簡略版は次のようになります。

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

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

そして私のテーマのファイルの一つで、私は次のコードを実行しています:

echo get_option('my_option');

何も表示されず、var_dumpは戻り値がfalseであることを示します。

私のwp-admin/options.phpページにはmy_optionもリストされていません。

これらの行の下では、私はWordPressデータベースと正常にやり取りするために次のWordPress関数を使用しているので迷います。

  • get_posts
  • delete_post_meta
  • add_post_meta

私のスクリプトをデバッグすると、my_functionは文字列(約10文字)を返し、E_ALLの私のPHPエラー設定でエラーは発生しません。

他のWordPressコアファイルを含める必要がありますか?私はwp-load.phpがあなたが必要とするすべてであると思いました。


ワードプレスのバージョン:3.7

2
iglvzx

それがなぜうまくいかないのかよくわかりませんが、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

この2行をファイルの先頭に追加してください

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

WordPressのすべてをロードしますが、wp()を呼び出したり、テンプレートローダー(テーマで使用される)を呼び出したりしません。

1

あなたのコードにはある種のブートストラップが必要だと思います。 WordPressはすでにindex.phpwp-load.php、あるいはwp-blog-header.phpのようなブートストラップを持っています。

この :

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

パスは変更可能なので推奨されていません。いくつかのブートストラップを持つためにあなたができることは:

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

このようにしてWordPressをほとんどどんな場合でもロードすることができるでしょう。

1
JMau