I'm using acf_form() to embed a form in a metabox on the admin page using this code (simplified):

$submitted_user_id = 'user_3'; $form_settings = array( 'fields' => ['field_625008b509dca'], 'form_attributes' => array( 'method' => 'POST', 'action' => admin_url("admin-post.php"), ), 'post_id' => $submitted_user_id, ); acf_form( $form_settings ); 

..and calling the requisite acf_form_head() in admin_init as such:

function append_acf_form_head() { acf_form_head(); } add_action( 'admin_init', 'append_acf_form_head', 1 ); 

This works fine, and updates the values on submit. However I want to pull this form in via ajax, in order to pass the user_id from a select filter above.

The ajax is also working perfectly, and pulling in the form with the passed user_id, however on submission the form does not save the data, and redirects to 'wp-admin/admin-post.php'.

This is the php code for the ajax functionality in functions.php:

add_action( 'wp_ajax_test_action', 'test_action' ); function test_action() { // Same acf_form() function as above wp_die() } 

And finally the JS:

$('button#support-ticket-user-filter').on('click', function(e) { e.preventDefault(); var data = { 'action': 'test_action', 'user_id': $('select#get_user_id').val() }; $.post(ajaxurl, data, function(response) { $('#listings-result').append( response ); }); }); 

Any ideas why it would work perfectly in the first case, but not in the second? Perhaps it's related to the ajaxurl?

Many thanks!

2

1 Answer

For anyone looking for the solution; I've found a slightly hacky approach which does the trick for now. The ACF Support team mentioned this wasn't out the box functionality but has now been included as a feature request. For those trying to achieve this the trick is to permanently embed a 'dummy form' which loads the necessary stuff to make it all work - then kind of hook this into the form pulled in via ajax:

So, in the meta box a permanent dummy form is embedded:

// This dummy form is required to load all the acf stuff for the ajax version $dummy_form_settings = array( // Do not declare any fields 'post_id' => $submitted_user_id, // Make sure the ID corresponds ( for users in my case ) 'form' => true, ); acf_form( $dummy_form_settings ); 

All we want from this dummy form is the 'update' button - which is the one that actually works, as opposed to the one in the form pulled in via ajax. So that function will remove the submit button like this:

$form_settings = array( 'fields' => ['field_625008b509dca'], 'form_attributes' => array( 'method' => 'POST', ), 'html_before_fields' => sprintf( '<input type="hidden" name="user_id" value="' . $submitted_user_id . '">', ), 'post_id' => $submitted_user_id, 'form' => true, 'html_submit_button' => '', // The important bit ); acf_form( $form_settings ); wp_die(); 

Now your essentially left with a single form that submits properly.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.