我正在尝试在我的网站上实现过滤系统。我决定通过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。
最合适的回答,由SO网友:Sally CJ 整理而成
像我这样以表格形式传递数据是否合适?
如果你是说body
您的fetch()
打电话),然后是的,没关系。
然而
- 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 ) );