I am using the hook publish_post to run my code where I need the post meta of the just published post. But the post meta value I am looking for is somehow not available at this point of execution. On checking the wp_postmeta table, I found that my meta key value hasn’t been created yet. Also, I want this to work for a post published for the first time. Is there any other hook that can give me access to it?
function push_notification($post_id)
{
$ref_ids = get_post_meta($post_id,'ref_id');
if($ref_ids)
{
//my code goes here
}
}
add_action('publish_post','push_notification');
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Solved it! Used save_post to run push_notification() as well as to run the function save_post_meta() that saves my post meta. The problem occurred coz push_notification() gets fired before save_post_meta() due to which the meta wasn’t being saved and therefore it remained inaccessible. Just changed priorities of the functions to make it work like so :
function push_notification($post_id)
{
$ref_ids = get_post_meta($post_id,'ref_id');
if($ref_ids)
{
//my code goes here
}
}
add_action('save_post','push_notification',11,1);
function save_post_meta($post_id,$post)
{
//check for nonces and current user capabilities
$ref_id = sanitize_html_class($_POST['ref_id']);
update_post_meta($post_id,'ref_id',$ref_id);
}
add_action('save_post','save_post_meta',10,2);
function no_notification()
{
remove_action('save_post','push_notification',11,1);
}
add_action('publish_to_publish','no_notification');
The last function no_notification() makes sure that push_notification() gets fired only when a post is first created and not for updates.
Method 2
You seem to be concerned only with new posts (as previously-created posts will have the postmeta attached and available when transitions are run), and want to do push_notification on newly-created posts only if a certain postmeta value is present. Correct?
Create your own hook in the function that saves your postmeta, after all of your update_postmeta calls, using do_action(). The postmeta will have been saved at that point, and you can test.
Method 3
I also noticed that when you call get_post_meta() within add_action('publish_post',..) no post meta is returned.
This is because when you publish the post and ‘publish_post’ is called, the post meta is not yet saved in the database. update_post_meta() (the function that saves the post meta in the database) is called after ‘publish_post’. That’s why it works if you save as draft first and then publishes.
To avoid that issue I use this kind of code:
$post_meta_value = get_post_meta($post_id,'meta_key',true);
if($post_meta_value==''){ $post_meta_value = $_POST['meta_key']; }
This will get your value from the $_POST when you click on Publish button.
The $_POST['meta_key'] can be different depending on how you set your post meta or custom field in your back-end. I’m using the ACF (Advanced Custom Fields) plugin and it would be $_POST['fields']['field_52fae7b2b4033'].
Hope that helps.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0