
サーバ上で定期的にプログラムを実行させるためにはcron(クロン)を利用します。
本来、cronはサーバで設定をしないといけないのですが、wordpressならテーマやプラグインからcronを設定することが可能なのです。
クライアンとによってはサーバを触らせてくれないことってあるし、サーバを触って予期せぬ事態トラブルが起こることも避けられます。
今回はサンプルのプログラムを作りながらwordpressのcron設定を解説していきたいともいます。
テーマのサンプルもダウンロードできるようにしておきますので、よかったら参考にしてみてください。
余談ですが、cronをクーロンと読む人がめちゃくちゃ多いですが、正確にはクロンとかクローンの方らしいですよ。
「cron 読み方」で検索してみてください。
ぶっちゃっけ読み方なんてどうでもいいと僕は思ってますけどね。
[business_backbone]
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のサンプルテーマもありますので、興味がありましたらダウンロードしてください。
質問やミスの指摘などありましたら、お気軽にコメントください。
コメント