本文へジャンプ

WordPress再入門:cronを使わずに定期処理をする

Posted by namio.araki

WordPress再入門:cronを使わずに定期処理をする

導入

ここ2年ほどPC向けアプリケーションの開発にどっぷり入り込んでいて、久々にHTMLの世界へ戻ってきたので、今回はまだまだ元気なWordPressネタを紹介したいと思います。

僕が最後にWordPressをちゃんと触っていたのがWordPress 2.6ぐらいだったと思うので、もう5年以上前なんですね。
当時はまだPHPも4.xだったり、色々と苦労した記憶があります。

今回のお題はタイトルのとおり、「cronを使わずに定期処理をする」です。
もちろんググれば色々と情報は出てくると思うのですが、僕のなかでしっくりこなかったり、サンプルが動かなかったりしていたので、改めてここでまとめを書いてみたいと思います。

最近、実際にプロジェクトで経験したのですが、

  • 毎回DBにアクセスするほど情報更新がない
  • 処理をバックグラウンドに持っていくことにより負荷を分散させたい
  • 本体の処理とは別に管理したい
  • 他のWPサイトにも使いまわしたい

などの要望があるときには、今回の方法がもってこいです。
管理画面にアクセスするとプラグインやWordPress本体のアップデート通知が表示されますが、まさにそのロジックと同じ処理、と思ってもらえれば分かりやすいかと。

実装

導入が長くなりましたが、実際にサンプルを作っていきたいと思います。
themesの中のfunctions.phpでも出来るのですが、今回は汎用的に使えるように"プラグイン化"してみましょう。

プラグイン化するので、まずは下準備として、プラグインのベースを作ります。
/wp-content/plugins/ の中に好きな名前のフォルダを作り、その中にプラグインの実行ファイルとなるphpファイルを作成します。
例えば /wp-content/plugins/md-blog_cron.php のように配置します。

ここからファイルに記述していくのですが、結論だけ欲しい人もいると思いますので、まずはソース全文を。

/**
 * Plugin Name: md-blog_cron
 * Plugin URI: プラグインのURL
 * Description:プラグインの説明
 * Version: 1.0.0
 * Author: monsterdive, inc.
 * Author URI: http://monster-dive.com/
 */
/**
 * set function
 */
add_action('MD_BlogCronHook','MD_BlogDo');
/**
 * wp-cron start
 */
function MD_BlogCronStart() {
    //do twice per day
    wp_schedule_event(time(),'twicedaily','MD_BlogCronHook');
}
register_activation_hook(__FILE__, 'MD_BlogCronStart');
/**
 * wp-cron stop
 */
function MD_BlogCronStop() {
    wp_clear_scheduled_hook('MD_BlogCronHook');
}
register_deactivation_hook(__FILE__, 'MD_BlogCronStop');

/**
 * execute function
 */
function MD_BlogDo(){
    //実際に処理する内容を書く
}

ソースの中に書いてあるコメントの通り、そのままなのですが、

  1. プラグインを有効化したら、MD_BlogCronStartを実行する
  2. MD_BlogCronStart内で、1日2回処理を登録(MD_BlogCronHookをトリガー登録)
  3. MD_BlogCronHookをトリガーに、MD_BlogDoを実行する
  4. プラグインを無効化したら、MD_BlogCronStopを実行する
  5. MD_BlogCronStop内では、MD_BlogCronHookトリガーをクリアする

簡単ですね。

まとめ

以上ざっくりにでしたが、定期的に処理するプラグインを作ってみました。
いかがでしょうか。

簡単なわりには、重宝するのではないかなと思います。
フロントエンジニアからすれば、サーバエンジニアに作業をお願いしなくていい!ですし。w
またプラグインをOFFにすれば、フロントサイドで定期処理を止められるというのもメリットかと思います。

注意点としては、cronと違い正確な時間指定ではなく、あくまでWebサイトへのアクセスのタイミングで実行されたかどうかを確認する処理、ということです。

例えば上記のように1日2回で設定していても、誰もサイトを見る人がいなければ処理は行われません。
サイトを見る人がいないのだから、処理も要らないよね?という思想でしょうか。
ただ、次にサイトにアクセスがあったタイミングで、1日2回の処理がされてない!ということで、すぐに処理が行われます。

ちなみに、開発中のテストには、プラグインを無効/有効化を繰り返すだけでカウントはリセットされるようなので、すぐに処理されますよ。

Recent Entries
MD EVENT REPORT
What's Hot?