私は自分の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関数を使用しているので迷います。
私のスクリプトをデバッグすると、my_function
は文字列(約10文字)を返し、E_ALL
の私のPHPエラー設定でエラーは発生しません。
他のWordPressコアファイルを含める必要がありますか?私はwp-load.php
があなたが必要とするすべてであると思いました。
ワードプレスのバージョン:3.7
それがなぜうまくいかないのかよくわかりませんが、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行をファイルの先頭に追加してください
$parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] );
require_once( $parse_uri[0] . 'wp-load.php' );
WordPressのすべてをロードしますが、wp()を呼び出したり、テンプレートローダー(テーマで使用される)を呼び出したりしません。
あなたのコードにはある種のブートストラップが必要だと思います。 WordPressはすでにindex.php
やwp-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をほとんどどんな場合でもロードすることができるでしょう。