【サーバ操作が不要】wordpressでcronを手軽に設定する方法

サーバ上で定期的にプログラムを実行させるためにはcron(クロン)を利用します。

本来、cronはサーバで設定をしないといけないのですが、wordpressならテーマやプラグインからcronを設定することが可能なのです。

クライアンとによってはサーバを触らせてくれないことってあるし、サーバを触って予期せぬ事態トラブルが起こることも避けられます。

今回はサンプルのプログラムを作りながらwordpressのcron設定を解説していきたいともいます。

テーマのサンプルもダウンロードできるようにしておきますので、よかったら参考にしてみてください。

余談ですが、cronをクーロンと読む人がめちゃくちゃ多いですが、正確にはクロンとかクローンの方らしいですよ。

「cron 読み方」で検索してみてください。

ぶっちゃっけ読み方なんてどうでもいいと僕は思ってますけどね。

cronの設定方法

以下の内容をテーマ内のfunctions.phpに記述することでcronを設定することができます。

アクションフックのwpを利用し、自作の関数であるmy_activation()を実行させます。

wpは、WP オブジェクトが設定された後のタイミングに実行されます。

my_activation()の関数には1分毎に動く、my_1min_eventというアクションを登録します。

wp_next_scheduledはcronに設定されたアクションの実行時間を取得できるので、条件文きでfalseのときだけアクションが登録されるようになっています。

//cronが設定されていなかったら登録
add_action('wp', 'my_activation');
function my_activation()
{
   if (!wp_next_scheduled('my_1min_event')) {
       wp_schedule_event(time(), '1min', 'my_1min_event');
   }
}

wp_schedule_eventに設定できる時間を設定

wp_schedule_eventに設定できる時間は3種類しかありません。

  • hourly(毎時)
  • twicedaily(1日2回)
  • daily(毎日)

オリジナルで時間を設定するためにはフィルターフックを利用します。

1minというオリジナルの連想配列を作成し、1分に1回と設定しています。

//クロンで1分を設定できるようにする
add_filter('cron_schedules', 'cron_add_1min');
function cron_add_1min($schedules)
{
   $schedules['1min'] = array(
       'interval' => 1*60,
       'display' => '1分に1回'
   );
   return $schedules;
}

cronに実行させる処理

//実行する処理
add_action('my_1min_event', 'do_this_1min');
function do_this_1min()
{
   $file = get_template_directory() . '/time.json';
   $current = file_get_contents($file);
   $current = json_decode($current);
 
   $date = new DateTime();
   $date->setTimezone(new DateTimeZone('Asia/Tokyo'));
   $current[] = date($date->format('Y-m-d H:i:s'));
   $current = json_encode($current);
   file_put_contents($file, $current);
}

現在の時刻を取得してjsonに保存しています。

わかりやすくするために時間を保存していますが、実用的に利用方法としては、どこかのサイトWeb APIを取得して1日に一回保存するなどでしょうか。

ステップメールの配信にも使えそうですね。

今後そのような機能を作成したら、記事にして紹介したいと思います。

class化して書いてみよう

functions.phpにだらだら関数を書いていると、可読性も保守性も悪いく、大規模サイトになった時にミスが発生しやすくなるので、なるべくclass化したいと思います。

class CronSampleClass
{
   public function __construct()
   {
       //cronが設定されていなかったらアクションの登録
       add_action('wp', array($this, 'my_activation'));
 
       //1分毎にcronを実行できるようにする
       add_filter('cron_schedules', array($this,'cron_add_1min'));
 
       //cronで実行する処理
       add_action('my_1min_event', array($this, 'do_this_1min'));
   }
 
   public function my_activation()
   {
       if (!wp_next_scheduled('my_1min_event')) {
           wp_schedule_event(time(), '1min', 'my_1min_event');
       }
   }
 
   public function cron_add_1min($schedules)
   {
       $schedules['1min'] = array(
           'interval' => 1*60,
           'display' => '1分に1回'
       );
       return $schedules;
   }
 
   public function do_this_1min()
   {
       $file = get_template_directory() . '/time.json';
       $current = file_get_contents($file);
       $current = json_decode($current);
  
       $date = new DateTime();
       $date->setTimezone(new DateTimeZone('Asia/Tokyo'));
       $current[] = date($date->format('Y-m-d H:i:s'));
       $current = json_encode($current);
       file_put_contents($file, $current);
   }
}
 
//CronSampleClassの実行
$CronSampleClass = new CronSampleClass();

cronを使用したテーマのダウンロード

cronのサンプルテーマもありますので、興味がありましたらダウンロードしてください。

質問やミスの指摘などありましたら、お気軽にコメントください。

正社員という奴隷制度に中指を立てるWebエンジニアです。PHPが得意。繋がれた鎖を断ち切るために、自由を取り戻すために、プログラミングスキルを磨く日々です。プログラミングと個人でもできるビジネスについて、情報発信しています。

詳しくはこちら