wake-up-neo.net

WP Cron-Job jeden 1. und 15. des Monats

Wenn Sie versuchen, benutzerdefinierte Zeitpläne für WP Cron einzurichten, wissen Sie, dass sie ein Intervall verwenden, ist es überhaupt möglich, einen Cron-Job für jeden Ersten des Monats einzurichten? Sowie jeder fünfzehnte. Das habe ich bisher:

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 arbeitet in Intervallen und es gibt kein Intervall, das genau den ersten Tag und den 15. jedes Monats trifft.

Sie könnten Ihren wp-cron -Job jeden Tag ausführen und das Datum überprüfen, ähnlich wie hier , aber mit einem einfachen Rückruf wie:

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

Oder verwenden Sie wp_schedule_single_event mit einem komplizierteren Rückruf. Etwas wie das:

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;
    }
  }
}

Kaum Völlig ungetestet. Möglicherweise fehlerhaft.Vorbehalt. Keine Rückerstattung.

2
s_ha_dum

Ich bin auf ein ähnliches Problem gestoßen, musste aber am letzten Tag des Monats ein Ereignis auslösen. Ich fand eine alternative Lösung, die für dieses und mein Problem funktionieren würde. Anstatt die Zeitpläne zu ändern, habe ich den täglichen Zeitplan verwendet, um bei Bedarf einfach meine monatlichen Aktionen auszulösen.

Zuerst habe ich meiner Plugin-Aktivierung Code wie diesen hinzugefügt, um die tägliche Überprüfung einzurichten

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' );

Dann habe ich einen Job hinzugefügt, der täglich ausgeführt werden soll, um festzustellen, ob der monatliche Cron ausgelöst werden muss

// 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' );

Um dies so anzupassen, dass es am 1. und 15. ausgelöst wird, können Sie den obigen Code einfach so anpassen:

// 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' );

Dann können Sie einfach die Aktion "month_cron" verwenden, um Ihre Aktionen wie folgt auszuführen:

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