Leave a Reply

3 comments

  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.

  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.

  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.