WordPress以外のWordPress APIにアクセスする(コマンドラインPHP)


13

cronジョブとして実行する必要があるPHPスクリプトがあります。ただし、このスクリプトはWP API(get_pages()get_post_meta()およびget_permalink()特異的に)。http://codex.wordpress.org/Integrating_WordPress_with_Your_Websiteの指示に従いましたが、役に立ちませんでした。

コード:

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

ただし、実行すると php -q this_file.php、コマンドラインから、次の出力が表示されます。

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

誰にも考え/提案がありますか?

回答:


17

WordPressは、$ _ SERVER変数が通常のWeb要求であるかのようにセットアップされることを期待しています。また、おそらくWPクラスやテンプレートローダーを実行する必要はないので、wp-blog-header.phpではなくwp-load.phpを読み込むことをお勧めします。コマンドラインからWPと対話するために必要なスクリプトを通常どのように開始するかを次に示します。

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

更新2018:

最近では、Wordpressは$ _SERVERをまったく必要としません。単にWordpress API関数にアクセスする必要がある場合(データベースへの読み取り/書き込みなど)、必要なものは次のとおりです。

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

# your code goes here...

を使用するget_pagesには、WPクラスが必要です。したがって、wp-blog-header.phpを呼び出すのが適切なファイルでした。
ゴールデンアップル

あなたは正しいと、ここで指定したとおりにやってみましたHTTP_HOSTSERVER_NAMEREQUEST_URI。との両方wp-blog-header.phpで試しましたwp-load.php。すべてのインスタンスで元の質問に記載されているものと同じエラーメッセージ。私はこれをテーマディレクトリから実行しています-それは重要ですか?
グッテンベルク

@goldenapples、彼はそれをロードする必要がありますが、実行する必要はありません。これはwp-blog-header.phpが行う追加機能です。
prettyboymp

2
@dosboy、これをサーバーで実行していますか、それともmampを実行している開発コンピューターですか?mysqlの複数のインスタンスがインストールされているコンピューターで実行している場合、通常のhttpリクエストの場合とは異なるコマンドラインからのphpおよびmysqlインスタンスを使用している可能性があります。
prettyboymp

うーん...賢い考え。MAMPを実行する開発ボックスです。しかし、私は本番ボックスにSSHアクセスできません。スクリプトが機能していることを確認するためだけに、開発マシンでMySQLインスタンスを指定する方法はありますか?
グッテンベルク

4

wp-cli eval-fileコマンドを使用できます。

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

これにより、最初にWP環境がロードされ、次にファイルが実行されます。


1

@prettyboympによる受け入れられた答えは、私がウェブ上で見つけたphpスクリプトからwordpressにアクセスすることに関して最も役立つユニークな情報についてです。WPコア3.7.1で完全に機能し、3.9で破損しました。

問題は、有効なパスのwp-load.phpテスト方法が変わったことREQUEST_URIです。しかし幸いなことに、テストを短絡できるようにする新しいフィルターも追加されました。

3.9で回答の機能を復元するために、に追加define('SUNRISE', 'on');wp-config.phpwp-content/sunrise.php次のコンテンツでファイルを作成しました。

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

0

@prettyboympの答えのバリエーションは次のとおりです。

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');
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.