マルチサイトでWP Cronを正しい方法で実行する


18

WordPress Multisiteにはいくつかのサイトがあります。私はセットアップDISABLE_WP_CRONtrue私の中でwp-config.php

wgetまたはcurlを使用してcronタスクをセットアップした場合、PHPスクリプトを実行するための30秒のルールがあります。大量の電子メール通知を送信したり、他のことをしたりするのは非常に小さいです(リモートSMTPサーバー接続が遅いかもしれません。bbPressなどからの大量の電子メール通知かもしれません)。

このようなものを使用できますか?

php -q wp-cron.php

ただし、マルチサイトの1つのサイトに対してのみcronを実行します(各サイトには、異なるMySQLテーブルに独自のcronタスクがあります)。

PS wpmudev.orgフォーラムで、 Curlを使用する奇妙な「ソリューション」を見つけました。

別のPS WP CLIには素晴らしいwp cronコマンドがありますが、cronタスクを手動で実行することしかできません(そう、--urlattr を使用できます)。例えば:

wp cron event list --url=multisite.com
wp cron event list --url=subdomain.multisite.com

WP-CLIコアコードを確認しましたか?
カイザー14年

はい。私は今ソースコードを掘り下げて理解しようとしています:)すべてのタスク(イベント)を実行するコマンドは存在しません。将来作成するかもしれません。
コーリャ愛のプラハKorobochkin

wp/ WP-CLIがありますPATHか?はいの場合、なぜcronで実行されているbashファイルからそれをトリガーしないのですか?
カイザー14年

いいね!しかし、wp cliからすべてのcronタスクを実行する方法は?このコマンドは表示されません。
コーリャ愛のプラハKorobochkin

質問の最後に示したとおりですか?
カイザー14年

回答:


13

最良の方法はWP-CLIを使用することだと思いますが、これを行うにはbashスクリプトを書く必要があります。これはあなたのためにそれを行うべきものです:

