web-dev-qa-db-ja.com

WP_CRONを無効として、数ごとにサーバーからwp-cron.phpを起動する必要がありますか?

WordPressは、ページが読み込まれるたびにWPCRONを不必要に起動します。毎回の訪問で実行するのではなく、サーバー経由で5分ごとに実行するようにスケジュール設定しないのではないでしょうか。私は5分ごとに単純にwp-cron.phpを起動して望ましい結果を達成することができますか?

これに何か欠点がありますか?

9
TheBigK

サーバーのcronジョブを使用してWP CRONを実行することにマイナス面はありません。実際、これは推奨される方法です。

によると、公式のWordPressプラグイン開発文書

WP-Cronは継続的に実行されません。これは、時間通りに実行する必要がある重要なタスクがある場合に問題になる可能性があります。これに対する簡単な解決策があります。システムのタスクスケジューラを希望の間隔で(または必要な特定の時間に)実行するように設定するだけです。

これを行うには、まずwp-config.phpのデフォルトのcron動作を無効にする必要があります。

define('DISABLE_WP_CRON', true);

次に、サーバーからwp-cron.phpをスケジュールします。 Linuxの場合、これは次のことを意味します。

crontab -e

ただし、コマンドライン(CLI)で実行する代わりに、HTTPリクエストとして実行してください。そのためにはwgetを使うことができます。

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPressはwp-cron.php内の必要なコアファイル、プラグインなどすべてを以下のコードでロードします。

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

だからWordPressが重要な機能をロードしていないことを心配しないでください。

8
Fayaz

いくつかの欠点があります。まず、cliとしてwp-cron.phpを使用する場合、$ _ SERVER変数などが設定されません。代わりにwp-cron.phpへのcurlリクエストを使用することで、この制限を克服します。

第二に、WP自体はwp-cron.phpでロードされないためです。 SMTPメーラープラグインを使用している場合、wp-cronの呼び出し時にこれは読み込まれません。繰り返しますが、curl呼び出しを使用すると、この問題がオーバーライドされます。 Curlは最も頻繁に使用される方法のようです。

しかしながら; postfixおよび(nginxの場合)php-fpm configでメール設定を正しく設定し、次のようなcrontabを設定した後、wp-cliを使用することを好みます。

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(特定のフィールドを持つすべてのcronをcsv形式でリストします-フックはcronの名前で、次の実行相対は時間です。AWKを使用して 'now'を表示するものを削除します)各cronでwp cron event run $HOOKを呼び出します。)wp-cliを使用してWordPressを正しくロードします(cronをリストするときにプラグインをスキップすることを選択します。コードエラーとphp警告によりスクリプト出力が台無しになりますが、そうではありません) xargsでcronを実行するときにそれらをスキップするには、cronにプラグインをロードする必要がある場合があるため)

これがあなたが何に注意するべきかについてのいくらかの指針を与えることを望みます。

2
TechnicalChaos