如何使我的自定义查询在第一页之后与搜索结果一起使用?

时间:2014-08-20 作者:Taylor

我使用一个自定义查询来ajax加载/附加额外的帖子,而不是像WP默认设置那样分页。但是,当我单击按钮加载更多帖子时,它会加载所有帖子,而不是与搜索结果匹配的帖子(而第一组帖子与搜索结果匹配)。如何在保留搜索查询的同时保持这种加载帖子的格式?

我成功地为我的分类页面执行了以下操作query_posts(array(\'cat\' => $category)); 但我不确定如何进行搜索。

按钮:

var pager = 1;
var search_load_posts = function(){  
    $.ajax({  
        type       : "GET",  
        data       : {pageNumber: pager, offset: 12},  
        dataType   : "html",  
        url        : "http://tay.is/designing/belmontvision/wp-content/themes/yamidoo/search-more-loop.php",  
        beforeSend : function(){},  
        success    : function(data){  
            var $data = $(data);  
            $container.append( $data ) .packery( \'appended\', $data );
            heightcalc();
            $container.packery();
        }
    });
};

$(\'.search-load-more\').click( function() {
    search_load_posts();
    pager++;
});
原始循环查询:

<?php if (have_posts()) : get_template_part(\'loop-search\'); ?>
顶部循环搜索(Loop Search.php):

<?php   $count = 1; while (have_posts()) : the_post();?>
其他后期查询(search more loop.php):

<?php   require_once(\'../../../wp-load.php\');   
        $page = (isset($_GET[\'pageNumber\'])) ? $_GET[\'pageNumber\'] : 0;
        $offset = (isset($_GET[\'offset\'])) ? $_GET[\'offset\'] : 0;

        $args = array ( \'posts_per_page\' => 12,);

        $last_twelve = get_posts($args);
        $last_twelve_ids = array();
        if( $last_twelve ) foreach( $last_twelve as $last_post ) { $last_twelve_ids[] = $last_post->ID; }

        query_posts(array(  
            \'paged\' => $page,
            \'post__not_in\' => $last_twelve_ids
        ));  

        while (have_posts()) : the_post(); ?>

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

在开始之前,我必须指出以下几点:

您正在主题中使用一个文件向发送AJAX请求,不要这样做,这会带来安全隐患。相反,使用WP-AJAX-API,您将能够删除一半代码并使其正常工作,而无需每次移动站点时都更改URLquery_posts 要进行查询,这几乎总是一件坏事。如果需要查询帖子,请使用get\\u posts或WP\\u查询对象。如果需要更改主查询的功能(例如,仅在主页上显示X),请使用pre_get_posts 筛选如果有一行包含if语句、for循环和赋值,这很糟糕,假设您在错误日志中被告知该行有错误,您如何知道是哪个部分导致了错误jQuery(document) 不$(document) )关于您的问题,您进行了查询,但您指定了:

query_posts(array(
    \'paged\' => $page,
    \'post__not_in\' => $last_twelve_ids
));
又名:

Show me all the posts on page X but not these posts: a,b,c,d,e,f, etc
您还没有指定搜索词是什么,那么它怎么知道呢?代码不是通灵的,这里也没有自动魔法来判断你在试图搜索什么,它需要被告知。

为此,lets look at the WP_Query codex page that lists all the possible parameters

基于关键字搜索显示帖子。

s(字符串)-搜索关键字这给了我们:

$query = new WP_Query(
    \'s\' => $search_term
    \'paged\' => $page,
    \'post__not_in\' => $last_twelve_ids
);
while ( $query->have_posts() ) {
    $query->the_post();
    // etc
但是我们在AJAX调用中没有传递搜索词,所以它怎么知道要搜索什么呢?我们需要这样的东西来接收它:

$search_term = (isset($_GET[\'searchterm\'])) ? $_GET[\'searchterm\'] : 0;
在AJAX调用中,您需要在此处更改javascript:

data       : {pageNumber: pager, offset: 12, searchterm: searchterm },
您需要分配searchterm 加载调用之前javascript中的一个值,如何实现这一点取决于html,但您尚未提供该值。

完成此操作后,您将获得所需的内容,但仍然存在以下问题:

主题内不安全的AJAX端点(使用WP AJAX API)

  • javascript中指向网站的硬编码路径(同样,WP AJAX API会解决此问题)
  • PHP,它不会验证输入,并可能导致注入攻击进一步阅读The Codex on WP AJAX
  • Using AJAX in WordPress - Smashing Magazine
  • You Don\'t Know Query - Andrew Nacin
  • The Codex on WP_Query
  • 结束

    相关推荐

    Add pagination to blog

    我想限制每页3个博客条目片段,并包括其他页面的分页。这是我到目前为止的情况,但分页不起作用。 <div id=\"page-content\"> <?php $args = array( \'posts_per_page\' =>3, \'order\'=> \'ASC\', \'orderby\' => \'title\' ); $postslist = get_posts( $args ); forea