我在WordPress工作,我试图用纯javascript替换我的jQuery函数。但是,ajax调用给我带来了麻烦。这是我成功的jQuery和我不成功的JavaScript:
原始JQuery
jQuery.ajax({
url: locals.ajax_url,
method: 'post',
context: this,
data: {
action: 'get_more_posts',
page: page,
loop: typeof loop !== 'undefined' ? loop : locals.wp_query
}
});
新JavaScript
var req = new XMLHttpRequest();
req.open('POST', locals.ajax_url, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
var l = typeof loop !== 'undefined' ? loop: locals.wp_query;
var s = 'action=get_more_posts&page=' + page + '&loop=' + encodeURIComponent(JSON.stringify(l));
req.send(s);
jQuery有效,但是javascript没有正确处理循环变量(变量" l")。
jQuery发送一个HTTP请求,如下所示:
action=get_more_posts&page=2&loop%5Bquery%5D%5Bpage%5D=&loop%5Bquery%5D%5Bpagename%5D=blog&loop%5Bquery_vars%5D%5Bpage%5D=0&loop%5Bquery_vars%5D%5Bpagename%5D=blog&loop%5Bquery_vars%5D%5Berror%5
但javascript版本发送的内容如下:
action=get_more_posts&page=2&loop=%7B%22query%22%3A%7B%22page%22%3A%22%22%2C%22pagename%22%3A%22blog%22%7D%2C%22query_vars%22%3A%7B%22page%22%3A0%2C%22pagename%22%3A%22blog%22%2C%22error
所以jQuery发送方括号,而javascript发送波浪形括号(等等)。
我知道有几种方法可以解决这个问题,但我无法让它们发挥作用。我很乐意将请求标题更改为" application / json",但是我无法通过wordpress来识别其他变量(操作,页面)。否则,我只需要循环变量来正确编码/解码。
这是变量,如果有帮助:
<script>var loop = <?= json_encode($loop); ?>;</script>
这是PHP函数,如果它有帮助(适用于jQuery版本):
function get_more_posts() {
$args = $_REQUEST['loop']['query'];
$args['paged'] = $_REQUEST['page'];
$loop = new WP_Query($args);
...
}
不确定我是否需要在php或javascript中进行更改,但答案可能不涉及任何外部库,请记住我正在使用WordPress。如果您需要更多信息,请与我们联系。提前谢谢。
答案 0 :(得分:1)
想出来。我没有正确解析请求。我需要添加stripslashes,然后我错过了json_decode的第二个参数来返回数组而不是对象。
function get_more_posts() {
$loop = json_decode(stripslashes($_REQUEST['loop']), true);
$args = $loop['query'];
$args['paged'] = $_REQUEST['page'];
$loop = new WP_Query($args);
...
}
希望如果其他人尝试类似的东西,这会有所帮助。