WP_PATH="/path/to/wp"
for SITE_URL in = $(wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}')
do
    for EVENT_HOOK in $(wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_PATH" | grep \"now\"$ | awk -F ',' '{print $1}')
    do
        wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_PATH"
    done
done

次に、このスクリプトをcrontabに追加し、必要に応じて1分ごとに実行する必要があります。


ご意見ありがとうございますが、これはハッキーな(汚い)ソリューションだと思います。必要なタスクをすべて実行するwpcli用のPHPアドオンを作成する方が良いと思います。WPの機能とそれを実行するためのコードを理解するには、もっと時間が必要です。
コーリャ愛のプラハKorobochkin

4
@KolyaKorobochkin私は同意しません。WP CLIがコマンドラインおよびbashスクリプトで使用されるようになったため、これはまったくハックではありません。
DiverseAndRemote.com

1
wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH- runドキュメントによると、--due-nowフラグを利用する必要があります。これにより、検索と個々のイベント呼び出しが削減されます。参照:wp-cli.org/commands/cron/event/run。いずれにせよ、私は@OmarJackmanと一緒です-彼はコマンドラインを使用してWordPressコマンドラインツールを使用しています。きれいなBashの例の小道具。crontabエントリを表示することにより、この回答を完成させることができます。
jgraup

将来の読者のために、スクリプトは次のようになりますWP_PATH="/path/to/wp"; for SITE_URL in $(wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}'); do wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH"; done
。-パズル

10

で定数を追加した後 wp-config.php

defined('DISABLE_WP_CRON') or define('DISABLE_WP_CRON', true);

WP-CLI

また、config.ymlセットアップが正しく行われていると仮定すると、を--path呼び出すときにフラグを省略できますcron run


wp cron event run --due-now

[<hook>…] 実行する1つ以上のフック。

[--due-now] 今すぐすべてのフックを実行します。

[--all] すべてのフックを実行します。


するには、すべての原因cronタスクを実行するために:

function run_crons_due_now_in_order { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL"; done; echo "Done"; }; run_crons_due_now_in_order;

それらを並行して実行したい場合(最初に非サイト固有のcronを実行):

function run_all_crons_due_now { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL" & done; wait $(jobs -p); echo "Done"; }; run_all_crons_due_now;

いずれかのオプションを実行可能ファイルに入れたいでしょう

chmod +x run_all_wp_cron_events_due_now.sh

crontabタスクを追加します

crontab -e

おそらく毎分実行する

* * * * * run_all_wp_cron_events_due_now.sh > /dev/null

cronからカスタムコマンドを実行する場合は、wp-cliが機能するためのフルパスを指定する必要があります。

* * * * * cd /home/username/public_html; /usr/local/bin/php /home/username/wp-cli.phar your-custom-cron-commands run >/dev/null 2>&1

PHP

ここでWordPressをロードする必要がある唯一の理由は、事前定義されたリストを使用するのではなく、データベースからURLを収集することです。これらのURLにpingを実行するだけで、応答が何であるかはあまり気にしません。

custom-cron.php

<?php

// Load WP
require_once( dirname( __FILE__ ) . '/wp-load.php' );

// Check Version
global $wp_version;
$gt_4_6 = version_compare( $wp_version, '4.6.0', '>=' );

// Get Blogs
$args  = array( 'archived' => 0, 'deleted' => 0, 'public' => 1 );
$blogs = $gt_4_6 ? get_sites( $args ) : @wp_get_sites( $args ); // >= 4.6

// Run Cron on each blog
echo "Running Crons: " . PHP_EOL;
$agent = 'WordPress/' . $wp_version . '; ' . home_url();
$time  = time();

foreach ( $blogs as $blog ) {
    $domain  = $gt_4_6 ? $blog->domain : $blog['domain'];
    $path    = $gt_4_6 ? $blog->path : $blog['path'];
    $command = "http://" . $domain . ( $path ? $path : '/' ) . 'wp-cron.php?doing_wp_cron=' . $time . '&ver=' . $wp_version;

    $ch = curl_init( $command );
    $rc = curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
    $rc = curl_exec( $ch );
    curl_close( $ch );

    print_r( $rc );
    print_r( "\t✔ " . $command . PHP_EOL );
}

そしてcustom-cron.php、crontabであなたに単一の呼び出しを追加します

* * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron

1

少ないbashで簡単なワンライナー:

wp site list --field=url | xargs -i -n1 wp cron event run --due-now --url="{}"

手動で実行するか、スクリプトに入れて他の回答のようにcronから呼び出すことができます。


0

これは私の解決策です:

global $multisite_hosts;
$multisite_hosts = Array('xxxx.dev.xxx.oondeo.es','x2.dev.xxx.oondeo.es','x3.dev.xxx.oondeo.es');

function run_cron(){
  global $multisite_hosts;
  $host=array_pop($multisite_hosts);
  if (!$host)
    return;
  register_shutdown_function('shutdown');
  if (!isset($_SERVER['HTTP_HOST'])) {
       $_SERVER['HTTP_HOST'] = $host;  // replace with primary host
  }

  require './wp-cron.php';
}

function shutdown()
{
  run_cron();
}
run_cron();

これをcrontabから呼び出します。


-5

何よりもまず「wp-cron.phpを正しい方法で実行する」という意味を説明する必要があると思います。Wordpressによると、wp-cronを無効にして実行することは意味がありません... Linuxの観点からは、wget-ingまたは/ bin / php-ing wp-cron.phpは正しいでしょうが、あなたの特定のホストがセキュリティ上の理由でPHPの呼び出し回数を制限しているようです?-その部分はあなたの説明から完全に明確ではありません。

別の質問:「1トン」のメールはいくつですか?あまりにも多くの電子メールをすぐに送信しようとしない方がよい大きな理由があります。

目標を再考する必要があるかもしれません。

(返信する代わりにコメントしますが、wpstackの評判が十分ではありません。)


3
WordPress cronを実行する方法は複数あります。組み込みのメカニズムはページビューによってトリガーされますDISABLE_WP_CRON。代わりに、より信頼性の高いシステムcronメソッドをセットアップするときに、このメソッドを無効に設定するのが一般的です。
マーカスダウニング

質問がない理由理由は意味があるが、場合/それを行うにはどのように正しくマルチサイトインストールでのwp-cron.phpを呼び出すこと。私にとっては非常に明確です;)
フィリップ

1
非常に古く、すでに隠された答えについてコメントしていることに気づいていただければ幸いです。
ホルヘ・オルピネル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.