Comment accrocher update_post_meta et delete_post_meta?
2 réponses
- votes
-
- 2011-05-10
Les hooks
update_post_meta
sont appelés depuis leplusgénériqueupdate_metadata ()
,vousne l'avezpeut-êtrepastrouvée directement. Lestrois crochets sont:-
update_post_metadata
,unfiltre qui vouspermet de "détourner" lamise àjour desmétadonnéeset defaire autre chose. Si vous connectez unefonction qui renvoie unbooléen,l'exécution s'arrête làet lebooléenest renvoyé. -
update_post_meta
,une action quiest appelée avant lamise àjour des données dans labase de données. -
updated_post_meta
,une action quiest appelée après lamise àjour des données dans labase de données.
Si la clémétan'existaitpasencore dans labase de données,
update_metadata ()
passe le contrôle àadd_metadata ()
,qui a les crochets similairesadd_post_metadata
,add_post_meta code >et
added_post_meta
. Cela seproduit avant queupdate [d] _post_meta
ne soit appelé. Donc,si vous voulezfaire quelque chose lorsque la clémétaest ajoutée ou mise àjour,assurez-vous de vous connecter à lafois à lamise àjour *
et à laadd *
hooks -maisnotez que si les actionsupdated_ *
etadded_ *
transmettent desparamètres similaires,update_ *
etadd_ *
ne pas (add_post_meta
ne passepas d'abord unidentifiant deméta).delete_metadata ()
a des hooks similaires:delete_post_metadata
,delete_post_meta
etdeleted_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); fonction 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 ('supprimé_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); } }
The
update_post_meta
hooks are called from the more genericupdate_metadata()
function, so you might not have found it directly. The three hooks are:update_post_metadata
, a filter which allows you to "hijack" the metadata update and do something else. If you hook up a function that returns a boolean, execution stops there and the boolean is returned.update_post_meta
, an action that gets called before the data is updated in the database.updated_post_meta
, an action that gets called after the data is updated in the database.
If the meta key did not exist in the database yet,
update_metadata()
passes control toadd_metadata()
, which has the similar hooksadd_post_metadata
,add_post_meta
, andadded_post_meta
. This happens beforeupdate[d]_post_meta
gets called. So if you want to do something when the meta key is added or updated, be sure to hook into both theupdate*
and theadd*
hooks - but notice that while theupdated_*
andadded_*
actions pass similar parameters,update_*
andadd_*
do not (add_post_meta
does not pass a meta ID first).delete_metadata()
has similar hooks:delete_post_metadata
,delete_post_meta
anddeleted_post_meta
.Sample 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 ); } }
-
supermercipour ça.J'étais au courant de `update_post_meta` utilisant` update_metadata`et là-dedans,il y avait des crochets à `added_post_meta`et` updated_post_meta`mais c'est aussi loin queje pouvais obtenir.Jen'aipas compris comment utiliser.Maismaintenantje pense queje l'ai :)super thx for this. I was aware about `update_post_meta` using `update_metadata` and in there, there was hooks to `added_post_meta` and `updated_post_meta` but thats as far as I could get. I didn't understand how to use. But now I think I've got it :)
- 0
- 2011-05-10
- Scott
-
Plusprécisément,le hookest `mis àjour _ {$post_type} _meta`More specifically, the hook is `updated_{$post_type}_meta`
- 3
- 2015-08-08
- Benjamin Intal
-
Est-ilpossible de se connecter à l'endroit où laméta depublicationestmise àjour via l'API REST?Je veuxfaireen sorte que la révision depublication soit créée lorsque seule laméta depublicationestmise àjour via l'API rest.Is it possible to hook into where post meta is updated via the REST API? I want to make it such that post revision is created when only post meta is updated via the rest API.
- 0
- 2020-02-13
- Amjad
-
- 2011-08-20
La réponse dejanvier couvre àpeuprèstout ce quiprécède,sauf dans le cas où unemétadonnéepersonnaliséeest supprimée de lapage Modifier l'article. Cela seproduit demanière asynchrone dès que vous cliquez sur lebouton "Supprimer" sous lesmétadonnées,via un appel à wp-admin/admin-ajax.php. Malheureusement,ces appels contournent lafonction
delete_metadata()
dansmeta.phpet appelledelete_meta()
dans wp-admin/includes/post.php à laplace (àne pas confondre avec wp-includes/post.php).Ilexiste cependant 2 actions quipeuventencore être utilisées,
delete_postmeta
(avant suppression)etdeleted_postmeta
(après suppression). Les deux acceptent un seulparamètre$mid
,quiest l'ID desmétadonnées (pas la clé). Vouspouvez récupérer l'objet demétadonnéesen utilisant:$meta = get_post_meta_by_id($mid);
qui renvoie un objet avecmeta_id,post_id,meta_keyet meta_value. Bien sûr,aumoment où
deleted_postmeta
est appelé,lesmétadonnées ont été supprimées,doncget_post_meta_by_id()
ne fonctionnerapas (ce qui rend cette actioninutile)Ilen va demêmepour lamise àjour d'unemétadonnéepersonnalisée àpartir de lapage Modifier l'article. Lafonction
update_metadata()
(et ses actions) dansmeta.phpn'est pas appelée,mais lafonctionupdate_meta()
dans wp-admin/includes/post.phpest à laplace. Encore deux actionsici,update_postmeta
etupdated_postmeta
. Les arguments sont $meta_id,$post_id,$meta_key,$meta_value.Jan answer covers pretty much it above except for the case where a custom metadata is deleted from the Edit Post page. This happens asynchronously as soon as you click on the "Delete" button under the metadata, via a call to wp-admin/admin-ajax.php. Unfortunately, that calls bypass the
delete_metadata()
function in meta.php and callsdelete_meta()
in wp-admin/includes/post.php instead (not to be confused with wp-includes/post.php).There are 2 actions that can still be used though,
delete_postmeta
(before deletion), anddeleted_postmeta
(after deletion). Both accept a single parameter$mid
, which is the ID of the metadata (not the key). You can retrieve the metadata object using:$meta = get_post_meta_by_id($mid);
which returns an object with meta_id, post_id, meta_key abd meta_value. Of course, by the time
deleted_postmeta
is called the metadata has been deleted soget_post_meta_by_id()
won't work (which kinda makes that action useless)Same goes for updating a custom metadata from the Edit Post page. The
update_metadata()
function (and its actions) in meta.php is not called, but theupdate_meta()
function in wp-admin/includes/post.php is instead. Two actions again here,update_postmeta
andupdated_postmeta
. The args are $meta_id, $post_id, $meta_key, $meta_value.
J'aiencore dumal à comprendretoute cette connexion aux choses,doncje suis vraiment obligé d'essayer defaire latâche suivante:
Si
update_post_meta
est déclenché,vérifiez si lemeta_key
est égal à quelque chose (je veux déclencher du code si unmeta_keyparticulierest utilisé).Si la cléméta queje recherche,exécutez du code qui devra connaître le$post->ID
de la clémétaen cours demise àjour.Je dois aussim'accrocher au
delete_post_meta
,ce quifait l'inverse comme ci-dessus.Quelqu'unpeut-ilme fournir unexemple de codepour se connecter à
update_post_meta
etdelete_post_meta
?