Admin-ajax.php 400自定义主题错误

时间:2021-02-01 作者:Antti Tolvanen

这似乎是一个普遍的问题。我已经在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 iddata-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.

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

似乎只有在以下情况下才添加AJAX操作$pagenow (当前管理页/文件)为edit.phppost.php, 这是行不通的admin-ajax.php, 因此,您应该通过admin_init 如果您希望只在管理端添加操作,请钩住。例如。

add_action( \'admin_init\', function () {
    add_action( \'wp_ajax_set_post_archived\', \'set_post_archived\' );
} );

相关推荐

AJAX自定义发布筛选器未进行筛选

我试图编写一个ajax自定义后过滤器,但结果似乎不是过滤,我不确定哪里做错了。我将在下面提供相关代码。archive-projetos.php<div class="categories"> <ul> <li><a href="" class="js-filter-item">Todos</a></li> <