qual è il modo corretto per agganciare l'aggiornamento di un post

14 feb 2014, 18:23:23
Visualizzazioni: 88.4K
Voti: 38

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.

3
Commenti

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

Milo Milo
14 feb 2014 18:31:47

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

rusly rusly
14 feb 2014 18:38:03

se è così, allora 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 a meno che non abbia il debug abilitato.

Milo Milo
14 feb 2014 18:42:36
Tutte le risposte alla domanda 2
3
102

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.

14 feb 2014 19:08:28
Commenti

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 lowtechsun
12 nov 2018 19:52:37

@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.

gmazzap gmazzap
13 nov 2018 11:14:52

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?

lowtechsun lowtechsun
13 nov 2018 11:18:21
0

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

14 feb 2014 18:39:03