Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get custom fields values in filter on wp_insert_post_data

Hi all, thanks for reading.


Environment :

Wordpress + Advanced Custom Fields plugin


Problem :

I have searched for hours now and I can't seem to find the correct syntax to do the following:

When posting a new post, get custom field value in order to automatically replace the title of the post by that value. Example: I create a post and set '10am' in my 'time' custom field. The title of the post is automatically replaced by '10am'.


Example:

So I'm adding a filter with the following :

add_filter('wp_insert_post_data', 'change_title') ;

function change_title($data)

{

    $time = XXX ; // How should I get this custom field value ?

    $new_title = 'Topic created at'.$time ;

    $data['post_title'] = $time ;

    return $data;

}

It must be very simple but I have tried every function available on both WP and the plugin's documentations. I would be very thankful if anyone passing by gave me the solution.

Thanks in advance !

like image 872
maleykith Avatar asked Feb 12 '14 02:02

maleykith


2 Answers

Tweak to Riadh's accepted answer (would add as a comment but haven't got enough rep yet):

As documented in the WordPress Codex wp_update_post includes the save_post hook so calling wp_update_post() inside the save_post hook creates an infinite loop. To avoid this, unhook then rehook your function like so:

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title = 'Topic created at '. $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}    
like image 75
Mark Chitty Avatar answered Sep 22 '22 10:09

Mark Chitty


You can actually access the global $_POST variable for your field value , but i guess you can do it in a cleaner way by using the save_post action to update your post's title, eg:

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title = 'Topic created at '. $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}  

assuming that your ACF fieldname is "time".

Edit: Updated the answer as per Mark Chitty's answer.

like image 35
Riadh C. Avatar answered Sep 21 '22 10:09

Riadh C.