web-dev-qa-db-fra.com

WP Cron job tous les 1er et 15 du mois

Essayer de configurer des planifications personnalisées pour WP Cron, sachant qu'ils utilisent un intervalle, est-il même possible de configurer une tâche cron pour chaque premier du mois? Ainsi que tous les quinze ans. Voici ce que j'ai jusqu'à présent:

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 fonctionne sur des intervalles et il n'y a pas d'intervalle qui atteindra exactement le premier jour et le 15 de chaque mois.

Vous pouvez exécuter votre travail wp-cron tous les jours et vérifier la date semblable à celle-ci , mais avec un simple rappel tel que:

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

Ou, utilisez wp_schedule_single_event avec un rappel plus compliqué. Quelque chose comme ça:

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

À peine Complètement non testé. Peut-être un buggy. Caveat emptor . Pas de remboursement.

2
s_ha_dum

J'ai rencontré un problème similaire, mais je devais organiser un événement le dernier jour du mois. J'ai imaginé une solution alternative qui fonctionnerait pour ceci et mon problème. Au lieu de modifier les horaires, j'ai utilisé l'horaire quotidien pour simplement déclencher mes actions mensuelles si nécessaire.

J'ai d'abord ajouté un code comme celui-ci à l'activation de mon plugin pour configurer la vérification quotidienne

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

Ensuite, j'ai ajouté un travail à exécuter quotidiennement pour voir s'il fallait lancer le cron mensuel.

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

Pour que cela se déclenche le 1er et le 15, vous pouvez simplement ajuster le code ci-dessus à quelque chose comme ceci:

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

Ensuite, vous pouvez simplement utiliser l'action "Monthly_cron" pour effectuer vos actions comme ceci:

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