web-dev-qa-db-fra.com

add_action à wp cron?

J'aimerais exécuter du code à chaque fois que mon wordpress cron s'exécute, quel que soit le laps de temps. Est-il possible de créer un add_action pour cela? J'ai regardé dans la liste de filtres mais je n'ai rien trouvé de pertinent.

Merci!

2
FLX

Fondamentalement, chaque chargement de page cherche à savoir s’il est programmé de s’exécuter, ainsi, le cron est vérifié et peut éventuellement s’exécuter à chaque chargement de page.

Je ne peux que présumer que vous voulez programmer quelque chose à courir de temps en temps. Si c'est le cas, vous devez regarder wp_schedule_event ()

Voici le code pour obtenir du code à exécuter chaque heure:

add_action('my_hourly_event', 'do_this_hourly');

// The action will trigger when someone visits your WordPress site
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');

function do_this_hourly() {
    // do something every hour
}

Si vous souhaitez utiliser votre propre code lorsque le programme de quelqu'un d'autre a été exécuté, vous devez vous associer à l'action déclenchée. Prenons donc le code ci-dessus est le plug-in de quelqu'un d'autre et vous voulez lancer votre code chaque fois que le leur est exécuté.

Eh bien, ils ont créé une action comme celle-ci:

add_action('my_hourly_event', 'do_this_hourly');

tout ce que vous avez à faire, c'est d'ajouter votre fonction à ceci:

add_action('my_hourly_event', 'my_flush_function');
function my_flush_function() {
    // Do your code here
}
4
Brady

Après cette remarque du PO:

Pour être plus clair, j’ai planifié des publications à l’avenir et je souhaite que le cache soit effacé lorsqu’elles sont publiées via le déclencheur wp-cron. Il pourrait y avoir une meilleure façon?

Je ne sais passi le plug-in W3 Total Cache ne vide pas automatiquement le cache lorsque les publications sont publiées. Je croyais que oui. Si ce n'est pas le cas - dans ce cas, je m'accroche au point de post-transition ( voir la question connexe ), puis vide le cache. De cette façon, chaque fois qu'une publication change le statut (via wp-cron ou autre) - le cache est mis à jour pour refléter cela.

 //Runs whenever a post changes status
 add_action('transition_post_status','wpse49927_transition_post_status',10,3);
 function wpse49927_transition_post_status($new_status,$old_status,$post){
     //Flush cache
     flush_pgcache();
 }

Problème d'origine

En réponse à la question initiale:lancer une fonction à chaque lancement de wp-cron- je ne pense pas que ce soit possible par programmation - et la solution proposée par @Brady est probablement la plus proche qui soit '. Je vais faire ça.

4
Stephen Harris

Pour supprimer le cache de page uniquement lorsqu'un futur message planifié change réellement son statut de publication, le hook 'publish_future_post' est recommandé. Ajoutez l'extrait de code à votre functions.php.

N'utilisez pas non plus hook 'transition_post_status' qui est exécuté. Mon débogage a montré que parfois la classe "W3_PgCacheFlush" nécessaire du plugin W3TC ne peut pas être instanciée avec ce hook.

/**
 * This function clears the complete W3TC cache when a future post is published.
 * jot 11.09.12
 */
add_action('publish_future_post', 'wpse_49927_clear_w3tc_cache_on_future_to_publish');

function wpse_49927_clear_w3tc_cache_on_future_to_publish( $post_id) {
  if (function_exists('w3_instance') && class_exists('W3_PgCacheFlush')) {
    $w3_pgcache = & w3_instance('W3_PgCacheFlush');
    if (is_object($w3_pgcache) && method_exists($w3_pgcache, 'flush')) {
      $w3_pgcache->flush();
    }
  }
}
1
jot

J'ai récemment eu à faire la même chose avec le cache total w3, voici comment je l'ai implémenté (simplifié pour répondre à la question OP)

<?php
/**
* fac_all_crons allows you to attach a function to all wp-cron's registered in a WordPress site
* @author Russell Fair
* @uses wp_get_schedules to get a list of registered crons
*/
function fac_all_crons(){

    $schedules = wp_get_schedules();

    if ( !$schedules )
        return;

    foreach ( $schedules as $key ){

        if ( ! wp_next_scheduled( 'fac_cache_clear' ) ) {
            wp_schedule_event( time(), $key, 'fac_cache_clear' );
        }

    }

}
add_filter('init', 'fac_all_crons');

/**
* fac_cache_clear does the actual cache clearing
* @author Russell Fair
*/
function fac_cache_clear(){

    //do your cache clearing here


}
1
rfair404

Pour quelqu'un qui arrive ici, il y a un moyen d'exécuter du code chaque fois que l'URL cron est appelée et cela peut être fait simplement avec le code suivant:

add_action( 'init', 'my_function_on_each_cron_call' );
function my_function_on_each_cron_call() {
    if ( isset( $_GET[ 'doing_wp_cron' ] ) && $_SERVER['REQUEST_URI'] == '/wp-cron.php?doing_wp_cron' ) {
        // YOUR CODE GOES HERE
    }
}

Where $ _SERVER ['REQUEST_URI'] peut probablement être omis mais n'est pas dangereux.

0
Mauro Mascia