web-dev-qa-db-fra.com

Courir WP Cron Weekly (mais un certain jour)

Je cherche un complément un peu plus spécifique aux intervalles de cron WP. Pour ajouter un intervalle "hebdomadaire", j'ai procédé comme suit:

function re_not_add_weekly( $schedules ) {
    $schedules['weekly'] = array(
        'interval' => 604800, //that's how many seconds in a week, for the unix timestamp
        'display' => __('weekly')
    );
    return $schedules;
}
add_filter('cron_schedules', 're_not_add_weekly');

Ce qui fonctionne bien, mais - la sauce supplémentaire ici permet à ce cron de fonctionner un jour donné:

if( !wp_next_scheduled( 're_not_mail' ) ) {
    wp_schedule_event( time(), 'weekly', 're_not_mail' );
}

N'importe qui a une idée de la meilleure façon d'accomplir cela en utilisant WP Cron (en supposant que ce n'est pas par un site spécifique que nous aurons le contrôle sur leur zone cPanel/CRON). Merci!

Mettre à jour

Aller à cette force et trouvé un article qui peut avoir clarifié les choses un peu plus, mais ne répond pas exactement à ma question. L’essentiel de cet article indique que le WP Cron n’est pas aussi flexible (au-delà des paramètres "horaire, quotidien, hebdomadaire"), il est donc étendu à quelque chose comme hebdomadaire un jour donné semble un peu tiré par les cheveux.

Le problème (appelant un problème de confusion/frustration) que j'ai avec cela est -> bien sûr, je pourrais désactiver WP CRON et faire en sorte que WP CRON s'exécute une fois par semaine à l'aide du serveur. CRON, MAIS, cela signifie également que les éléments qui sont normalement exécutés, tels que les mises à jour de plugin/thème, les suppressions de post/publications basées sur CRON sont mis en attente pendant une semaine (si je voulais que CRON soit exécuté une fois par semaine tous les lundis pendant une semaine). Exemple).

Il faudrait que je suppose que d'autres personnes ont eu connaissance de cela, alors un aperçu de cette information serait d'une grande aide. Merci!

5
Zach

WP-Cron n'est pas conçu pour être aussi précis et ne doit pas être utilisé si vous devez programmer des événements à des heures précises. WP-Cron est un mécanisme de planification "au mieux" et il ne peut pas garantir le temps d'exécution, contrairement à un système cron réel.

Si vous avez besoin de précision de cette nature, la seule vraie solution est de ne pas utiliser WP-Cron pour cela. Ce n'est pas conçu pour cela, et il ne peut pas le faire. Tout code hacky que vous essayez d’ajouter pour le rendre capable de résoudre ce problème ne résoudra pas le problème sous-jacent.

Utilisez un vrai système cron.

2
Otto

Si vous avez d'importants travaux WP cron sur une planification, vous devez bien sûr exécuter un travail système qui appelle régulièrement WP cron pour que les éléments soient toujours déclenchés lorsque vous en avez besoin.

Si vous avez besoin d'une heure/date spécifique pour vos exécutions WP cron, vous pouvez toujours planifier un seul événement et demander à la méthode appelée de planifier l'événement suivant.

Exemple simple:

function some_awesome_hook() {
    // Do stuff here

    // Run next Monday
    $next_run = strtotime('next monday');

    // Clear hook, just in case
    wp_clear_scheduled_hook('some_awesome_hook');

    // Add our event
    wp_schedule_single_event($next_run, 'some_awesome_hook');
}

// Run next Monday
$first_run = strtotime('next monday');

// Add our event
wp_schedule_single_event($first_run, 'some_awesome_hook');

Style POO:

class My_Sweet_Plugin {

    public $cron_hook;

    public function __construct() {
        // Store our cron hook name
        $this->cron_hook = 'my_awesome_cron_hook';

        // Install cron!
        $this->setup_cron();

        // Add action that points to class method
        add_action($this->cron_hook, array($this, 'my_awesome_function'));
    }

    public function setup_cron() {
        // Clear existing hooks
        wp_clear_scheduled_hook($this->cron_hook);

        // Next run time
        $next_run = strtotime('next monday');

        // Add single event
        wp_schedule_single_event($first_run, $this->cron_hook);
    }

    public function my_awesome_function() {
        // Do stuff!

        // Setup our next run
        $this->setup_cron();
    }
}
1
Michael Thompson

Selon Codex, vous pouvez utiliser wp_get_schedules pour ajouter une option comme Weekly (ce que vous avez déjà fait).

WP-Cron n'était pas destiné à avoir toutes les fonctions Cron, alors pourquoi ne pas simplement vous connecter au serveur et créer un travail cron pour appeler votre fichier PHP uniquement lundi et ajouter quelque chose comme ceci à votre crontab

* 07 * * Mon root cmd

0
Damien