web-dev-qa-db-ja.com

WP スケジュールイベント - 最初の訪問者が来る毎日

私は毎日のwpスケジュールイベントを持っています。

ユーザーがサイトにアクセスしたとき、およびスケジュール時間が経過したときに起こることを私は知っています。

私が今日の午前12時にそれを始めたなら、そして明日最初の訪問者が明日午前1時20分に来るならば、そのイベントは明日午後1時20分に起こります。

毎日、午前1.20以降または午前12時以降に発生しますか。

3
Sugantha

wp-cron は厳密なスケジュールで実行されないため、しばしば擬似cronと呼ばれます。誰もそのサイトを訪れなければ、それは実行されません。 wp-cronイベントを12時間ごとに実行するようにスケジュールした場合、 多くても 12時間ごとに実行されます。ただし、サイトのトラフィックが非常に少ない場合は、実行に12時間以上かかることがあります。

12時間ごと、または毎日同じ時間にイベントを開催する必要がある場合は、WordPress以外で使用する必要があります。そのための一般的な方法としては、システムタスクスケジューラ(Linuxでは、これは通常「cron」と呼ばれます)またはEasyCronのようなサードパーティのサービスを使用することがあります。

Linuxサーバ(はるかに一般的なホスティング環境)にいると仮定して、このような小さなシェルスクリプトを作成します。

#!/bin/bash
curl http://yoursite.name.com/wp-cron.php >/dev/null

これはあなたのサイトのwp-cron.phpページをロードするために "curl"コマンドを実行し、そして直ちに(/ dev/nullに出力をダンプすることによって)結果を無視するでしょう。あなたはページが持っているかもしれない少しの出力についても気にしません、そして実際には通常少しの出力もありません。あなたはただページがロードされていることを確認したいだけです。

それから、crontabに次のような行を追加します( "crontab -e"はデフォルトのエディタ、おそらく vi でcrontabファイルを開きます)。

0 0,12 * * *             /home/user/touch-site.sh

(明らかに、スクリプトを置く場所にファイルの場所を変更してください。また、 "chmod 700 touch-site.sh"を実行してスクリプトが実行可能であることを確認してください。)

この例では、毎日、正午と真夜中(サーバー時間)にサイトにアクセスし、wp-cronスクリプトを実行します。このファイルのしくみの詳細については、 "man crontab"を実行してください。

2
David E. Smith

この質問に答えるには

@sumitよろしいですか。私の友人の一人は、今日それが翌日の午後1時20分に起こるのであれば、午前12時ではなく午後12時の後に起こると言いました

どのように動くのか:

  1. 現在のタイムスタンプ、つまり月曜日の午前12:00を使用してイベントをスケジュールします。

    wp_schedule_event(time(), 'daily', 'my_schedule_hook');
    
  2. 誰かが月曜日の午前1時20分にこのサイトにアクセスしました。

WPはこのコードを呼び出す

    if ( $schedule != false ) {
            $new_args = array($timestamp, $schedule, $hook, $v['args']);
            call_user_func_array('wp_reschedule_event', $new_args);
    }

    wp_unschedule_event( $timestamp, $hook, $v['args'] );

   /**
    * Fires scheduled events.
    *
    * @ignore
    * @since 2.1.0
    *
    * @param string $hook Name of the hook that was scheduled to be fired.
    * @param array  $args The arguments to be passed to the hook.
    */
    do_action_ref_array( $hook, $v['args'] );

ここでは、同じタイムスタンプを使用するwp_reschedule_event()関数を呼び出しているので、次のスケジュールは火曜日の12:00 AMではなく1:20 AMになります。それから、スケジュールアクションフックを呼び出します。

  1. よくある間違いは、functions.phpで直接wp_schedule_event()を呼び出すので、新しいタイムスタンプごとにWPイベントをスケジュールすることです。正しい方法は、スケジュールがあるかどうかを確認してから作成することです。

    $my_schedule_hook = wp_next_scheduled('my_schedule_hook');
    if (!$my_schedule_hook) {
        wp_schedule_event(time(), 'daily', 'my_schedule_hook');
    }
    

したがって、スケジュールがまったくないときに初めてifブロック内に入るだけです。それでも、あなたはこのプラグインですべてのスケジュールを見ることができます WP Crontrol

0
Sumit