每月1号和15号的WP Cron作业

时间:2013-09-10 作者:souporserious

尝试为WP Cron设置自定义计划,知道它们使用间隔,甚至可以为每个月的第一个月设置Cron作业吗?以及每十五天。这就是我目前的情况:

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;

}

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

wp_cron 按时间间隔运行,没有时间间隔正好在每月的第一天和第15天。

您可以运行wp-cron 每天工作并检查日期,similar to this 但使用以下简单回调:

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;
    }
  }
}
几乎没有经过测试。可能是马车排空警告。不退款。

SO网友:Aaron

我遇到了类似的问题,但需要在当月的最后一天启动一个活动。我想出了一个替代解决方案,可以解决这个问题和我的问题。我没有修改日程安排,而是使用每日日程安排,如果必要的话,只需启动每月的行动。

首先,我在插件激活中添加了这样的代码来设置每日检查

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\' );
然后我添加了一个每日运行的作业,以查看是否需要启动每月cron

// 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号点火(&A);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\' );
然后,您可以使用“monthly\\u cron”操作执行如下操作:

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

结束