Support

Account

Home Forums ACF PRO Action hook when specific field changes

Solving

Action hook when specific field changes

  • Hi!

    There are any action hook that fire when a specific field is changed and saved in post/page?

    save_post action fire when 1, 2, 3 or all fields had changed. It doesn’t give me any data about what specific field had changed…

    I simply want an action where I can compare the old field value with the new posted value of a specific field (or a group of them) to make some logic to be stored in database.

    I’m using ACF PRO v5.3.9 and WP v4.5.3

    Thanks

    • James

    • July 6, 2016 at 3:33 pm

    Hi @giu-tae-kim

    I think you can use the acf/update_value filter or the acf/save_post action hooks to do it. Here’s the example how to do it with acf/update_value:

    function my_acf_update_value( $value, $post_id, $field  ) {
        // only do it to certain custom fields
        if( $field['name'] == 'custom_field_name' ) {
            
            // get the old (saved) value
            $old_value = get_field('custom_field_name', $post_id);
            
            // get the new (posted) value
            $new_value = $_POST['acf']['field_1234567890abc'];
            
            // check if the old value is the same as the new value
            if( $old_value != $new_value ) {
                // Do something if they are different
            } else {
                // Do something if they are the same
            }
        }
    
    	// don't forget to return to be saved in the database
        return $value;
        
    }
    
    // acf/update_value - filter for every field
    add_filter('acf/update_value', 'my_acf_update_value', 10, 3);

    Where ‘field_1234567890abc’ is the field key of your custom field(‘custom_field_name’ in this case).

    I hope this helps 🙂

  • Hello James and thanks for giving a hand!

    I find interesting this “update_value” filter but I think that the “save_post” is more suitable to my needs, as long I can put all fields logic in only one function.

    How can I access a specific field old and new posted value in acf/save_post action???

    Maybe:

    function my_acf_save_post( $post_id ) {
        
        // specific new field value
        $new_value = $_POST['acf']['field_abc123'];
        
        // specific old field value
        $old_value = get_field('custom_field_name', $post_id);
        
    }
    
    // run before ACF saves the $_POST['acf'] data
    add_action('acf/save_post', 'my_acf_save_post', 1);

    PS: Also can I use get_fields() instead get_field() in order to get all fields old values??

    Regards!

    • James

    • July 7, 2016 at 11:56 am

    Hi @giu-tae-kim

    I believe your code should be working. Just take attention to advanced custom fields like post object, gallery, repeater, etc as the returned data from the database sometimes different from the posted one, even though they are actually referring to the same value.

    Regarding your second question, yes, I think you can use the get_fields() function instead.

    I hope this helps 🙂

  • Hi again. Many thanks but sadly I have some others questions….

    1) Inside the ‘acf/save_post’ hook the statement…

    $_POST['acf']['field_abc123'];

    … retrieve the new posted value of a certain field.

    Consider if the admin doesn’t write any new data inside that field in that post saving… that post value would fall back to the old posted value, or it will be simply empty?

    2) What do you mean that the gallery field would not return what I expect? Is that
    inconsistency normal?

    Many thanks!

    • James

    • July 8, 2016 at 1:25 pm

    Hi @giu-tae-kim

    When you load the form (backend or frontend), the fields will be filled with the saved (old) value. So, if there’s no new value set in the field, the $_POST data should contain the old value.

    Regarding your second question, if you check the database you will see that gallery field is saved as serialized image IDs. If you check the posted data, you will see that it is posted as an array of image IDs. And if you try to return the value using the get_field() function, you’ll see that the data is composed of an array of image objects. This is why I said that you need to make sure that you make the comparison with the right data.

    I hope this makes sense 🙂

  • Hi James

    Thank you very much. Your code worked for me very well.but it could not handle repeater fields. please help me to fix your code for repeaters.

Viewing 7 posts - 1 through 7 (of 7 total)

You must be logged in to reply to this topic.

We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Cookie Policy. If you continue to use this site, you consent to our use of cookies.