web-dev-qa-db-fra.com

Comment utiliser wp_schedule_event dans une classe?

C'est la première fois que j'essaie la méthode d'écriture d'une application OOP. Je ne le comprends pas encore. Actuellement, j'ai ce crochet:

if( !wp_next_scheduled( 'my_cron_hook' ) ) {
    //schedule the event to run daily
    wp_schedule_event( current_time( 'timestamp' ), 'daily', 'my_cron_hook' );
}
add_action('my_cron_hook',array($this,'do_daily_job'));

Il semble que la variable if ne puisse pas être utilisée directement dans une classe. Dois-je mettre tout le code ci-dessus dans la fonction __construct()?

En outre, j'ai trouvé cela dans WordPress wp_schedule_eventdocumentation .

function my_activation() {
    if ( !wp_next_scheduled( 'my_hourly_event' ) ) {
        wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'my_hourly_event');
    }
}
add_action('wp', 'my_activation');

Quelle est la dose 'crochet wp' ici? Je n'ai jamais vu cela dans l'API hook. Dois-je envelopper mon code cron (ci-dessus) dans une fonction et mettre cette action 'wp' dans la fonction __construct(), comme ceci?

function __construct() {
    add_action('wp', array($this,'my_activation'));
}

function my_activation() {
    if( !wp_next_scheduled( 'my_cron_hook' ) ) {
        //schedule the event to run daily
        wp_schedule_event( current_time( 'timestamp' ), 'daily', 'my_cron_hook' );
    }
    add_action('my_cron_hook',array($this,'do_daily_job'));
}   
6
dev-jim

Ajoutez une action en dehors de votre définition de classe:

add_action('my_unique_plugin_event_hook', array($this,'hook'));

Et utilisez ensuite ceci dans votre événement:

wp_schedule_event(time(), 'daily', 'my_unique_plugin_event_hook');
2
Jonathan

Vous pouvez créer une fonction dans votre classe et appeler le hook dans votre constructeur. Le code ci-dessous est similaire à ce que vous avez montré. Si vous créez cela dans un plugin, vous pouvez instancier votre classe lors de l'activation et créer votre travail cron. En plus du code ci-dessous, voici un bon lien sur les tâches Cron dans PHP Gestion des tâches Cron dans PHP

class My_Class {
function __construct() {
    //Register ajax scripts
    add_action( 'admin_enqueue_scripts', array( $this, 'register_ajax_scripts' ) );
}

/**
 * Registers and enqueues admin-specific JavaScript.
 */    
public function register_ajax_scripts() {    
    wp_enqueue_script ('test-ajax' , plugins_url( 'myPlugin/test-ajax.js' ));
}
1
i-4Web
  • PHP générera une erreur de syntaxe si vous essayez de placer une instruction if directement dans une classe. Seules les déclarations de variable (par exemple, public $foo) et les fonctions (par exemple, function bar(){ /*stuff*/}) peuvent se situer entre ces accolades.

  • Il est tout à fait correct de définir le travail à partir d'un constructeur de classe - ou de toute autre fonction de la classe. Assurez-vous simplement que vous instanciez réellement la classe (et appelez la fonction nécessaire, si ce n'est pas dans le constructeur) à temps pour que le hook soit ajouté.

  • Pour résumer, WP est un hook qui se déclenche lorsque tout est chargé, tous les posts récupérés, etc., mais avant que les modèles ne soient chargés.

Certains diront que la meilleure façon d’enregistrer un travail cron est de l’attacher à un activation hook . C'est un hook qui n'est déclenché que lorsque le plugin est activé pour la première fois. Sinon, vous courez le risque d’enregistrer plusieurs fois le même travail, ce qui présente des inconvénients évidents. C’est à cela que sert le code du codex que vous incluez - pour vérifier qu’il n’a pas déjà été programmé. C'est une façon de le faire, en est une autre.

Avant que la classe principale ne commence (par exemple dans votre fichier plugin.php de base avec les informations d'en-tête en haut), votre code devrait ressembler à quelque chose comme:

register_activation_hook( __FILE__, '62565_activate');

function 62565_activate() {
     wp_schedule_event( current_time( 'timestamp' ), 'daily', 'my_cron_hook' );
}

Évidemment, si vous désactivez et réactivez le plug-in, cela peut causer des problèmes.

0
djb