Home › Forums › Front-end Issues › acf_form() and AJAX
Hi
I have been trying to call acf_form() in front end through AJAX. I have finally managed to get Edit to work flawlessly, but have some problems with inserting a new post. Whenever I insert a new post, whatever I enter will be stored in wp_option table and used as default for the next new post. Here’s portions of my code I thought would be relevant.
JavaScript to get the form and submit it back:
function newPost(contentType) {
document.getElementById(contentType + "_holder").innerHTML = "<div class='ajaxloading'> </div>";
jQuery(document).ready(function($) {
var data = {
action: 'new_post',
post_type: contentType,
security : MyAjax.security,
};
$.post(MyAjax.ajaxurl, data, function(response) {
document.getElementById(contentType + "_holder").innerHTML = response;
initACF(contentType);
});
});
return false;
}
function initACF(contentType) {
$(document).trigger('acf/setup_fields', [
$('#poststuff')
])
$('.acf-form').on('submit', (event) => {
event.preventDefault();
var form_data = {'action' : 'acf/validate_save_post', 'post_type': contentType};
jQuery('.acf-form :input').each(function() {
form_data[jQuery(this).attr('name')] = jQuery(this).val();
})
form_data.action = 'save_my_data';
$('html,body').css('cursor', 'wait');
jQuery.post(MyAjax.ajaxurl, form_data).done(function(save_data) {
$('html,body').css('cursor', 'default');
getContent(contentType);
})
});
}
php code to call acf_form and send it back to the ajax request:
function new_post_callback() {
check_ajax_referer('my-special-string', 'security');
switch ($_POST['post_type']) {
case "contacts":
$field_group = 80;
break;
case "vacations":
$field_group = 103;
break;
case "messages":
$field_group = 84;
break;
default:
wp_die();
}
$settings = array(
'id' => 'acf-form',
'post_id' => 'new_post',
'new_post' => array('post_type' => $_POST['post_type']),
'return' => '',
'field_groups'=>array($field_group),
'html_before_fields' => '',
'html_after_fields' => '',
'submit_value' => __("Insert", 'acf'),
'updated_message' => __("Post inserted", 'acf'),
'label_placement' => 'top',
'instruction_placement' => 'label',
'honeypot' => true,
'html_submit_button' => '<input type="submit" class="acf-button button button-primary button-large" value="%s" />',
'kses' => false
);
acf_form($settings);
wp_die();
}
add_action('wp_ajax_new_post', 'new_post_callback');
And here’s the code which saves new posts:
function my_acf_save_post($post_id) {
if ($post_id !== 'new_post') {
return $post_id;
}
$post = array(
'post_status' => 'private',
'post_type' => $_POST['post_type']);
switch ($_POST['post_type']) {
case 'contacts':
$fields = array('name'=>$_POST['fields'][NAME_FIELD], 'email'=>$_POST['fields'][EMAIL_FIELD]);
break;
case 'vacations':
$fields = array('date_from'=>$_POST['fields'][DATE_FROM_FIELD], 'date_to'=>$_POST['fields'][DATE_TO_FIELD]);
break;
case 'messages':
$fields = array('subject'=>$_POST['fields'][SUBJECT_FIELD], 'receipients'=>$_POST['fields'][RECEIPIENTS_FIELD], 'message'=>$_POST['fields'][MESSAGE_FIELD], 'release_in'=>$_POST[RELEASE_IN_FIELD]);
break;
default:
return $post_id;
}
$post_id = wp_insert_post($post);
foreach ($fields as $key => $value) {
update_field($key, $value, $post_id);
}
return $post_id;
}
Of interest is, I need to call this only for new posts, as edits work perfectly by simply using acf_form_head()
as the ajax action.
I would really appreciate any help. I tried to post this on wordpress.stackexchange.com but people there didn’t really think much of it and started down voting :'(
I have tracked this to line 201 of advanced-custom-fields/core/fields/_functions.php where it checks to see if the post id is not numeric and then writes store the values as default values. What I can’t understand is whether this is the expected behavior for ACF or not?
My ACF version is 4.4.12, and my WP is 4.9.4
You must be logged in to reply to this topic.
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’re reaching out to our multilingual users to ask for help in translating ACF 6.1. Help make sure the latest features are available in your language here: https://t.co/TkEc2Exd6U
— Advanced Custom Fields (@wp_acf) May 22, 2023
© 2023 Advanced Custom Fields.
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.