qual è il modo corretto di agganciare quando aggiorna post


19

provo ad agganciare quando la posta viene aggiornata ma tutto l'ho provato non ho mai eseguito tranne updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

Ho provato questo, add_action('save_post', 'my_function');ma nessun id è stato echo out, o forse questo messaggio già echo ma non viene mai visualizzato a causa dell'intestazione di reindirizzamento viene inviato.


2
hai uno spazio dopo save_post, è un errore di battitura qui, o era nel tuo codice originale? inoltre, abilitare il debug durante lo sviluppo.
Milo,

@Milo scusa errore di battitura, ma non nel codice originale
rusly

in tal caso, dovresti vedere il tuo output nell'angolo in alto a sinistra dello schermo quando crei un nuovo post. il salvataggio di un post esistente avviene prima di un reindirizzamento, quindi non vedrai nulla se non hai abilitato il debug.
Milo,

Risposte:


55

Quando un post viene aggiornato ci sono alcuni hook che vengono attivati:

  • 'pre_post_update'è un'azione lanciata poco prima dell'aggiornamento del post, gli argomenti passati sono 2: $post_IDe $dataquesto è un array di tutte le altre colonne del database della tabella post
  • 'transition_post_status'è un hook attivato durante l'aggiornamento e passa 3 argomenti: $ new_post_status $old_post_statuse $post(oggetto).
  • Quindi, ci sono altri 2 hook di transizione attivati, ma hanno un nome dinamico, ciò significa che l'azione effettiva attivata dipende dal vecchio e dal nuovo stato del post. "{$old_status}_to_{$new_status}"e "{$new_status}_{$post->post_type}". Prima passa l'unico oggetto post come argomento, il secondo passa l'id post e l'oggetto post. Trova la documentazione qui .
  • 'edit_post'che passano 2 argomenti: $post_IDe $post(oggetto)
  • 'post_updated'che passa 3 argomenti $post_ID, $post_after(oggetto postale dopo l'aggiornamento), $post_before(oggetto postale prima dell'aggiornamento)
  • Un altro gancio dinamico: "save_post_{$post->post_type}"che dipende dal tipo di messaggio, ad esempio per i posti standard è di 'save_post_post'per pagine è 'save_post_page', questo passaggio gancio 3 argomenti $post_ID, $post(oggetto) e $updateche è un valore booleano (vero o falso) che è vero quando si esegue un aggiornamento, in infatti questo hook viene attivato anche quando un post viene salvato per la prima volta.
  • ' save_post' che viene attivato sia all'aggiornamento che al primo salvataggio e passa gli stessi 3 argomenti dell'hook precedente.
  • ' save_post_{$post_type}' che viene attivato sia al momento dell'aggiornamento che al primo salvataggio e passa gli stessi primi 2 argomenti dell'hook precedente.
  • Alla fine hai ' wp_insert_post' , che viene attivato sia al momento dell'aggiornamento che al primo salvataggio, e passa gli stessi 3 argomenti dei precedenti 2 hook.

Questi hook vengono attivati ​​ogni volta che un post viene aggiornato, sia tramite le pagine di amministrazione nel back-end che tramite quando viene aggiornato "manualmente" utilizzando wp_update_posto le wp_insert_postfunzioni.

Quando il post viene aggiornato utilizzando le pagine di amministrazione, vengono attivati ​​hook aggiuntivi, un esempio è 'update_post_redirect'o 'post_updated_messages'. (Vedi questo e questo WPSE risponde per esempi di utilizzo).

Si noti che se si desidera utilizzare alcuni argomenti hook, che non è il primo, è necessario dichiararlo esplicitamente in add_actionchiamata.

Ad esempio, se si desidera utilizzare l' '$update'argomento (ovvero il 3 °) 'save_post'dell'hook, è necessario aggiungere 3come $accepted_argsparametro su add_action( consultare i documenti ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

L'ultima nota riguarda i tempi : devi essere sicuro che add_actionvenga chiamato prima che l'azione venga attivata, altrimenti non farà nulla.

Ad esempio questo codice:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

non farà nulla, poiché l'azione viene aggiunta dopo l'attivazione dell'hook. Qui è semplice riconoscerlo, nel codice del mondo reale non è sempre così.


Penso che l'hook dell'azione "save_post" venga attivato anche quando si preme Aggiungi nuovo (Post, Pagina, CPT) nella dashboard. Per vederti basta eseguire questo codice. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );Perché l'azione 'save_post' viene eseguita su Aggiungi nuovo anziché su Pubblica? Per fare il post in bozza automatica suppongo.
lowtechsun,

@lowtechsun Come si dice in A, gli hook vengono attivati ​​ogni volta che un post viene aggiornato, ovvero salvato nel DB. Quando si preme "Aggiungi nuovo", vicino al caricamento della pagina, WP crea un post bozza memorizzato nel DB in modo che i suoi hook vengano attivati.
gmazzap

Grazie per essere tornato da me. L'ho scoperto ieri e ho pensato che il concetto fosse confuso. Significato prima di tutto apro la pagina per aggiungere un nuovo post. A questo punto ho pensato che ho non già creato un post. Solo una volta che premo Pubblica penso che il nuovo post verrà creato. Se spero di più, spero che WP elimini il messaggio di bozza automatica se premo Aggiungi nuovo ma poi esco dalla pagina senza premere Pubblica?
lowtechsun,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.