如何通过JS FETCH将数据发送到admin-ajax?

时间:2021-01-25 作者:MMPL1

我正在尝试在我的网站上实现过滤系统。我决定通过js来实现。我创建了fetch函数

let filters = document.querySelectorAll(\'.filters-item\');
let pageUrl = wp.page_url;
const postsContainer = document.querySelectorAll(\'.column.is-half.is-offset-1\');
filters.forEach( (item) => {
        item.addEventListener(\'change\', (e) =>{
            let url = pageUrl + \'/wp-admin/admin-ajax.php\';

            fetch(url, {
                method: \'POST\',
                headers: {
                    \'Content-Type\': \'text/html; charset=UTF-8\',
                },
                body: JSON.stringify({
                    \'test\': "sampledatatest",
                })
            }).then( function (response) {
                if(response.ok) {
                    return response.json();
                }
                return Promise.reject(response);
            }).then(function (data) {
                console.log(data);
            }).catch(function (error) {
                console.warn(\'Error\', error);
            });
        });
    });
在我的功能中。php文件我有简单的函数

add_action(\'wp_ajax_myfilter\', \'misha_filter_function\'); // wp_ajax_{ACTION HERE}
add_action(\'wp_ajax_nopriv_myfilter\', \'misha_filter_function\');

function misha_filter_function(){
    $t = $_POST[\'test\'];
    echo $t;

    die();
}
当我点击filter 我的开发控制台中出现错误400。我错过了什么?像我这样以表格形式传递数据是否合适?我不想使用jQuery。

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

像我这样以表格形式传递数据是否合适?

如果你是说body 您的fetch() 打电话),然后是的,没关系。

然而

  1. You must send a query named action 作为请求的一部分(例如,通过URL,如example.com/wp-admin/admin-ajax.php?action=test), 这样WordPress就知道它是什么AJAX操作,然后为该特定操作执行回调。

    看见here 更多信息,但在您的情况下,AJAX操作是myfilter 如中所示wp_ajax_myfilter 回调是misha_filter_function().

    Content-Type 标头与请求正文不匹配,您应该使用application/json 而不是text/html.

但是,即使有了正确的请求正文和标头admin-ajax.php 实际上不支持JSON请求,因此如果您想发送JSON请求,那么您应该使用WordPress REST API,您可能希望add a custom endpoint like my-plugin/v1/myfilter.

否则,如果您喜欢使用admin-ajax.php, 例如,您可以使用FormData() API in JavaScript 正确构建要发送到的表单数据admin-ajax.php:

var formData = new FormData();

formData.append( \'action\', \'myfilter\' );
formData.append( \'test\', \'foo bar baz\' );

fetch( url, {
    method: \'POST\',
    body: formData,
} ) // wrapped
    .then( res => res.text() )
    .then( data => console.log( data ) )
    .catch( err => console.log( err ) );