I’m still struggling to get my head around this whole hooking into things, so I’m really stuck on trying to do the following task:
If update_post_meta
is fired then check to see if the meta_key
is equal to something (I want to trigger some code if a particular meta_key is used). If the meta key I’m looking for then run some code that will need to know the $post->ID
of the meta key being updated.
I need to hook into the delete_post_meta
too that kind of does the reverse as above.
Can anyone provide me with some example code for hooking into update_post_meta
and delete_post_meta
?
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:
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: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.