Comment accrocher update_post_meta et delete_post_meta?

29

J'ai toujours du mal à comprendre ce qui se passe dans les choses, donc je suis vraiment coincé à essayer de faire la tâche suivante:

Si update_post_metaest tiré, vérifiez si le meta_keyest égal à quelque chose (je veux déclencher du code si une méta-clé particulière est utilisée). Si la clé méta que je recherche, exécutez du code qui devra connaître la $post->IDclé méta mise à jour.

Je dois m'y accrocher delete_post_metaaussi ce genre de fait l'inverse comme ci-dessus.

Quelqu'un peut-il me fournir un exemple de code pour se connecter à update_post_metaet delete_post_meta?

Brady
la source

Réponses:

45

Les update_post_metahooks sont appelés à partir de la update_metadata()fonction plus générique , donc 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 de faire autre chose. Si vous connectez une fonction qui renvoie un booléen, l'exécution s'arrête là et le booléen est renvoyé.
  • update_post_meta, une action qui est appelée avant la mise à jour des données dans la base de données.
  • updated_post_meta, une action qui est appelée après la mise à jour des données dans la base de données.

Si la clé de méta n'existait pas dans la base de données encore, update_metadata()passe le contrôle add_metadata(), ce qui a des crochets similaires add_post_metadata, add_post_metaet added_post_meta. Cela se produit avant d' update[d]_post_metaêtre appelé. Donc , si vous voulez faire quelque chose lorsque la clé de méta est ajouté ou mis à jour, assurez - vous de brancher dans les deux update*et les add*crochets - mais avis que si les updated_*et added_*actions passent des paramètres similaires, update_*et add_*ne le font pas ( add_post_metane passe pas un ID méta premier) .

delete_metadata()comporte des crochets similaires delete_post_metadata, delete_post_metaet 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 );
    }
}
Jan Fabry
la source
super thx pour cela. J'étais conscient de l' update_post_metautilisation update_metadataet là-dedans, il y avait des crochets added_post_metaet updated_post_metamais c'est aussi loin que je pouvais obtenir. Je n'ai pas compris comment l'utiliser. Mais maintenant je pense que j'ai compris :)
Brady
3
Plus précisément, le crochet estupdated_{$post_type}_meta
Benjamin Intal
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 contournent la delete_metadata()fonction dans meta.php et les appels delete_meta()dans wp-admin / includes / post.php à la place (à ne pas confondre avec wp-includes / post.php).

Il y a cependant 2 actions qui peuvent encore être utilisées delete_postmeta(avant la suppression) et deleted_postmeta(après la suppression). Les deux acceptent un seul paramètre $mid, qui est l'ID des métadonnées ( pas la clé). Vous pouvez récupérer l'objet de métadonnées en utilisant:

$meta = get_post_meta_by_id($mid);  

qui renvoie un objet avec meta_id, post_id, meta_key abd meta_value. Bien sûr, au moment de l' deleted_postmetaappel, les métadonnées ont été supprimées, donc get_post_meta_by_id()cela ne fonctionnera pas (ce qui rend cette action inutile)

Il en va de même pour la mise à jour d'une métadonnée personnalisée à partir de la page Modifier la publication. La update_metadata()fonction (et ses actions) dans meta.php n'est pas appelée, mais la update_meta()fonction dans wp-admin / includes / post.php l'est à la place. Encore deux actions ici, update_postmetaet updated_postmeta. Les arguments sont $ meta_id, $ post_id, $ meta_key, $ meta_value.

sebastien.b
la source