web-dev-qa-db-fra.com

WP CRON ne court que la première fois

Voici mon code

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

La méta de l'utilisateur doit être mise à jour toutes les 5 secondes après l'actualisation de la page. Mais le cron ne fonctionne que la première fois

3
johnson

OK, alors j'ai testé votre code et je suis sûr qu'il ne peut pas fonctionner même une fois ... Et voici pourquoi ...

Si vous regardez wp_schedule_event vous verrez cette vérification en haut de la fonction:

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

Cela signifie que vous ne pouvez pas planifier d'événement avec une récurrence inconnue.

Revenons donc à votre code ... Ce qu'il fait est:

  • ajoute votre récurrence personnalisée (en utilisant cron_schedules hook),
  • planifie un événement avec cette récurrence lors de l'activation du plugin.

Tout va bien, non? Eh bien non, ce n'est pas le cas.

Le crochet d'activation est activé lors de l'activation du plug-in. Donc, ce plugin ne fonctionne pas avant l'exécution de l'activation. Donc, votre récurrence personnalisée n'est pas enregistrée. Alors ... votre crochet n'est pas prévu. J'ai testé cela et le résultat de wp_schedule_event dans votre hook d'activation est faux, donc l'événement n'est pas planifié.

Alors que faire?

Simple - ne planifiez pas votre événement sur le crochet d'activation si vous souhaitez utiliser la récurrence personnalisée.

Alors, voici votre code plus sûr:

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 (mais cela peut être important) Il y a encore une faille dans votre code, mais c'est peut-être juste à cause de certaines modifications avant de poster ici ...

Vous ne pourrez pas vérifier si votre cron ne tourne qu'une ou plusieurs fois. Votre action d'événement met à jour la méta de l'utilisateur. Mais la nouvelle valeur définie est toujours égale à 91. Et puisque vous utilisez update_user_meta, une seule méta de ce type sera stockée dans la base de données.

0
Krzysiek Dróżdż

En supposant que votre code ci-dessus soit correct (je ne l'ai pas testé), il est important de noter que wp-cron ne s'exécutera que si quelqu'un visite le site. Il ne s'exécutera donc pas toutes les 5 secondes en arrière-plan, comme vous le pensez peut-être.

En guise de solution de contournement, vous pouvez désactiver wp-cron, puis implémenter un vrai travail cron.

Voici un bon article sur ce sujet.

EDIT: essayez de l'ajouter comme ça

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