WordPress

WP-Cronとは?WP-Cronの仕組みや使い方、WP-Cronを無効化してWordPressのパフォーマンスの改善方法等を徹底解説 

記事内に広告が含まれています。

みなさんこんばんは!速ラボ編集部です。

今回は、WP-Cronとは?WP-Cronの仕組みや使い方、WP-Cronを無効化してWordPressのパフォーマンスの改善方法等を徹底解説していきたいと思います。

人によっては、そもそもcron(クロン)ってなんやねん?と言う方もいらっしゃるかと思います。

そのため、当記事では、このWP-Cronについての説明を徹底しつつ、そもそもcronについての基礎も解説し、全体像を知っていただいた上でWP-Cronの仕組みや、WP-Cronを使った自動化処理の実装、またWordPressのパフォーマンスの改善などについて解説し、実際のお仕事など実務で利用できるレベルまで持っていける内容となっております。

よろしければぜひ当記事をご活用いただき、自動化やWordPressのチューニングなどにお役立ていただければと思います。

WP-Cronとは

WP-Cronとは、WordPressが時間ベースのタスクをスケジュール(予約実行)するための仕組みのことを言います。

結論から言ってしまうと、WP-Cronは擬似的なcronシステムになります。

このWP-Cronは、アップデートのチェックや予約投稿の公開など、WordPressのコア機能の多くがWP-Cronを利用しています。

名前の「Cron」の部分は、UNIXシステムで利用できる時間ベースのタスクスケジューリングシステムであるcronに由来しています。

WP-Cronは、ページが読み込まれるたびに、スケジュールされたタスクのリストをチェックし、何を実行する必要があるかを確認することで動作します。

実行されるべきタスクは、そのページの読み込み中に呼び出されます。

ここで注意点というかWP-Cronの特徴なのが、WP-Cronは、システムのcronのように常に実行されているわけではなく、ページの読み込みによってのみトリガーされるということです。

もし午後2時にタスクをスケジュールし、午後5時までページの読み込みが一度も発生しなかった場合、スケジューリングの遅延が発生する可能性があります。

WP-Cronについて、詳しくは以下のWordPress公式ページにて解説しておりますので、よろしければご確認ください。

Cron
WordPress における時間ベースのタスク・スケジューリング方法として、WP-Cron があります。更新の…
Cron – Plugin Handbook | Developer.WordPress.org
What is WP-Cron WP-Cron is how WordPress handles scheduling time-based tasks in WordPress. Several WordPress core featur...

そもそもcronとは(cronの基礎)

そもそもcron(クロン)とは、コンピューターで決まった時間に特定の仕事を自動で実行してくれるプログラムのことです。

たとえば、「毎日朝6時にメールをチェックする」とか、「毎週日曜日の深夜2時にデータをバックアップする」といった、繰り返し行いたい作業をコンピューターに教えてあげると、cronがその時間になると自動で実行してくれます。

cronは、時間の管理が得意な執事のような存在と考えるとわかりやすいかもしれません。

あなたが「この仕事をこの時間にやっておいてね」と指示を出しておけば、あとはcronが忘れることなく、正確にその作業をこなしてくれるんです。

なぜcronが必要なのか?

cronがない場合、コンピューターで自動化したい作業があれば、その作業を行うたびに手動でコマンドを入力したり、プログラムを動かしたりする必要があります。

例えば、ウェブサイトのログを毎日深夜12時にバックアップしたいとします。cronを使わないと、毎日深夜12時になったらあなたが起きてきて、手動でコマンドを打つ必要があります。

でも、cronを使えば「毎日深夜12時にこのコマンドを実行してね」と設定しておくだけで、cronが勝手にやってくれます。これであなたは安心して眠ることができますね。

cronは、面倒な手作業を減らし、作業の効率を上げてくれる、とても便利なツールなのです。

cronの設定方法

cronの設定は、crontab(クロンタブ)というファイルに書き込みます。

crontabとは、パソコンに「自動でやってほしいこと」と「その時間」を書いておくための仕組みです。

ユーザーは「crontab」というコマンドを使って、自分が実行したい作業と、いつ実行するかという予定を書いたファイルを作ります。

そして、パソコンの中でずっと動いている「cron(クロン)」というプログラムが、そのファイルを見て決められた時間になると自動で作業を実行してくれます。

これによって、毎日決まった時間にバックアップを取ったり、定期的にプログラムを動かしたりすることができるようになります。

