add_action per wp cron?

23 apr 2012, 12:09:27
Visualizzazioni: 16.3K
Voti: 7

Vorrei eseguire del codice ogni volta che il cron di WordPress viene eseguito, indipendentemente dall'intervallo di tempo. È possibile creare un add_action per questo? Ho cercato nella lista dei filtri ma non ho trovato nulla di rilevante.

Grazie!

3
Commenti

Cosa stai cercando esattamente di ottenere? Non credo che ciò che chiedi sia possibile - ma se sappiamo cosa stai cercando di fare potrebbe esserci un'alternativa...

Stephen Harris Stephen Harris
23 apr 2012 12:19:44

Quello che voglio fare è svuotare la mia cache W3 Total Cache (flush_pgcache()) ogni volta che viene eseguito un cron.

FLX FLX
23 apr 2012 12:32:18

Per essere più chiaro, ho post programmati nel futuro e voglio che la cache venga svuotata quando vengono pubblicati tramite il trigger wp-cron. Potrebbe esserci un modo migliore?

FLX FLX
23 apr 2012 13:02:42
Tutte le risposte alla domanda 5
5

Fondamentalmente, ad ogni caricamento di pagina viene verificato se ci sono operazioni programmate da eseguire, quindi per questa logica il cron viene controllato e può potenzialmente essere eseguito ad ogni caricamento di pagina.

Presumo che tu voglia programmare qualcosa da eseguire periodicamente. Se è questo il caso, devi considerare la funzione wp_schedule_event().

Di seguito è riportato il codice per eseguire un'azione ogni ora:

add_action('my_hourly_event', 'do_this_hourly');

// L'azione verrà attivata quando qualcuno visita il tuo sito WordPress
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() {
    // esegui qualcosa ogni ora
}

Se vuoi attivare il tuo codice quando il cron di qualcun altro viene eseguito, allora devi collegarti alla loro azione che viene attivata. Supponiamo che il codice sopra sia di un plugin di qualcun altro e tu voglia eseguire il tuo codice ogni volta che il loro viene eseguito.

Hanno creato un'azione come questa:

add_action('my_hourly_event', 'do_this_hourly');

quindi tutto ciò che devi fare è agganciare la tua funzione a questa azione:

add_action('my_hourly_event', 'my_flush_function');
function my_flush_function() {
    // Inserisci qui il tuo codice
}
23 apr 2012 12:16:13
Commenti

Grazie per la risposta, ma voglio che si agganci specificamente agli eventi cron esistenti, attivandosi una volta che il cron è stato eseguito. Quello che voglio fare è pulire la mia cache W3 Total Cache (flush_pgcache()) ogni volta che un cron viene eseguito.

FLX FLX
23 apr 2012 12:32:57

OK, aggiornerò la mia domanda per rispondere. Dammi un minuto.

Scott Scott
23 apr 2012 12:38:02

Ah grazie! Per essere più chiaro, ho post programmati nel futuro e voglio che la cache venga pulita quando vengono pubblicati tramite il trigger wp-cron. Forse c'è un modo migliore?

FLX FLX
23 apr 2012 13:02:35

ERRATO: current_time( 'timestamp' ) / CORRETTO: time()

Falselight Falselight
28 giu 2022 23:52:04

Nota che se usi l'hook wp per eseguire funzioni programmate, potrebbe essere troppo tardi per il plugin WP Crontrol. Quel plugin non riesce a elencare il tuo hook per la gestione della schedulazione. Raccomando di usare l'hook wp_loaded invece.

vee vee
25 gen 2023 11:17:17
0

Dopo questa osservazione dell'OP:

Per essere più chiaro, ho post programmati nel futuro e voglio che la cache venga svuotata quando vengono pubblicati tramite il trigger wp-cron. Potrebbe esserci un modo migliore?

Non so se il plugin W3 Total Cache non svuoti automaticamente la cache quando i post vengono pubblicati. Credevo lo facesse. Se non lo fa - allora in questo caso aggancerei l'hook di transizione del post (vedi domanda correlata) e svuoterei la cache in quel momento. In questo modo, ogni volta che un post cambia stato (tramite wp-cron o altro) - la cache viene aggiornata per riflettere questo cambiamento.

 //Eseguito ogni volta che un post cambia stato
 add_action('transition_post_status','wpse49927_transition_post_status',10,3);
 function wpse49927_transition_post_status($new_status,$old_status,$post){
     //Svuota la cache
     flush_pgcache();
 }

Problema Originale

In risposta alla domanda originale: eseguire una funzione ogni volta che wp-cron viene lanciato - non penso sia possibile farlo a livello di codice - e la soluzione fornita da @Brady è probabilmente la più vicina che si possa ottenere per fare questo.

23 apr 2012 13:23:04
1

Recentemente ho dovuto fare la stessa cosa con w3 total cache, ecco come l'ho implementato (semplificato per rispondere alla domanda dell'OP)

<?php
/**
* fac_all_crons ti permette di collegare una funzione a tutti i wp-cron registrati in un sito WordPress
* @author Russell Fair
* @uses wp_get_schedules per ottenere una lista dei cron registrati
*/
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 esegue effettivamente la pulizia della cache
* @author Russell Fair
*/
function fac_cache_clear(){

    //fai qui la pulizia della cache


}
22 ago 2012 19:02:51
Commenti

Per chiarezza, non sono sicuro che questo verrebbe eseguito per OGNI evento, poiché il !wp_next_scheduled() potrebbe essere vero in alcuni casi. Potresti provare a rimuovere il controllo condizionale attorno alla funzione wp_schedule_event().

rfair404 rfair404
22 ago 2012 19:05:13
0

Per cancellare la cache della pagina solo quando un post programmato cambia effettivamente il suo stato in "pubblicato", si consiglia di utilizzare l'hook 'publish_future_post'. Aggiungi questo snippet di codice al tuo file functions.php.

Non utilizzare l'hook 'transition_post_status' che viene eseguito comunque. Il mio debug ha mostrato che a volte la classe necessaria 'W3_PgCacheFlush' del plugin W3TC non può essere istanziata utilizzando questo hook.

/**
 * Questa funzione cancella completamente la cache di W3TC quando un post programmato viene pubblicato.
 * 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();
    }
  }
}
14 set 2012 19:58:40
0

Per chi arriva qui, esiste un modo per eseguire del codice ogni volta che viene chiamato l'URL del cron e può essere fatto semplicemente con il seguente codice:

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' ) {
        // IL TUO CODICE VA QUI
    }
}

Dove $_SERVER['REQUEST_URI'] probabilmente può essere omesso ma non è pericoloso.

28 set 2017 13:45:07