【WordPress】自動で定期的に処理をさせよう!wp-cronの使い方

毎日記事を投稿しているあなた!

下書きを夜寝ているうちに用意しておきませんか?

朝起きて管理画面にアクセスするとすでに各種設定済みの下書きが投稿されている。

あとは編集して記事を書き公開するだけ。

ブログ投稿のひと手間が減って執筆意欲も急上昇!…するといいな

それがWordPressの機能「wp-cron」を使うとできちゃうんです!

使い方はこちら!

まずは、これが今回のソースです。

function my_auto_function()
{
  $date = current_time('Ymd');
  $content = '記事の内容';
  $title = '記事のタイトル';
  $slug = $date;

  $post = array(
            'post_content' => $content,
            'post_title'   => $title,
            'post_name'    => $slug,
            'post_status'  => 'draft',
            'post_type'    => 'post',
            'post_category' => array(2),
        );
  wp_insert_post($post);
}
add_action('my_auto_function_cron', 'my_auto_function');

if (!wp_next_scheduled('my_auto_function_cron')) {
  $difference = (current_time('timestamp') - time()) / 3600;
  $my_time = date('Y-m-d 03:00:00', current_time('timestamp'));
  $task_time = strtotime(-1 * $difference . " hour", strtotime($my_time));

  wp_schedule_event($task_time, 'daily', 'my_auto_function_cron');
}

function.phpにコピペしてパラメータを書き換えてあげればそれで動きます。

my_auto_function()関数を毎日03:00時に実行するという内容です。

以下解説です。

投稿処理の記述

流れとしては

  • 実際に実行する処理の関数を書いて
  • wp_cronのフックに登録する。

となります。

具体的に見ていきましょう。

まず、今回は自動で記事を投稿させたいので、記事を投稿する処理を書いていきます。

使うのはwp_insert_post()関数です。

wp_insert_post($post)はデータベースへ投稿を追加する関数です。

パラメータに「タイトル」「記事内容」「スラッグ」「カテゴリー」などを設定できます。

パラメータは連想配列で指定します。

パラメータの詳細は下記のリファレンスへのリンクから見てみてください。

タイトル名はスラッグは投稿日の日付を入れておくとわかりやすいと思います。

投稿日はcurrent_time()で取得します。

post_category(カテゴリー)はカテゴリーのIDを配列で指定します。

IDの調べ方は管理画面からカテゴリーを開き、カテゴリー名にマウスカーソルを合わせるとURLが表示されます。

そのURLにtag_IDというパラメータがあるのですが、その値がカテゴリーのIDです。

add_action()

add_action('wp-cronに登録されるフック名','登録するアクション(関数)')

となります。

次にwp-cronへの登録です。

wp-cronへのイベントの登録

まずはすでにこのイベントが設定されていないかを確認します。

それが最初のif文です。

wp_next_scheduled()は当該イベントがすでに存在していればその実行時間を、存在していなければfalseを返します。

wp_schedule_event()がwp-cronに処理を登録する関数です。

<?php wp_schedule_event($timestamp, $recurrence, $hook, $args); ?>

パラメータは4つ。

$timestampは最初に実行される時間。

$recurrenceは実行頻度。hourly,daily,twicedailyがあります。

とある処理をすればweeklyやmonthlyも使えますが、それはまた別に解説します。

$fookは実行するアクションフック名。

ここでは、上記add_actionで設定したフック名です。

$argsはフックした関数に渡す引数(省略可)です。

つまり上記のコードは

「毎日$timestampの時刻にmy_auto_function_cronを実行する」

という意味です。

$timestampですが、こちらの時間はUTCと呼ばれる世界協定時で設定します。

我々のローカルな時間ではありませんのでご注意を。

そのため、時差を考慮して時間を設定しなければなりません。

ではまずは時差を求めてみましょう。

time()関数はUTC時間で現在時刻を取得します。

current_time()関数はローカル時間で現在時刻を取得します。

これらを差し引き、3600秒で割ってみれば時差が取得できます。

これを$differenceに入れておきます。

ちなみにcurrent_time(‘timestamp’, 1)でもUTC時間で取得できます。

time()とお好きな方をどうぞ。

次に実行時間を設定します。

date()関数で現在時刻を‘Y-m-d’の日付フォーマットに整形します。

そして実際に実行させたい時刻をY-m-dのあとに記述します。

ここでは深夜3時に実行するようにしてあります。

最後に、strtotime()関数で先程求めた時差の分だけずらします。
ここでは第2引数のローカル時間から時差分をマイナスした時間を求めています。

これで$timestampに設定する時間の値を作成できました。

これを$wp_schedule_eventに入れてあげればOKです。

これでwp-cronにイベントが登録できました。

実際にきちんと登録されているかチェックするには「WP Crontrol」というプラグインが便利です。

手動で実行して実行結果を確認することもできます。

また、削除も行えるので是非活用してみてください。

終わりに

以上、記事投稿の自動化についてでした。

もちろん記事投稿だけでなくさまざまな処理がwp-cronを使えば自動実行させることができます。

なお注意点として、wp-cronはブログにアクセスがあった時点で実行予定時刻を過ぎているものがあれば実行する、という仕様となっています。

なので、アクセスがなければ実行がされないのです。

本当に定期的に処理を行いたい場合は、サーバーのcronを使用してwp-cronを実行する、といった処理が必要になります。

これはお使いのサーバで設定することになるので、レンタルサーバーのマニュアルを確認してみるとよいでしょう。

それではよいWordPressライフを!

コメントを残す

名前、メールアドレスは任意です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。