このファイルには、以下の5つの数字と、実行したいコマンドを記述します。

  • 分(0-59)
  • 時(0-23)
  • 日(1-31)
  • 月(1-12)
  • 曜日(0-7、0と7は日曜日)

たとえば、「毎日朝6時30分」にbackup.shというスクリプトを実行したい場合、crontabに以下のように書きます。

30 6 * * * /home/user/backup.sh
  • 30:30分
  • 6:6時
  • *:毎日
  • *:毎月
  • *:毎曜日

*(アスタリスク)は「すべて」という意味で、曜日や月日に関係なく毎日実行してほしいときに使います。

このように、crontabにルールを書いておけば、cronがそのルールに従って自動で作業をやってくれます。

cronは、特にサーバーなどのコンピューターで、データのバックアップやログの整理といった定期的な管理作業を行う際によく使われる、プログラミングやシステム管理の世界では欠かせないツールです。

Cronはレンタルサーバーの管理画面で簡単に設定できる

ここまでで、cronについて大体なんとなくわかったかと思いますが、ゴリゴリのインフラエンジニアなどでない限り、詳しいことまで覚える必要はありません。

WordPressを扱う場合、多くの場合はレンタルサーバーを利用することになるかと思いますが、レンタルサーバーであれば、管理画面にcron設定のようなcronを簡単に設定できる機能が備わっていることがほとんどですので、ご安心ください。

例えば、ロリポップでは下図のような感じで操作画面からcron設定が可能となっております。

cronの設定方法 - ロリポップ!レンタルサーバー
ロリポップ!レンタルサーバーのご利用マニュアル 「cron設定」 について説明したマニュアルページです。

また、他のレンタルサーバーでも同様に、cron設定がサーバーパネル(管理画面)に備わっているかと思いますので、ご自身の利用されているレンタルサーバーのマニュアルを確認してみてください。

Cron設定 | レンタルサーバーならエックスサーバー
レンタルサーバー「エックスサーバー」のご利用マニュアル|あらかじめ指定した時間に指定コマンド(プログラム)を自動的に実行させる機能「Cron」の設定手順に関するご案内です。
CRONを設定したい | さくらのサポート情報
このマニュアルでは、CRONを使ったメールアドレスの運用管理についてご案内しています。前提条件CRONは、スタンダードプラン以上のプランでご利用できます。設定を誤った場合、サーバー上のメールやファイルが削除されることも考えられます。充分な確...

なぜWordPressはWP-Cronを採用しているのか

WordPressコアや多くのプラグインは、時間ベースのタスクを実行するためのスケジューリングシステムを必要としています。

しかし、多くのホスティングサービスは共用レンタルサーバー(共用サーバー)であり、システムのスケジューラへのアクセスを提供していません。

共用レンタルサーバーでは、1台のサーバーを複数のユーザーが使っています。
そのため、サーバーの根本的な機能(サーバーのOSレベルの「cron」などのスケジューラ)を、各ユーザーが自由に設定できるようにはしていないと言うことです。

つまり、普通のレンタルサーバーでは 「サーバーの時計にあわせて、この時間に必ず実行して」 という命令を直接設定できない、ということです。

こういうこともあり、システムのスケジューラ(サーバーのOSのLinux などが標準で持っているcron)を直接利用するよりも、WordPressが持つ独自の仕組み(WP-Cron:擬似的なcronシステム)を使ってタスクをスケジュールする方が簡単です。

システムのスケジューラでは、指定した時間を過ぎてもタスクが実行されなかった場合、再試行されることはありません。

一方WP-Cronでは、すべてのスケジュールされたタスクはキュー(待ち行列)に入れられ、次の機会(つまり、次のページの読み込み時)に実行されます。

そのため、タスクがいつ実行されるかを100%保証することはできませんが、いずれアクセスがあれば必ず実行されます。

ちなみにややこしいのが、先ほど「レンタルサーバーのサーバーパネルのcron設定」について触れましたが、確かにサーバーパネル経由で用意されているcron設定画面を使えば、ユーザー専用のcronは登録できるので、結果的にタスクを自動実行できるようになります。

ここで言っているのは、「直接Linuxのcronを自由にいじれない」と言う話であり、WordPressのWP-Cronは、サーバーパネルを使わなくても「アクセス時に自動実行する」方法として用意されている、と考えると理解しやすいかと思います。

この点に注意しましょう。

WP-Cronの実装方法

