WordPressでバッチプログラムを作成したい場合、wp-cronを使ってスケジュールされるプラグインもあるようですが、ここではそうしたものを使わずに、ファイル構成上はWordpressとは独立した場所にシェルファイルとして存在するバッチプログラムの作成例について説明します。
こうすることで、たとえばLinuxの場合、crontabの設定でプログラムの実行スケジュールを制御することが可能ですし、Wordpressのセキュリティ強化のために wp-cron は無効にする場合もあるので、そのような場合でも影響を気にせずにバッチプログラムを配置することが可能です。
【本記事の内容を参考にされる場合は自己責任でお願いします】
- 当方の環境では、Wordpress3.8.1と3.9.1、PHP 5.3.3 で実際に運用しています。
- 一部の共有サーバーなど、レンタルサーバーによってはPHPをコマンドラインで利用できない場合もあります。
バッチ処理を行うPHPファイルが
hogehoge.php
それをphpコマンドで実行するシェルファイルが
hogehoge.sh
だとします。
これらのファイルはWordpressのインストールされているディレクトリ以外の好きな場所に置いて問題ありません。
バッチ処理を行うPHPファイルの雛形
hogehoge.php の雛形はこんな感じです。Wordpressのバージョンの違いによって設定しなければならない定数などが若干変わってくる場合があるようです。
- HTTP_HOST、SERVER_NAMEはご自分の環境に合わせて設定してください。
- $wp_root には、ご自分の環境のWordpressがインストールされているディレクトリを設定してください。
<?php //setup global $_SERVER variables to keep WP from trying to redirect $_SERVER = array( "HTTP_HOST" => "hoge.example.com", "SERVER_NAME" => "hoge.example.com", "REQUEST_URI" => "/", "REQUEST_METHOD" => "GET" ); define('WP_USE_THEMES', true); $wp_root = '/var/www/html/hoge/'; if (file_exists($wp_root.'/wp-load.php')) { require_once($wp_root.'/wp-load.php'); } //ここにバッチ処理を記述 // wordpressの標準関数や、 $wpdb などのWordpressグローバル変数も使えます。 ?>
シェルファイルの例
hogehoge.shはphpコマンドでhogehoge.phpを実行するシェルプログラムです。
極簡単な例を挙げます。 hogehoge.phpファイルもhogehoge.shファイルも/var/batchディレクトリ以下に存在しているイメージです。
#!/bin/sh /usr/bin/php -f /var/batch/hogehoge.php
試させていただいたところ $wpdb が取得できていることを var_dump($wpdb); で確認できました。
しかし、
下記のコードを実行したところうんともすんとも言いません。
(通常の記事を10件、固定ページを1件ほど投稿済みです。)
if ( have_posts() ){
echo “have posts !\n”;
while( have_posts() ){
the_post();
echo the_permalink() . “\n”;
}
}
wordpressの標準関数は利用できないのでしょうか?
よろしくお願いいたします。
ご質問ありがとうございます。
>wordpressの標準関数は利用できないのでしょうか?
使えると思います。
ただ、ご指摘のような have_posts(), the_post(), the_permalink() などのループ関数を使用する場合はquery_posts()関数か、WP_Query()を使って、事前にデータを問い合わせる必要があります。
query_posts()を使った場合の例を示します。
試しに処理の前に
query_posts( array() );
を追加してみてください。
query_posts( array() );
if ( have_posts() ){
echo “have posts !\n”;
while( have_posts() ){
the_post();
echo the_permalink() . “\n”;
}
}
上記を事前に実行すると、エントリの一覧が出力されます。
query_posts() の引数にあたえる配列は、用途に応じて多様なものを指定できます。
たとえば「投稿」のみを 最大1000件表示したい場合は
$args = array(
‘post_type’ => array( ‘post’ )
,’posts_per_page’ => ‘1000’
);
query_posts( $args );
のようにすることができます。
詳しくはCodexのページを参照いただければと思います。
(リンクを貼ろうと思ったのですが、何かWPの日本語Codexのページが重たいようなので、query_posts や WP_Query でぐぐっていただけたらと思います。)
バッチではなくURLアクセスからの通常の場合は、最新記事を表示するループ用、単一投稿ページにカレントIDの投稿を一つ表示するループ用、固定ページにカレントIDの固定記事を表示するループ用、検索結果のページに結果を表示するループ用 といった問い合わせをワードプレス側で自動的にURLから判断して事前に実行してくれています。
require(‘./wp-load.php’);
これで全ての関数が使えます。