web-dev-qa-db-fra.com

Horaire cron ne fonctionne pas

J'essaie de créer un travail cron. Il semble que la fonction le_schedule soit exécutée, mais pas la fonction le_do_this. J'ai aussi essayé des plugins cronjob, certains disent qu'il fonctionne, d'autres échouent.

Dans ce cas, il essaiera d'obtenir un fichier et de l'enregistrer, mais ce ne sera pas le cas. Pourquoi ça ne marche pas?

add_action( 'wp', 'le_schedule' );
add_action( 'le_event', 'le_do_this' );

function le_schedule() {
    if ( ! wp_next_scheduled( 'le_event' ) ) {
        wp_schedule_event( time(), 'daily', 'le_event');
    }
}

function le_do_this() {
    $response = wp_remote_get('http://www.example.com/file.txt');
    if( ! is_wp_error( $response ) ) {
        $body = wp_remote_retrieve_body($response);
        if( ! empty( $body ) ) {
            $put = get_template_directory() . '/cache/cache.txt';
            file_put_contents( $put, $body );
        }
    }
}

wp_clear_scheduled_hook( 'le_event' );
wp_clear_scheduled_hook( 'le_do_this' );

J'efface le programme pour pouvoir fonctionner à chaque nouvelle charge.

1
Jens Törnell

Vous ne devez pas appeler wp_clear_scheduled_hook à chaque chargement de page, car vous redémarrez toujours votre shcedule wp-cron avec votre configuration actuelle.

De plus cet appel:

wp_clear_scheduled_hook( 'le_do_this' );

ne fait aucune différence, puisque le_do_this n'est pas un nom de crochet dans votre configuration.

Vous pouvez essayer par exemple ce plugin de test:

<?php
/**
 * Plugin Name: Daily WP-Cron
 * Description: Call the my_daily_cron_script() function daily, if it exists.
 */

add_action( 'mydailyevent', function()
{
    // Our script:
    if( function_exists( 'my_daily_cron_script' ) )
        my_daily_cron_script();
});

register_activation_hook( __FILE__, function()            
{ 
    // Start the cron job:
    wp_schedule_event( time(), 'daily', 'mydailyevent' );
});

register_deactivation_hook( __FILE__, function()
{
    // Stop the cron job:
    wp_clear_scheduled_hook( 'mydailyevent' );
});

où vous devez définir la fonction my_daily_cron_script() en fonction de vos besoins.

Il y a un avertissement dans le Codex sur wp_schedule_event :

Le nom d'un crochet d'action à exécuter. Pour une raison quelconque, il semble y avoir un problème sur certains systèmes où le hook ne doit pas contenir de caractères de soulignement ou de majuscule.

utilisons donc mydailyevent comme nom de hook au lieu de my_daily_event, juste au cas où.

2
birgire