web-dev-qa-db-fra.com

Comment accrocher update_post_meta et delete_post_meta?

Je n'arrive toujours pas à comprendre ce qui se passe, 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 devra connaître le $post->ID de la clé méta mise à jour.

J'ai besoin de me connecter à la delete_post_meta aussi qui fait 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?

27
Brady

Les hooks update_post_meta sont appelés à partir de la fonction plus générique update_metadata() , de sorte que vous ne l’avez peut-être pas trouvée 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 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 before les données sont mises à jour dans la base de données.
  • updated_post_meta , action appelée after 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 possède les crochets similaires add_post_metadata, add_post_meta et added_post_meta. Cela se produit avant que update[d]_post_meta ne soit appelé. Donc, si vous voulez faire quelque chose quand la clé méta est ajoutée ou updated, assurez-vous de raccorder à la fois les hooks update* et add* - mais notez que lorsque les actions updated_* et added_* transmettent des paramètres similaires, update_* et add_* ne le fait pas (add_post_meta ne passe pas un identifiant méta en premier).

delete_metadata() a des crochets 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 );
    }
}
43
Jan Fabry

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 fonction delete_metadata() dans meta.php et appellent 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 s'appelle, les métadonnées ont été supprimées, donc get_post_meta_by_id() ne fonctionnera pas (ce qui rendra cette action inutile)

Il en va de même 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 est non appelé, mais la fonction update_meta() dans wp-admin/includes/post.php est à la place. Deux actions encore ici, update_postmeta et updated_postmeta. Les arguments sont $ meta_id, $ post_id, $ meta_key, $ meta_value.

8
sebastien.b