delete custom post metadata
-
hello, i’m trying to delete a metadata of custom post
i’ve tried an action in my functions.php
add_action( 'delete_metadata', 'del_met', 10, 4 ); function del_met( $meta_type, $meta_key, $delete_all = true) { if ( $meta_type == 'shop_order' ) { delete_metadata( $meta_type, $object_id, $meta_key, $meta_value, $delete_all = true); } }
but the metadata is there and isn’t deleted, need help, what am i doing wrong?
-
You haven’t set a value for $object_id, so you’re passing a 0. Object_id does not accept a default value.
your last parameter should be just “true”
delete_metadata( $meta_type, $object_id, $meta_key, $meta_value, true);
https://codex.wordpress.org/Function_Reference/delete_metadata
Finally, I don’t see that there is a ‘delete_metadata’ hook. It’s not clear to me how you are trying to make this work. See http://hookr.io/all/#index=d
I think what you want to do is to call the delete_metadata function from within some other action.
Hi steve, sorry for the very late reply, i’m still learning, so any help would be appreciated
regarding your first statement “You haven’t set a value for $object_id, so you’re passing a 0. Object_id does not accept a default value.”
http://hookr.io/4.4/functions/delete_metadata/
it says that “$delete_all — Optional. (constant) => false.
Optional, default is false. If true, delete matching metadata entries for all objects, ignoring the specified object_id. Otherwise, only delete matching metadata entries for the specified object_id”that is why i didn’t provide object_id
also i don’t know how to hook the delete_metadata function.
can you please provide some examples of the usage, i searched a lot and i can’t find it anywhere.
Thanks
edit: deleted already replied to
Even if
$object_id
is ignored, it needs to contain a valid value. If you’re deleting all post meta with that key, you don’t need to pass a variable for the ID, a simple integer will suffice.
delete_metadata( $meta_type, 69, $meta_key, $meta_value, true);
Unless you want to delete only specific values, you don’t need$meta_value
either, just passnull
. And$meta_type
will always be ‘post’ in your case, not ‘shop_order’. The meta type is for which table to work on, not which post type. Post type is implicit in the object ID. That just leaves$meta_key
. If there is only one key you are deleting, you don’t even need this variable, you could potentially do something like this:
delete_metadata( 'post', 69, 'my_meta_key', null, true);
You also have some issues with how you are using action hooks. The number of parameters your callback collects must match the number specified in the
add_action()
call. You specify 4, but only collect 3. Which parameters are passed depend on the originatingdo_action()
call, the passed values may not be the ones you need for the related function. You need to look at the originating source code for what is actually passed.Since a ‘delete_metadata’ action does not exist, you cannot possibly know what parameters are passed. Which brings up the question of what action hook should you use? Unless there is code adding metadata with a direct SQL query, I think ‘added_post_meta’ will work for you. This fires every time
add_metadata()
is called for posts. Use ofupdate_metadata()
should be covered by this hook as well since if there is no existing record,add_metadata()
is called.You really only need to delete the data just added instead of everything because everything else would have been previously deleted on addition as well. You only need to clean up your DB of any existing unwanted meta data one time, this hook will take care of future additions.
See if something like this works for you:
//deletes any post meta data added if key is in the $delete_keys array add_action( 'added_post_meta', 'del_met', 10, 4 ); function del_met( $mid, $object_id, $meta_key, $_meta_value ) { $delete_keys = array( 'my_meta_key', 'another_meta_key, 'yet_another', ); if ( in_array( $meta_key, $delete_keys ) { delete_metadata( 'post', $object_id, $meta_key ); } }
- The topic ‘delete custom post metadata’ is closed to new replies.