2017-07-03 35 views
2

我正在使用WordPress,我试图用纯javascript代替我的jQuery函数。然而,阿贾克斯呼吁给我的问题。这是我成功的jQuery和我不成功的JavaScript:通过AJAX以纯Javascript发送WordPress对象

原始的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识别其他变量(action,page)。否则,我只需要循环变量正确编码/解码。

这里的变量是否有帮助:

<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

我的ajax有点生疏,但是如果你发送一个查询字符串,你的请求不应该是'GET'而是'POST'吗? –

+0

我只是想复制jquery发送的内容。 –

+0

为什么用JS代替jQuery – GNANA

回答

0

想通了。我没有正确解析请求。我需要添加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); 
    ... 
} 

希望这有助于如果有人尝试类似的东西。