Comment accrocher update_post_meta et delete_post_meta?

23

Je n'arrive toujours pas à comprendre ce qui l'entoure, alors je suis vraiment coincé pour essayer d'accomplir la tâche suivante:

Si update_post_meta est déclenché, vérifiez si la méta_key est égale à quelque chose (je veux déclencher du code si une méta_key particulière est utilisée). Si la clé méta que je cherche, exécutez un code qui doit connaître le $post->ID de la clé méta mise à jour.

Je dois me connecter à delete_post_meta pour que ce soit l'inverse, comme ci-dessus.

Quelqu'un peut-il me fournir un exemple de code pour le raccordement à update_post_meta et delete_post_meta?

    
posée Brady 10.05.2011 - 14:01
la source

2 réponses

41

Les hooks update_post_meta sont appelés à partir du plus générique update_metadata() , de sorte que vous ne l'avez peut-être pas trouvé directement. Les trois crochets sont:

  • update_post_metadata , un filtre qui vous permet de: "détourner" la mise à jour des métadonnées et faire autre chose. Si vous raccordez une fonction qui renvoie un booléen, l'exécution s'arrête là et le booléen est renvoyé.
  • update_post_meta , action appelée "< em> avant les données sont mises à jour dans la base de données.
  • updated_post_meta , action appelée "< em> après les données sont mises à jour dans la base de données.

Si la clé méta n'existait pas encore dans la base de données, update_metadata() passe le contrôle à add_metadata() , qui a les mêmes hameçons add_post_metadata , add_post_meta et added_post_meta . Cela se produit avant que update[d]_post_meta soit appelé. Donc, si vous voulez faire quelque chose quand la clé méta est ajoutée ou mise à jour, assurez-vous de raccorder à la fois les hooks update* et add* - mais remarquez que pendant que updated_* et added_* actions transmettent des paramètres similaires, update_* et add_* ne le font pas ( add_post_meta ne passe pas un identificateur méta en premier).

delete_metadata() a des points d'ancrage similaires: delete_post_metadata , delete_post_meta et deleted_post_meta .

Exemple de code:

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 );
    }
}
    
réponse donnée Jan Fabry 10.05.2011 - 14:25
la source
8

La réponse de Jan couvre à peu près tout ce qui précède, sauf dans le cas où une métadonnée personnalisée est supprimée de la page Modifier le message. Cela se produit de manière asynchrone dès que vous cliquez sur le bouton "Supprimer" sous les métadonnées, via un appel à wp-admin / admin-ajax.php. Malheureusement, ces appels ignorent la fonction delete_metadata() dans meta.php et appellent plutôt delete_meta() dans wp-admin / includes / post.php (à ne pas confondre avec wp-includes / post.php).

Deux actions peuvent toujours être utilisées: delete_postmeta (avant suppression) et deleted_postmeta (après suppression). Les deux acceptent un seul paramètre $mid , qui est l'ID de la métadonnée ( pas la clé). Vous pouvez récupérer l'objet de métadonnées à l'aide de:

$meta = get_post_meta_by_id($mid);  

qui retourne un objet avec meta_id, post_id, meta_key et meta_value. Bien sûr, au moment où deleted_postmeta est appelé, les métadonnées ont été supprimées, ainsi get_post_meta_by_id() ne fonctionnera pas (ce qui rendra cette action inutile)

Idem pour la mise à jour de métadonnées personnalisées à partir de la page Modifier le message. La fonction update_metadata() (et ses actions) dans meta.php n'est pas appelée, mais la fonction update_meta() dans wp-admin / includes / post.php l'est à la place. Deux actions encore ici, update_postmeta et updated_postmeta . Les arguments sont $ meta_id, $ post_id, $ meta_key, $ meta_value.

    
réponse donnée sebastien.b 21.08.2011 - 01:59
la source

Lire d'autres questions sur les étiquettes