Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WordPress hook after adding/updating post AND after insertion of post meta?

I have a custom post type called "videos", which also has a few custom fields defined. Upon creating or updating a "videos" post, I would like to run a function.

Unfortunately, this function needs the values of the post meta data for the post that I've just created, and the usual hooks (save_post,publish_post, etc.) seem to run before the post meta is inserted into the database, so it isn't available.

If I manually update the post just by clicking "Publish" without making any changes, function works properly.

Is there a hook that fires later in the process, after all metadata has been inserted?

like image 827
Chris Herbert Avatar asked Nov 20 '13 04:11

Chris Herbert


People also ask

How do you update post meta in WordPress?

Adding post meta to a post can be easily done through the WordPress admin. On the post edit page, you can add post meta to the post. In case you don't see the post meta( custom fields meta box) on the post edit page you can enable to post meta from the screen options as shown below.

What is Post Meta field in WordPress?

Post Meta is a feature of WordPress which refers to include additional information about your post or page. It allows you to store extra information on a blog post including author name, categories, tags, date, etc.


2 Answers

There is an undocumented hook called updated_post_meta that does what I need.

It will pass 4 parameters to the hooked function: the meta ID, the object ID (same as the post ID), the meta key, and the meta value. In my hooked function I check to see if the meta key name is the field that I need the value of and, if so, it proceeds.

Here's what it looks like:

/**
 * Use value of post meta for something when the post 
 * meta changes
 * @param  integer $meta_id    ID of the meta data field
 * @param  integer $post_id    Post ID
 * @param  string $meta_key    Name of meta field
 * @param  string $meta_value  Value of meta field
 */
function saveYouTubeInfo($meta_id, $post_id, $meta_key='', 
                                             $meta_value=''){

    // Stop if not the correct meta key
    if ( $meta_key != 'my_meta_field_name') {
        return false;
    }

    // Function code goes here.
}

add_action('updated_post_meta', 'saveYouTubeInfo', 10, 4);

By the way, unlike added_post_meta, you do not replace post with the post type that you are targeting. In my case, the name of the post type is videos, but I still had to use updated_post_meta and NOT updated_videos_meta.

like image 85
Chris Herbert Avatar answered Oct 01 '22 17:10

Chris Herbert


The reason post meta is not available yet it is because they use save_post hook to save post meta. So, you hook is not running after post meta is saved to database.

Two solutions to your problem.

  1. Get the data from $_POST

add_action('save_post', 'my_function');

function my_function($post_id){

$postmeta = $_POST['field_name'];

}

  1. Use a Higher priority for your hook, so it runs after post meta is saved

add_action('save_post', 'my_function', 12 , 3);

function my_function($post_id, $post, $update){

$postmeta = get_post_meta($post_id, 'meta_key', true);

}

like image 29
alextrejo Avatar answered Oct 01 '22 19:10

alextrejo