WordPressCronのしくみ

公開: 2021-12-03

WP-Cronとは何か疑問に思ったことはありますか? もしそうなら、これはあなたがWordPressのスケジュールされたタスクについて知る必要があるすべてを学ぶための完璧な記事です。

Cron(Command Run On)は、UNIXシステムで開始され、その後、時間ベースのジョブスケジューラとして提案されたLINUXディストリビューションで進化したユーティリティです。

cronジョブは、繰り返し実行されるタスク、または1回限りのタスクとして実行されるタスクです。 長年にわたり、タスクを自動的に実行するためのシステム管理ツールとして主に使用されてきました。

WordPress Cron

WordPress Webサイトの実行中、テーマやプラグインの更新、スケジュールされた投稿、削除される一時的なものなど、定期的に実行する必要のあるいくつかのタスクがバックグラウンドで実行されます。 これらの時間ベースのスケジュールされたタスクは、WP-Cronによって処理されます。

WordPressのインストールでは、cronジョブに関連するファイルは、インストールのルートフォルダーにあるwp-cron.phpファイルです。

wp-cron.phpファイルには、更新と投稿に関連する自動化されたタスクのコードが含まれています。

使い方

WP-Cronは、ページが読み込まれるたびにタスクリストをチェックし、それに応じて実行します。

ページが読み込まれた瞬間にタスクの期限が来ると、キューに追加されます。 そうすることで、WordPressは、期限のあるイベントも発生し、スキップされないようにし、最終的にはすべてのタスクがそのページの読み込み時に実行されるようにします。

これがあなたにとって不合理に思えるのは当然ですが、別の方法を考えてください。 共有ホスティング環境では、ほとんどの場合、これらのタスクを適切と思われるように制御するためにサーバーコマンドにアクセスできる必要がありますが、それはサーバーにとって危険ではないでしょうか。

したがって、この状況での回避策としてWordPressが何をするかを検討してください。 ただし、これにはいくつかの欠点があり、後で検討します。

WP-Crontrolプラグイン

WordPress Webサイトでcronジョブのリストを表示するための優れた簡単な方法は、WP-Crontrolプラグインをインストールすることです。

アクティベートした後、プラグインの管理ページを[ツール]->[cronイベント]メニュー項目で表示できます。 バニラインストールでは、次のようなものが表示されます。

各行にマウスを合わせると、イベントを編集または実行するためのアクションが提供されていることがわかります。

たとえば、wp_update_themesイベントの編集画面では、その設定を変更できます

[設定]->[cronスケジュール]メニュー項目で、デフォルトのスケジュールを表示できます。必要に応じて、独自のスケジュールを追加し、リストに表示する名前を付けます。

cronジョブを作成する方法

cronジョブを手動で追加するには、テーマのfunctions.phpファイルを編集するだけです。 簡単な例を示すために、お気に入りのエディターでそれを開き、次のコードを追加します。

 add_action( 'my_cronjob', 'my_cronjob_function' ); function my_cronjob_function() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); }

ここで、「my_cronjob」はフックの名前であり、「my_cronjob_function」は、EMAIL_ADDRESSを目的のアドレスに置き換えて定義したアドレスに電子メールを送信するだけの関数の名前です。

次に、このフックが必要な時間に実行されるようにスケジュールする必要があります。

ジョブを1回実行する方法

アクションを1回限りのWP-Cronジョブとして実行するには、指定された時間にフックをトリガーするように設計されたwp_schedule_single_event()WordPress組み込み関数を使用する必要があります。 構造は次のようになります。

wp_schedule_single_event( $timestamp, $hook, $args, $wp_error )

ここで、$ timestampはイベントを次に実行するタイミングのUnixタイムスタンプであり、$hookはイベントの実行時に実行するアクションフックです。

これらのパラメーターは両方とも必須です。 次に、オプションのパラメータについて説明します。

$ argsパラメーターを使用すると、引数を含む配列を使用して、フックのコールバック関数に渡すことができます。 配列内の各値は、個別のパラメーターとしてコールバックに渡されます。 配列キーは無視されます。

$ wp_errorパラメーターを使用して、失敗時にWP_Errorを返すことができます。 デフォルト値はfalseです。

functions.php .phpファイルの対応するコードは次のようになります。

 add_action( 'my_cronjob', 'my_cronjob_function' ); function my_cronjob_function() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } wp_schedule_single_event( time() + 3600, 'my_cronjob' );

