web-dev-qa-db-ja.com

WP CRONは初回のみ実行されます

これが私のコードです

function cron_add_weekly( $schedules ) {

   $schedules['seconds'] = array(
       'interval' => 5,
       'display' => __( '5 Seconds' )
   );
   return $schedules;
 }

add_filter( 'cron_schedules', 'cron_add_weekly' );

register_activation_hook(__FILE__, 'my_activation');
function my_activation() {
    if ( ! wp_next_scheduled( 'my_hook' ) ) {
    wp_schedule_event( time(), 'seconds', 'my_hook' );
    }

}
add_action( 'my_hook', 'my_exec' );

register_deactivation_hook(__FILE__, 'my_deactivation');
    function my_deactivation() {
        wp_clear_scheduled_hook('my_hook');
    }

function my_exec() {
    $value = 91;
    update_user_meta($value + 1, 'from_cron', 'updated');
}

ユーザーメタはページを更新した後5秒ごとに更新されるべきです。しかし、クーロンは初めて走るだけです

3
johnson

それで、私はあなたのコードをテストしました、そして、それが一度も実行されることができないと確信しています...そして、これが理由です...

wp_schedule_event を見ると、関数の先頭にこのチェックがあります。

if ( !isset( $schedules[$recurrence] ) )
    return false;

それはあなたが未知の再発でイベントを予定することができないことを意味します。

それでは、あなたのコードに戻りましょう。

  • カスタムの繰り返しを追加します(cron_schedulesフックを使用)。
  • プラグインのアクティブ化中に、その繰り返しでイベントをスケジュールします。

すべてが良さそうですね。ええ、いいえ、そうではありません。

アクティベーションフックはプラグインのアクティベーション中に発生します。そのため、アクティブ化が実行される前にプラグインは機能しません。だからあなたのカスタム繰り返しは登録されていません。だから...あなたのフックは予定されていません。私はそれをテストしました、そしてあなたのアクティベーションフックのwp_schedule_eventの結果は偽です、従ってイベントは予定されていません。

じゃあ何をすればいいの?

シンプル - カスタムの繰り返しを使用したい場合は、アクティベーションフックでイベントをスケジュールしないでください。

安全なコードは次のとおりです。

register_deactivation_hook(__FILE__, 'my_deactivation');
function my_deactivation() {
    wp_clear_scheduled_hook('cron_every_5_seconds');
}

function add_every_5_seconds_cron_schedule( $schedules ) {
    $schedules['every_5_seconds'] = array(
        'interval'  => 5,
        'display'   => __( 'Every 5 Seconds', 'textdomain' )
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'add_every_5_seconds_cron_schedule' );

function schedule_my_cron_events() {
    if ( ! wp_next_scheduled( 'cron_every_5_seconds') ) {
        wp_schedule_event( time(), 'every_5_seconds', 'cron_every_5_seconds' );
    }
}
add_action( 'init', 'schedule_my_cron_events' );

function cron_every_5_seconds_action() {
    $value = 91;
    update_user_meta( $value + 1, 'from_cron', 'updated' );
}
add_action( 'cron_every_5_seconds', 'cron_every_5_seconds_action' );

PS。 (しかしそれは重要かもしれません) あなたのコードにもう一つ欠陥がありますが、多分それはここに投稿する前にいくつかの編集が原因であるに過ぎません...

あなたのcronが一度だけや何度も走っているかどうかをチェックすることはできません。あなたのイベントアクションはユーザーメタを更新します。しかし、設定される新しい値は常に91です。update_user_metaを使用するので、そのようなメタは1つだけDBに格納されます。

0

上記のコードが正しいと仮定して(私はテストしていません)、wp-cronは誰かがそのサイトにアクセスしたときにのみ実行されるので、あなたが考えているようにバックグラウンドで5秒ごとには実行されません。

回避策として、wp-cronを無効にしてから、実際のcronジョブを実装することができます。

これが 良い記事 です。

編集:このように追加してみてください

function cron_every_5_seconds( $schedules ) {
    $schedules['every_5_seconds'] = array(
        'interval'  => 5,
        'display'   => __( 'Every 5 Seconds', 'textdomain' )
    );
    return $schedules;
}

add_filter('cron_schedules', 'cron_every_5_seconds');

if (! wp_next_scheduled( 'cron_every_5_seconds')) {
    wp_schedule_event(time(), 'every_5_seconds', 'cron_every_5_seconds');
}

add_action('cron_every_5_seconds', 'cron_every_5_seconds_action');
    function cron_every_5_seconds_action() {
        $value = 91;
        update_user_meta($value + 1, 'from_cron', 'updated');
    }
?>
1
RiddleMeThis