这似乎是一个普遍的问题。我已经在Google上搜索了Stack Exchange,但没有找到任何对我的情况有帮助的解决方案。
Problem: When trying to use Ajax with admin-ajax.php, I always get the error 400.
POST https://www.example.com/wp-admin/admin-ajax.php 400
这就是我想要实现的目标:
我正在用我定制的主题为我的客户建立一个网站。我创建了自定义帖子类型,自定义帖子状态为“已存档”。我试图在自定义帖子列表中添加一个带有按钮的新列。使用此按钮,管理员可以通过单击将自定义帖子设置为存档。
下面是代码的简化版本。我在这里删除了不相关的代码。
<?php
add_action( \'wp_ajax_set_post_archived\', \'set_post_archived\' );
add_action( \'admin_footer\', \'set_post_archived_js\' );
function set_post_archived_js() {
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$(\'.set-archived-button\').click(function(event){
event.preventDefault();
var data = {
action: \'set_post_archived\',
post_id: $(this).data(\'post_id\'),
};
jQuery.post(
ajaxurl, data,
function(response) {
alert(\'Got this from the server: \' + response);
});
});
});
</script>
<?php
}
function set_post_archived()
{
// The function code here...
wp_die();
}
按钮代码为
<a href="#" data-post_id="70" class="button set-archived-button">Archive</a>
中的Post id
data-post_id
动态创建。
如前所述,此代码位于后端,因此wp_ajax_nopriv_{action_hook}
不应该是必需的。
Background-info
我两者都试过了
jQuery.post()
和
jQuery.ajax()
. 看来没什么区别。下面是如何加载代码(如果重要的话)。
在里面functions.php
:
if ( is_admin() ) {
// Only if on backend
require get_template_directory() . \'/admin/admin-functions.php\';
}
在中
/admin/admin-functions.php
:
global $pagenow;
if ( $pagenow == \'edit.php\' || $pagenow == \'post.php\' ) {
require get_template_directory() . \'/admin/machines-functions.php\';
}
Ajax的实际代码在文件中
/admin/machines-functions.php
.