qual è il modo corretto per agganciare l'aggiornamento di un post
ho provato ad agganciare quando un post viene aggiornato ma tutti gli hook che ho provato non vengono mai eseguiti eccetto updated_post_meta
add_action('updated_post_meta', 'my_function');
function my_function($post_id) {
echo 'Questo è il mio ID post: '.$post_id;
}
Ho provato anche add_action('save_post', 'my_function');
ma nessun id viene mostrato, o forse questo messaggio viene già mostrato ma non viene mai visualizzato perché viene inviato l'header di reindirizzamento.

Quando un post viene aggiornato, vengono attivati alcuni hook:
'pre_post_update'
è un'azione attivata appena prima che il post venga aggiornato, gli argomenti passati sono 2:$post_ID
e$data
che è un array di tutte le altre colonne della tabella dei post nel database'transition_post_status'
è un hook attivato durante l'aggiornamento, e passa 3 argomenti: $new_post_status,$old_post_status
e$post
(oggetto).- Poi, ci sono altri 2 hook di transizione attivati, ma hanno nomi dinamici, ciò significa che l'azione effettiva dipende dallo stato vecchio e nuovo del post.
"{$old_status}_to_{$new_status}"
e"{$new_status}_{$post->post_type}"
. Il primo passa solo l'oggetto post come argomento, il secondo passa l'ID del post e l'oggetto post. Trova la documentazione qui. 'edit_post'
che passa 2 argomenti:$post_ID
e$post
(oggetto)'post_updated'
che passa 3 argomenti:$post_ID
,$post_after
(oggetto post dopo l'aggiornamento),$post_before
(oggetto post prima dell'aggiornamento)- Un altro hook dinamico:
"save_post_{$post->post_type}"
che dipende dal tipo di post, ad esempio per i post standard è'save_post_post'
e per le pagine è'save_post_page'
, questo hook passa 3 argomenti:$post_ID
,$post
(oggetto) e$update
che è un booleano (vero o falso) che è vero quando si esegue un aggiornamento, infatti questo hook viene attivato anche quando un post viene salvato per la prima volta. - '
save_post
' che viene attivato sia durante l'aggiornamento che durante il primo salvataggio, e passa gli stessi 3 argomenti dell'hook precedente. - '
save_post_{$post_type}
' che viene attivato sia durante l'aggiornamento che durante il primo salvataggio, e passa gli stessi primi 2 argomenti dell'hook precedente. - Infine c'è '
wp_insert_post
', che viene attivato sia durante l'aggiornamento che durante il primo salvataggio, e passa gli stessi 3 argomenti dei 2 hook precedenti.
Questi hook vengono attivati ogni volta che un post viene aggiornato, sia tramite le pagine di amministrazione nel backend che quando viene aggiornato "manualmente" usando le funzioni wp_update_post
o wp_insert_post
.
Quando il post viene aggiornato usando le pagine di amministrazione, vengono attivati hook aggiuntivi, un esempio è 'update_post_redirect'
o 'post_updated_messages'
. (Vedi questa e questa risposta su WPSE per esempi di utilizzo).
Nota che se vuoi utilizzare qualche argomento di un hook che non è il primo, devi dichiararlo esplicitamente nella chiamata add_action
.
Ad esempio, se vuoi usare l'argomento '$update'
(che è il terzo) dell'hook 'save_post'
devi aggiungere 3
come parametro $accepted_args
in add_action
(vedi documentazione):
// se non aggiungi 3 come 4° argomento, questo non funzionerà come previsto
add_action( 'save_post', 'my_save_post_function', 10, 3 );
function my_save_post_function( $post_ID, $post, $update ) {
$msg = 'È un aggiornamento? ';
$msg .= $update ? 'Sì.' : 'No.';
wp_die( $msg );
}
Un'ultima nota riguarda il timing: devi assicurarti che add_action
venga 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, perché l'azione viene aggiunta dopo che l'hook è stato attivato. Qui è semplice riconoscerlo, nel codice reale non è sempre così ovvio.

Penso che l'hook di azione 'save_post' venga attivato anche quando si clicca su Aggiungi nuovo (Post, Pagina, CPT) nella dashboard. Per vederlo di persona 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 invece che su Pubblica? Suppongo per creare il post auto-draft.

@lowtechsun Come detto nella risposta, gli hook vengono attivati ogni volta che un post viene aggiornato, cioè salvato nel DB. Quando clicchi "Aggiungi nuovo", poco dopo il caricamento della pagina, WP crea un post bozza memorizzato nel DB quindi gli hook vengono attivati.

Grazie per la risposta. Ho scoperto questa cosa solo ieri e penso che il concetto sia confuso. Nel senso che prima apro la pagina per aggiungere un nuovo post. A questo punto pensavo di non aver già creato un post. Solo quando clicco su Pubblica penserei che il nuovo post venga creato. Andando avanti, spero che WP elimini il post auto-draft se clicco su Aggiungi nuovo ma poi lascio la pagina senza cliccare su Pubblica?

Perché non utilizzare l'hook post_updated_messages
. In questo modo puoi mostrare questo messaggio proprio come il classico aggiornamento di WordPress per i post.
add_filter('post_updated_messages', 'your_message');
function your_message(){
}
Cerca un esempio qui:
http://codex.wordpress.org/Function_Reference/register_post_type
sotto post_updated_messages