それでは早速、WP-Cronの実装方法について解説いたします。

まずは以下のコードをプラグインを構成するメインPHPファイルにコピー&ペーストしてください。

hello dollyなどの公開済みのプラグインのPHPファイルや、ご自身の自作のプラグインでのPHPファイルなどに自由にコピー&ペーストしていただければと思います。

<?php
// 5秒間隔のスケジュールを追加
add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['every_five_seconds'] = [
        'interval' => 5,
        'display'  => __( 'Every 5 Seconds' )
    ];
    return $schedules;
});

// 実行する処理
function my_five_seconds_event() {
    wp_mail('【ご自身のメールアドレス】', 'テスト', 'これは5秒ごとのメールです');
}

// 有効化時にスケジュール登録
function my_activate() {
    if ( ! wp_next_scheduled( 'my_five_seconds_event_hook' ) ) {
        wp_schedule_event( time(), 'every_five_seconds', 'my_five_seconds_event_hook' );
    }
}
register_activation_hook( __FILE__, 'my_activate' );

// 実際のフック処理
add_action( 'my_five_seconds_event_hook', 'my_five_seconds_event' );

// 無効化時にスケジュール解除
function my_deactivate() {
    wp_clear_scheduled_hook( 'my_five_seconds_event_hook' );
}
register_deactivation_hook( __FILE__, 'my_deactivate' );

上記コードは、WordPressのWP-Cronに「5秒ごとに処理を実行するスケジュール」を追加するプラグインの例です。

内容的には、プラグインを有効にすると、WordPressのWP-Cronに5秒ごとのタスクを追加して、メールを送信する処理を繰り返す仕組みを実装するコードになります。

ちなみにWP-Cronはアクセスベースなので、厳密に5秒おきにはなりません。
サイトにアクセスがないと処理が走らないため、実際は「アクセスがあったときに 5秒経過していれば実行」されます。

本当に正確に5秒ごとに処理したいなら、サーバーのCronで直接wp-cron.phpを呼び出す、つまりレンタルサーバーなどのサーバーパネルに備わっているcron設定などを利用していただければと思います。

上記コードについて、順番に解説していきます。

独自のスケジュール間隔を追加

WordPress には「毎時」「毎日」などの間隔(インターバル)が標準で用意されていますが、自由に間隔を追加することも可能です。

ちなみにWordPressが提供するデフォルトの間隔は以下になります。

  • hourly (毎時)
  • twicedaily (1日2回)
  • daily (毎日)
  • weekly (毎週。WordPress 5.4以降)

これらを使ってざっくりタスクを自動化することは可能かと思いますが、例えば5秒ごとや10分ごとなど、もっと自由にインターバルを決めたい場合が多々あるかと思います。

このように、独自のスケジュール間隔を追加する実装として、例えば「5秒ごと」という間隔を追加する場合は、以下のコードのようにcron_schedulesフィルターを利用します。

<?php
// 独自スケジュール(5秒ごと)を追加
add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['every_five_seconds'] = [
        'interval' => 5, // 秒数
        'display'  => __( 'Every 5 Seconds' )
    ];
    return $schedules;
});

上記コードの関数は、cron_schedulesフックに登録することで、5秒ごとにcronタスクを実行するための新しいインターバルを作成します。

「5秒ごと」という独自の実行間隔を設定し、後のイベント登録で利用できるようにしています。

cron_schedulesフックについて詳しく知りたい方は、以下の公式ページをご確認ください。

cron_schedules – Hook | Developer.WordPress.org
Filters the non-default cron schedules.

実行する処理を定義

次に、スケジュールに従って実行したい処理(関数)を定義します。

ここでは例として、メール送信を行う関数を用意します。

<?php
// 実行したい処理
function my_five_seconds_event() {
    wp_mail( '【ご自身のメールアドレス】', 'テストメール', 'これは5秒ごとのメールです。' );
}

スケジュールで実際に実行したい処理を関数として定義しています。

この例ではWordPressのwp_mail()関数を使って、定期的にメールを送信する処理を記述しています。

スケジュール登録

次にプラグイン有効化時などに、一度だけスケジュールを登録するコードを記述します。

wp_next_scheduled()関数で既に登録されていないか確認してから、wp_schedule_event()関数を実行します。

