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
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:
cron_schedules
hook),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é.
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.
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');
}
?>