通过AJAX在WordPress中获取更多帖子

时间:2013-08-14 作者:Beowulfenator

在post archives和其他列表(如搜索结果)中获取下一页的最佳方式是什么?

这个问题已经被问过很多次了,但答案对我来说还不够好。到目前为止,我找到了两种方法。

使用对标准URL的AJAX请求(如example.com/category/mycat/page/2). 这是使用$.load JQuery的函数,它将结果剥离,只留下具有指定id的某些块的内容。我认为这对客户端(因为加载和处理了不必要的内容)和服务器(因为这样的请求处理不需要的菜单、小部件等)都是低效的。

使用自定义ajax处理程序add_action 作用这个选项的最大问题是处理程序不是通用的!它绕过了正常的查询解析,创建了一个WP_Query 对象。显然,这不是办法。

我正在考虑以下事项:

注册一个查询变量,使模板以JSON格式显示页面,并发出如下请求:example.com/category/mycat/page/2?showjson=true. 在主题中,检查此变量并相应地调整输出。

获取query_vars 和使用wp_localize_script 将它们传递给脚本。然后使用这些变量进行AJAX调用,并适当地处理它们。(基本上,这将是上述选项2的增强版)。

那么也许还有其他方法可以做到这一点?

添加:制作自定义处理程序可能会用来提高性能,因为并非所有Wordpress都需要加载。

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

我最终修改了档案。php文件,在正常请求时通过ajax提供不同的内容。

if ((isset($_SERVER[\'HTTP_X_REQUESTED_WITH\']) && strtolower($_SERVER[\'HTTP_X_REQUESTED_WITH\']) == \'xmlhttprequest\')) {
    $response = array();
    $response[\'posts\'] = \'\';
    if (have_posts()) {
        ob_start();
        while (have_posts()) {
            the_post();
            get_template_part(\'content\');
        }
        $response[\'posts\'] .= ob_get_clean();
    } else {
        //no posts
        $response[\'posts\'] .= \'nothing\';
    }
    echo json_encode($response);
} else {    
    //normal template code here
}
之后,通过JS获取项目很容易:

$.ajax ({
    type: "GET",
    url: more_ajax_url,
    data: {},
    dataType: \'json\',
    success: function (result) {
        $(\'#archive_container\').append(result.items);
    }
});
还有一些代码可以将链接传递到下一页,但这应该不难实现。

此方法的优点是请求由wordpress及其所有过滤器和操作完全处理。它比$.load, 因为没有从服务器传递不必要的数据。

结束