<?php
// プラグイン有効化時にスケジュールを登録
function my_activate() {
    if ( ! wp_next_scheduled( 'my_five_seconds_event_hook' ) ) {
        wp_schedule_event( time(), 'every_five_seconds', 'my_five_seconds_event_hook' );
    }
}
register_activation_hook( __FILE__, 'my_activate' );

register_activation_hook()関数を利用して、プラグイン有効化時に、独自スケジュールを登録する処理です。

wp_next_scheduled()関数で二重登録を防ぎ、存在しなければwp_schedule_event()関数でイベントを新規登録します。

コードにあるそれぞれの関数について詳しく知りたい方は、以下の公式ページをご確認ください。

wp_next_scheduled() – Function | Developer.WordPress.org
Retrieves the timestamp of the next scheduled event for the given hook.
wp_schedule_event() – Function | Developer.WordPress.org
Schedules a recurring event.
register_activation_hook() – Function | Developer.WordPress.org
Set the activation hook for a plugin.

フック処理を紐付け

次に登録したスケジュールイベントと、実行する関数を紐付けます。

<?php
// フックと処理を紐付け
add_action( 'my_five_seconds_event_hook', 'my_five_seconds_event' );

上記コードは、スケジュールイベントと、実際に実行する関数を関連付ける部分です。

ここではadd_action()関数を使い、指定したwp_schedule_event()関数にて作成したイベントフックが実行されたときに、定義済み関数を呼び出しています。

スケジュール解除

最後に実装にて、プラグイン無効化時などには、不要になったスケジュールを解除しておくのが安全です。

// プラグイン無効化時にスケジュールを解除
function my_deactivate() {
    wp_clear_scheduled_hook( 'my_five_seconds_event_hook' );
}
register_deactivation_hook( __FILE__, 'my_deactivate' );

上記コードは、プラグイン無効化時に、登録していたスケジュールを解除する処理です。

wp_clear_scheduled_hook()関数を使って不要なタスクを削除し、無駄なイベント実行を防いでいます。

ここまでで、サンプルコードの説明は以上になります。

また、最後に何度もしつこいですが、WP-Cronはアクセスがあったタイミングで実行チェックを行うため、厳密に5秒ごとにはなりません。

本当に正確に実行したい場合は、サーバーの Cron による制御が必要であることだけ、ご注意ください。

コードにあるそれぞれの関数について詳しく知りたい方は、以下の公式ページをご確認ください。

wp_clear_scheduled_hook() – Function | Developer.WordPress.org
Unschedules all events attached to the hook with the specified arguments.
register_deactivation_hook() – Function | Developer.WordPress.org
Sets the deactivation hook for a plugin.

WP-Cronを無効化する設定方法

WordPress の WP-Cron はアクセスがあったときだけ動く仕組みなので、必ず時間通りに実行したい重要な処理には向きません。

そこでの解決策はシンプルで、サーバーやシステムのタスクスケジューラー(Cron)、つまりサーバーパネルにあるcron設定などを使って、wp-cron.phpを指定の間隔または特定の時間に実行させる方法です。

ただし、この方法を使うと WP-Cron がページ読み込みごとに実行される必要はなくなります。

そのままにしておくと無駄にサーバー負荷がかかるので、wp-config.phpに以下を追記して WP-Cron を無効化してください。

define( 'DISABLE_WP_CRON', true );

WP-Cronのコマンド

WordPress にはコマンドライン操作ツールWP-CLIがあり、その中でwp cronサブコマンドを使うとWP-Cronの操作が可能です。

WP-CLIの「wp cron <command> 」は、WordPressのWP-Cronをコマンドラインから操作するためのツールです。

登録済みイベントの一覧表示や即時実行、スケジュール追加・削除、動作確認などが可能で、管理画面に依存せず確実にタスクを管理できます。

詳しく知りたい方は、以下の公式ページをご確認ください。

wp cron – WP-CLI Command | Developer.WordPress.org
Tests, runs, and deletes WP-Cron events; manages WP-Cron schedules.

まとめ

今回は、WP-Cronとは何か、その仕組みや使い方、さらにWP-Cronを無効化してWordPressのパフォーマンスを改善する方法まで詳しく解説しました。

また、そもそも「cron(クロン)」とは何かという基礎も押さえた上で、WP-Cronの全体像や自動化処理の実装方法、実務での活用方法についても整理しています。

本記事を参考にしていただくことで、WordPressの自動化やパフォーマンス改善に役立てられる内容になっています。ぜひ実際のサイト運用や開発にお役立てください。

コメント

タイトルとURLをコピーしました