WordPress admin-ajax.php 400错误请求

时间:2021-09-23 作者:NCTI

我尝试用ajax运行wp表单,但控制台返回wordpress admin ajax。php 400错误请求。

 jQuery(function ($) {
        $(document).ready(function () {
    
    
            jQuery(\'#form_add_to_cart\').on(\'submit\', function () {
                
                jQuery.ajax({
                    url: \'https://domain.com/wp-admin/admin-ajax.php\', 
                    method: \'post\',
                    contentType : \'application/json; charset=utf-8\',
                    data: $("#form_add_to_cart").serializeArray(),
                    success: function (response) {
                        alert(response);
                    },
                    fail: function (err) {
                        alert("There was an error: " + err);
                    }
                });
                return false;
            });
        });
    });
这是我的功能。php文件:

add_action(\'wp_ajax_send_form\', \'send_form\'); // This is for authenticated users
add_action(\'wp_ajax_nopriv_send_form\', \'send_form\'); // This is for unauthenticated users.

function send_form(){
    if (isset($_POST[\'send_form\'])){
        echo\'ok\';
    }
    else{
        echo \'bad\';
    }
}
和我的表格:

            <form name="form_add_to_cart" method="POST" class="form_product" id="form_add_to_cart" action="">

                        <input hidden="hidden" name="action" id="add_product_to_cart"
                               value="send_form">
                        <input class="btn btn-primary" type="submit"
                               name="add_to_cart-<?php echo $product_id; ?>" id="add_to_cart"
                               value="Dodaj">
所有形式:https://pastebin.com/YJXTjGjJ

工作:

jQuery(function ($) {
        $(document).ready(function () {


            jQuery(\'#form_add_to_cart\').on(\'submit\', function () {

                jQuery.ajax({
                    url: \'https://domain.com/wp-admin/admin-ajax.php\', 
                    method: \'post\',
                    data: $("#form_add_to_cart").serializeArray(),
                    success: function (response) {
                        alert(response);
                    },
                    fail: function (err) {
                        alert("There was an error: " + err);
                    }
                });
                return false;
            });
        });
    });

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

你的full form code 包含名为的隐藏输入action 具有值send_form.

然而,由于contentType JS脚本的一部分,它将表单数据作为JSON负载提交,但请注意admin-ajax.php 端点不支持JSON负载,因此$_REQUEST[\'action\'] 将为空,除非您将其添加到URL查询字符串中,因此WordPress不知道AJAX操作是什么。因此,只要从JS代码中删除以下内容,错误就会消失:

contentType : \'application/json; charset=utf-8\', // remove this
此外,您的表单没有名为send_form, 所以在你的send_form() 函数,此操作将失败:if (isset($_POST[\'send_form\'])). 因此,您应该将输入添加到表单中或更改if 条件

还有,你应该打电话wp_die() 在函数末尾退出页面并阻止WordPress打印0 (零)。

SO网友:Buttered_Toast

在data属性中,需要传递要与其余数据一起调用的操作
基于您的ajax操作,您的操作应该是send_form

data: {
    action: \'send_form\',
    formData: $("#form_add_to_cart").serialize()
}
现在在php回调函数中,您可以执行以下操作print_r($_POST) 查看post请求包含的内容。