Home › Forums › General Issues › Callback for update succes
Is there a way to be sure that the update_field or add_row are successfully added to the database?
I had some issues when some fields weren’t updating and i also had a hard time figuring out why. Is there a way to get an error message or a succes true or false boolean?
Hi woutervanerp,
The acf/save_post action should help you here.
This code should suffice for what you want, though I haven’t tested it:
<?php
function my_acf_save_post_callback( $success ) {
// Do what you'd like here
}
function my_acf_save_post( $post_id ) {
if ( !isset( $_POST['acf'] ) ){
return;
}
$fields = $_POST['acf'];
add_action( 'acf/save_post', function( $post_id ) use ( $fields ) {
remove_action( 'acf/save_post', $this );
$db_fields = array();
foreach( $fields as $field_key => $value ) {
$db_fields[$field_key] = get_field( $field_key, $post_id );
}
// Serialize the value arrays from $_POST and the Database, so that they are single-level arrays, and array_diff_assoc them to generate the array of differences...
$success = empty( array_diff_assoc( array_map( 'serialize', $fields ), array_map( 'serialize', $db_fields ) ) );
my_acf_save_post_callback( $success );
}, 11 );
}
add_action( 'acf/save_post', 'my_acf_save_post', 9 );
?>
EDIT:
Actually, that would work for a form save, but not for update_field or add_row, which works entirely server-side.
Code Update:
function my_acf_update_field_wrapper( $field_key, $value, $callback, $post_id = null ) {
$new_values = array(
$field_key => $value
);
// We need to hook the default WordPress save_post action
add_action( 'save_post', function( $post_id ) use ( $new_values ) {
remove_action( 'save_post', $this );
$db_fields = array();
foreach( $new_values as $field_key => $value ) {
$db_fields[$field_key] = get_field( $field_key, $post_id );
}
// Serialize the value arrays from $new_values and the Database, so that they are single-level arrays, and array_diff_assoc them to generate the array of differences...
$callback ( empty( array_diff_assoc( array_map( 'serialize', $fields ), array_map( 'serialize', $db_fields ) ) ) );
} );
if ( $post_id == null ) {
update_field( $field_key, $value );
} else {
update_field( $field_key, $value, $post_id );
}
}
function my_acf_save_post_callback( $success ) {
// Do what you'd like here
}
function my_func() {
// We need to update a value here
my_acf_update_field_wrapper( 'field_abcdef123456', 'new-value', 'my_acf_save_post_callback' );
}
————————–
Help your fellow forum-goers and moderation team; if a response solves your problem, please mark it as the solution. Thank you!
Hi Jonathan,
Thanks for your reaction and i’m going to try your code right now!
Is there also a way i can also return a Error when there is no Succes? Preferably also with an error code for me as a developer to keep everything stabble.
Thanks again
Or what is the proper way to inform the frontend that the code is succesfully updated or added?
That sounds tricky; I think I need to know more about your use case.
Could you give me a basic walkthrough of what you are trying to do? It will let me come up with a better solution for you 🙂
I want logged in users to edit their posts that have extra fields but they don’t get succes or error messages when the fields are or aren’t updated. Returning an error is also vey helpful for me if something goes wrong so i can fix it.
Also this ‘fields’ consist out of a repeater field and i already had some trouble with not adding and it took a long time to figure out why.
So these are editors or contributors editing their own posts in the backend with ACF fields? Or is it a frontend form using acf_form()?
Frontend and without the acf_form() so i can style it properly.
Hi woutervanerp;
I apologize for the long delay between now and my last response, things have been a bit hectic on my end.
I’m not sure how you are executing your update if you aren’t using acf_form() to render the frontend form. If you are trying to update the post via standard WP functions, the acf action above won’t be fired.
If you are absolutely sure you cannot use acf_form, then you would need to be properly serializing everything when storing to the database.
That all said, as a frontend form, you would want to use the original version but with the standard save_post action as the hook instead of acf/save_post. You would also want to check for the proper form element names instead of $_POST[‘acf’][*].
Depending on how you code this (I am assuming AJAX), you could return a status code in several different ways. The easiest in an AJAX call would be to add a json_encode followed by wp_die() at the end of your success callback.
echo json_encode( array(
'success'=> $success
) );
wp_die();
i just use update_field() at the moment and i don’t use ajax.
So i make the form and update with $_POST.
update_field returns true on success and false on failure, but considers a useless update (meaning the value has not changed) failure.
You could call update_field, and then compare the new value in $_POST to the value returned by get_field to see if the update actually took place correctly, and return a message based on that test.
The underlying code is using WordPress’ update_metadata function; you could probably get the last MySQL error (maybe using $wpdb->last_error?) to get a more detailed error message on why an UPDATE statement failed.
Hmm that’s alot of work and ugly code. First of all thank you for responding to my question. By your answers i was curious how to communicate with ACF trough Ajax?
Didn’t quite see that in the documentation or tutorials. If i would have more control over my ACF fields trough ajax that would great!
Is it hard to update and request fields trough ajax? and can i check for changes?
So that more people on one page can see the change’s without reloading the page.
It isn’t so much more control, as it is a better frontend experience. People typically don’t want the entire page to have to refresh these days when submitting a form that shouldn’t change the rest of the page layout.
Wordpress has builtin capabilities for adding custom AJAX function endpoints.
You can add an AJAX handler using this code:
// Sent from admin_users
add_action( 'wp_ajax_my_ajax_action', 'my_ajax_handler' );
// Sent from non-admin and anonymous users
add_action( 'wp_ajax_nopriv_my_ajax_action', 'my_ajax_handler' );
function my_ajax_handler() {
// Access $_POST to see what your javascript sent to the AJAX endpoint here
$result = array(
'success' => false,
'errorMessage' => 'Uh oh! An error has occurred...'
);
// Manipulate your custom fields here, modifying $result as necessary
echo json_encode( $result );
// Note that AJAX handlers should exit() or wp_die() instead of returning
wp_die();
}
wp_localize_script( 'your-js-script-id', 'ajax_object', array(
'ajax_url' => admin_url( 'admin-ajax.php' )
) );
You may call this handler by sending an AJAX POST to the ajax_object.ajax_url defined above with action set to my_ajax_action (note that this is the suffix of the add_action calls’ action name.
For example:
var data = {
'action': 'my_ajax_action',
'someOtherData': 0
};
jQuery.post(ajax_object.ajax_url, data, function(response) {
response = JSON.parse(response);
if (response.success) {
// Success processing
} else {
// What to do on failure....
}
});
The topic ‘Callback for update succes’ is closed to new replies.
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
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 Privacy Policy. If you continue to use this site, you consent to our use of cookies.