管理页面上的 ACF acf_form 有效,但是当它通过 ajax 加载时它会中断
ACF acf_form on admin page works, but when it is loaded in via ajax it breaks
我正在使用 acf_form() 在管理页面的元数据框中嵌入一个表单,使用以下代码(简化):
$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 );
..并在 admin_init 中调用必需的 acf_form_head() ,如下所示:
function append_acf_form_head() {
acf_form_head();
}
add_action( 'admin_init', 'append_acf_form_head', 1 );
这工作正常,并在提交时更新值。但是我想通过 ajax 拉入此表单,以便从上面的 select 过滤器传递 user_id。
ajax 也工作得很好,并使用传递的 user_id 拉入表单,但是在提交时表单不保存数据,并重定向到 'wp-admin/admin-post.php'。
这是 functions.php 中 ajax 功能的 php 代码:
add_action( 'wp_ajax_test_action', 'test_action' );
function test_action() {
// Same acf_form() function as above
wp_die()
}
最后是 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 );
});
});
知道为什么它在第一种情况下可以完美运行,但在第二种情况下却不行吗?也许与 ajaxurl?
有关
非常感谢!
对于寻找解决方案的任何人;我发现了一种有点老套的方法,现在可以解决问题。 ACF 支持团队提到这不是开箱即用的功能,但现在已作为功能请求包含在内。对于那些试图实现这一点的人来说,诀窍是永久嵌入一个 'dummy form' 来加载必要的东西以使其全部工作 - 然后将其挂钩到通过 ajax:[=12= 拉入的表单中]
因此,在元框中嵌入了一个永久的虚拟表单:
// 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 );
我们想要从这个虚拟表单中得到的只是 'update' 按钮 - 这是实际起作用的按钮,而不是通过 ajax 拉入的表单中的按钮。因此该函数将像这样删除提交按钮:
$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();
现在您基本上只剩下一个可以正确提交的表单。
我正在使用 acf_form() 在管理页面的元数据框中嵌入一个表单,使用以下代码(简化):
$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 );
..并在 admin_init 中调用必需的 acf_form_head() ,如下所示:
function append_acf_form_head() {
acf_form_head();
}
add_action( 'admin_init', 'append_acf_form_head', 1 );
这工作正常,并在提交时更新值。但是我想通过 ajax 拉入此表单,以便从上面的 select 过滤器传递 user_id。
ajax 也工作得很好,并使用传递的 user_id 拉入表单,但是在提交时表单不保存数据,并重定向到 'wp-admin/admin-post.php'。
这是 functions.php 中 ajax 功能的 php 代码:
add_action( 'wp_ajax_test_action', 'test_action' );
function test_action() {
// Same acf_form() function as above
wp_die()
}
最后是 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 );
});
});
知道为什么它在第一种情况下可以完美运行,但在第二种情况下却不行吗?也许与 ajaxurl?
有关非常感谢!
对于寻找解决方案的任何人;我发现了一种有点老套的方法,现在可以解决问题。 ACF 支持团队提到这不是开箱即用的功能,但现在已作为功能请求包含在内。对于那些试图实现这一点的人来说,诀窍是永久嵌入一个 'dummy form' 来加载必要的东西以使其全部工作 - 然后将其挂钩到通过 ajax:[=12= 拉入的表单中]
因此,在元框中嵌入了一个永久的虚拟表单:
// 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 );
我们想要从这个虚拟表单中得到的只是 'update' 按钮 - 这是实际起作用的按钮,而不是通过 ajax 拉入的表单中的按钮。因此该函数将像这样删除提交按钮:
$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();
现在您基本上只剩下一个可以正确提交的表单。