web-dev-qa-db-ja.com

WP 毎月1日と15日にCronジョブ

WP Cronのカスタムスケジュールを設定しようとしていますが、間隔を使用することを知っているため、毎月1日ごとにcronジョブを設定することさえ可能ですか? 15回ごと。これは私がこれまでに持っているものです:

private function cron_schedules( $schedules ) {

    $midnight = strtotime( "midnight", current_time( 'timestamp' ) );
    $first = strtotime( 'first day of this month', $midnight );
    $fifteenth = $first + (7 * 24 * 60 * 60) * 2;

    $schedules['1st'] = array(
        'interval'  => $first,
        'display'   => __('1st of every month'),
    );

    $schedules['15th'] = array(
        'interval'  => $fifteenth,
        'display'   => __('15th of every month'),
    );

    $schedules['weekly'] = array(
        'interval'  => ( 7 * 24 * 60 * 60 ),
        'display'   => __('Weekly'),
    );

    $schedules['biweekly'] = array(
        'interval'  => ( 7 * 24 * 60 * 60 ) * 2,
        'display'   => __('Biweekly'),
    );

    return $schedules;

}
1
souporserious

wp_cronはインターバルで動作し、毎月1日と15日に正確に当たるようなインターバルはありません。

wp-cronジョブを毎日実行して日付をチェックすることができます。 これと似ています が、次のような単純なコールバックを使用します。

cron_callback_wpse_113675() {
  $date = date('d');
  if ('01' == $date || '15' == $date) {
    // run your function
  }
}

あるいは、 wp_schedule_single_event を使用して、より複雑なコールバックを行います。このようなもの:

function cron_callback_v2_wpse_113675() {
  $date = date('d');
  if (!wp_next_scheduled(cron_callback_v2_wpse_113675)) {
    $date = ($date < 15) ? '15' : '01';
  }
  if ('01' == $date || '15' == $date) {
    // run your function
    switch ($date) {
      case '01' :
        wp_schedule_single_event( strtotime('+14 days',strtotime('first day of')), 'cron_callback_v2_wpse_113675' );
      break;
      case '15' :
        wp_schedule_single_event( strtotime('first day of'), 'cron_callback_v2_wpse_113675' );
      break;
    }
  }
}

かろうじて 全くテストされていません。おそらくバグがあります。 警告emptor。返金なし。

2
s_ha_dum

私は同様の問題に遭遇しましたが、月の最後の日にイベントを起こす必要がありました。私はこれと私の問題のために働くだろう代替解決策を考え出した。スケジュールを変更するのではなく、必要に応じて毎日のスケジュールを使用して単純に毎月の行動を起こしました。

最初に毎日のチェックを設定するために私のプラグインのアクティベーションにこのようなコードを追加しました

function my_activation(){
    // Set the cron job for the monthly cron
    if( ! wp_next_scheduled ( 'maybe_monthly_cron' ) ) {
        // This will trigger an action that will fire the "monthly_cron" action on the last day of each month at 4:00 am UTC
        wp_schedule_event( strtotime('04:00:00'), 'daily', 'maybe_monthly_cron');
    }
}
register_activation_hook( __FILE__, 'my_activation' );

それから私はそれが毎月のクーロンを発射する必要があるかどうかを確認するために毎日実行するジョブを追加しました

// Check if we need to fire the monthly cron action "monthly_cron"
function maybe_run_monthly_cron(){
    $now = strtotime();
    $this_day = date( 'j', $now );
    $days_this_month = date( 't', $now );
    if( $this_day == $days_this_month ){
        do_action( 'monthly_cron' );
    }
}
add_action( 'maybe_monthly_cron', 'maybe_run_monthly_cron' );

1日と15日に発火するようにこれを調整するには、上記のコードを次のように調整します。

// Check if we need to fire the monthly cron action "monthly_cron"
function maybe_run_monthly_cron(){
    $now = strtotime();
    $this_day = date( 'j', $now );
    if( in_array( $this_day, array( 1, 15 ) ) ){
        do_action( 'monthly_cron' );
    }
}
add_action( 'maybe_monthly_cron', 'maybe_run_monthly_cron' );

それからあなたはこのようなあなたの行動を実行するために単に "毎月のクーロン"行動を使うことができます:

function my_monthly_cron(){
    // Execute monthly or bimonthly code here...
}
add_action( 'monthly_cron', 'my_monthly_cron' );
1
Aaron