この時点で、リストにカスタムタスクが表示されるはずです。

定期的なイベントとしてジョブを実行する方法

WordPressがこのシナリオに提供するのは、このように構成されたwp_schedule_event()関数です。

wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error)

$ timestampパラメーターは、イベントを次に実行するタイミングに必要なUnixタイムスタンプであり、$ recurrenceは、イベントがその後繰り返される頻度にも必要な文字列であり、$ hookは、イベントの実行時に実行するアクションフックです。

オプションの$argsおよび$wp_errorパラメーターは以前と同じです。

たとえば、1時間の繰り返しでジョブを実行するコードは、次のとおりです。

 add_action('my_hourly_cronjob', 'hourly_action'); function hourly_action() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } if (! wp_next_scheduled ( 'my_hourly_cronjob' )) { wp_schedule_event(time(), 'hourly', 'my_hourly_cronjob'); }

上記のように「if」ステートメントでwp_next_scheduled()関数を使用して、イベントの重複を回避し、タスクを続行して実行する前にタスクがまだスケジュールされていないことを確認しました。

また、[設定]->[cronスケジュール]の下のスケジュールされたテーブルの「毎時」ラベルを使用しました。 別のオカレンスが必要な場合、たとえば45分ごとに、最初に「45_minutes」という名前のカスタムcronスケジュールを作成してから、コードで使用する必要があります。

 add_action('my_45_cronjob', 'my_45_action'); function my_45_action() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } if (! wp_next_scheduled ( 'my_45_cronjob' )) { wp_schedule_event(time(), '45_minutes', 'my_45_cronjob'); }

この時点で、予想される変更を含むカスタムタスクがリストに表示されるはずです。

WP-Cronの欠点

WordPressがcronジョブを処理する方法は、タスクが実行されることを保証しますが、訪問者がWebサイトのページをロードしたときにチェックが行われるため、いつ指定することはできません。

ユーザーの訪問時間にcronジョブ制御を中継する場合、Webサイトのサイズや人気に関係なく、Webサイトに悪影響を与える可能性があります。

Pressidiumであなたのウェブサイトをホストする

60日間の返金保証

私たちの計画を見る

人気のあるウェブサイトの場合、多数のタスクを同時に実行するため、大量のトラフィックが発生します。 これにより、サーバーのリソースが消費され、パフォーマンスに影響を与えたり、Webサイトのダウンタイムが発生したりする可能性があります。

訪問者が少ないことを意味する小さなWebサイトの場合、wp-cronはそれほど頻繁にトリガーされないため、一部の重要なcronジョブは、十分なバックアップをとらない、または一部の更新を遅らせるなどの副作用を引き起こすのに十分な時間延期される可能性がありますcronジョブでカウントされるデータ。

WP-Cronを無効にする

WP-Cronがcronジョブを処理する方法が要件を満たしていない場合で、タスクを時間どおりに実行する必要がある場合は、WP-Cronを無効にして、サーバー側のcronサービスを使用する必要があります。

WP-Cronを無効にすることがホスティングプロバイダーによってすでに提供されているオプションではない場合、ここでそれを自分で行う方法を説明します。

インストールのルートフォルダの下にあるwp-config.phpファイルをお気に入りのエディタで開き、データベーステーブルのプレフィックスに関連する行を見つけます。 直後に、次の行を挿入します。

 // /** * WordPress Database Table prefix. * * You can have multiple installations in one database if you give each * a unique prefix. Only numbers, letters, and underscores please! */ $table_prefix = 'wN0b9WQk_'; define('DISABLE_WP_CRON', 'true');

これは、Linux cronサービスなど、より安定したスケジューラを使用して、適切なときにwp-cron.phpをトリガーする場合に必須です。

サーバーサイドソリューション: LinuxCronサービス

Pressidiumでは、LinuxCrontabを使用して5分ごとにWP-Cronをトリガーします。 スケジュールされたジョブが時間どおりに実行されると同時に、WordPressWebサイトの過負荷を回避するのに適切な時間です。 これはWP-Cronスケジューラーに干渉しませんが、トリガーメカニズムのみに干渉します。

結論

この記事が、WordPress Cronとは何か、どのように機能するか、独自のスケジュールとタスクを作成する方法を理解するのに役立つことを願っています。 他のサーバー側ソリューションを選択する前に、WP-Cronが要件に十分かどうかをよく考えてください。