Come agganciare update_post_meta e delete_post_meta?

10 mag 2011, 15:01:32
Visualizzazioni: 42.5K
Voti: 34

Ho ancora difficoltà a comprendere l'intero meccanismo degli hook, quindi sono davvero bloccato nel tentativo di eseguire la seguente attività:

Se viene eseguito update_post_meta vorrei verificare se il meta_key è uguale a qualcosa (voglio attivare del codice se viene utilizzata una particolare meta_key). Se trovo la meta key che sto cercando, eseguire del codice che avrà bisogno di conoscere il $post->ID della meta key che viene aggiornata.

Ho bisogno anche di agganciare delete_post_meta che fa più o meno l'inverso di quanto sopra.

Qualcuno può fornirmi del codice di esempio per agganciare update_post_meta e delete_post_meta?

0
Tutte le risposte alla domanda 2
3
56

Gli hook update_post_meta vengono chiamati dalla funzione più generica update_metadata(), quindi potresti non averli trovati direttamente. I tre hook sono:

  • update_post_metadata, un filtro che ti consente di "intercettare" l'aggiornamento dei metadati e fare qualcos'altro. Se colleghi una funzione che restituisce un valore booleano, l'esecuzione si interrompe lì e viene restituito il booleano.
  • update_post_meta, un'azione che viene chiamata prima che i dati vengano aggiornati nel database.
  • updated_post_meta, un'azione che viene chiamata dopo che i dati sono stati aggiornati nel database.

Se la chiave meta non esisteva ancora nel database, update_metadata() passa il controllo a add_metadata(), che ha gli hook simili add_post_metadata, add_post_meta e added_post_meta. Questo avviene prima che venga chiamato update[d]_post_meta. Quindi, se vuoi fare qualcosa quando la chiave meta viene aggiunta o aggiornata, assicurati di collegarti sia agli hook update* che agli add* - ma nota che mentre le azioni updated_* e added_* passano parametri simili, update_* e add_* non lo fanno (add_post_meta non passa un ID meta per primo).

delete_metadata() ha hook simili: delete_post_metadata, delete_post_meta e deleted_post_meta.

Codice di esempio:

add_action( 'added_post_meta', 'wpse16835_after_post_meta', 10, 4 );
add_action( 'updated_post_meta', 'wpse16835_after_post_meta', 10, 4 );
function wpse16835_after_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_do_something( $post_id, $meta_value );
    }
}

add_action( 'deleted_post_meta', 'wpse16835_deleted_post_meta', 10, 4 );
function wpse16835_deleted_post_meta( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_undo_something( $post_id );
    }
}
10 mag 2011 15:25:31
Commenti

grazie mille per questo. Ero a conoscenza del fatto che update_post_meta utilizza update_metadata e lì dentro c'erano gli hook per added_post_meta e updated_post_meta ma questo era tutto ciò che riuscivo a capire. Non capivo come usarli. Ma ora penso di aver capito :)

Scott Scott
10 mag 2011 15:34:55

Più specificamente, l'hook è updated_{$post_type}_meta

Benjamin Intal Benjamin Intal
8 ago 2015 06:46:20

È possibile agganciarsi al punto in cui i meta dei post vengono aggiornati tramite REST API? Vorrei fare in modo che venga creata una revisione del post quando vengono aggiornati solo i meta dei post tramite l'API REST.

Amjad Amjad
13 feb 2020 20:52:37
0

La risposta di Jan copre praticamente tutto tranne il caso in cui un metadato personalizzato venga eliminato dalla pagina Modifica articolo. Questo avviene in modo asincrono non appena si clicca sul pulsante "Elimina" sotto il metadato, tramite una chiamata a wp-admin/admin-ajax.php. Sfortunatamente, questa chiamata bypassa la funzione delete_metadata() in meta.php e chiama invece delete_meta() in wp-admin/includes/post.php (da non confondere con wp-includes/post.php).

Ci sono comunque 2 azioni che possono ancora essere utilizzate: delete_postmeta (prima dell'eliminazione) e deleted_postmeta (dopo l'eliminazione). Entrambe accettano un singolo parametro $mid, che è l'ID del metadato (non la chiave). Puoi recuperare l'oggetto del metadato usando:

$meta = get_post_meta_by_id($mid);  

che restituisce un oggetto con meta_id, post_id, meta_key e meta_value. Naturalmente, quando viene chiamato deleted_postmeta il metadato è già stato eliminato, quindi get_post_meta_by_id() non funzionerà (il che rende questa azione piuttosto inutile).

Lo stesso vale per l'aggiornamento di un metadato personalizzato dalla pagina Modifica articolo. La funzione update_metadata() (e le sue azioni) in meta.php non viene chiamata, ma invece viene chiamata la funzione update_meta() in wp-admin/includes/post.php. Anche qui ci sono due azioni: update_postmeta e updated_postmeta. Gli argomenti sono $meta_id, $post_id, $meta_key, $meta_value.

21 ago 2011 02:59:20