不显示第2页结果的自定义WP_Query的分页

时间:2018-10-04 作者:danielle

我知道这个问题已经被问过很多次了,从上午11点到晚上9点,我一整天都在尝试我遇到的每一个答案,我被卡住了。

这是我的搜索页面http://tribute-software.com/development/?s=1991

正如你所看到的,现在的搜索是针对1991年的。我在页面上打印了一些数据,这样可以帮助我们调试。它在打印的数据中显示了正确的10篇文章,并计算了正确的页数(2)--(我在后端将每页的文章数设置为4篇)。

单击第2页时,我无法获得任何结果。但当我搜索一个名字“Danielle”时,第2页就可以了。我已经在模板中重写了很多内容,并逐渐意识到,如果我的搜索来自post\\u标题,它将只显示第2页的结果。

通过查看页面,让我知道是否有任何明显的内容。我将在下面发布代码:

global $wp_query; /*were only keeping this so we can grab the s variable*/
//$numPostsFound =  $wp_query->found_posts;

/*\'s\' is what the user typed in the search bar*/
$string = $wp_query->query[\'s\'];

//adhere to paging rules
$paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1; 

//Get all \'fallen_hero\' posts to start
$args = array(
    \'post_type\'     => \'fallen_hero\',
    \'meta_key\'      => \'hero_last_name\',
    \'meta_type\'     => \'\',
    \'orderby\'       => \'meta_value\',
    \'order\'         => \'ASC\',
    \'post_status\'   => \'publish\',
    \'posts_per_page\' => -1,
);
$origPosts = new WP_Query( $args );

$posts1 = $origPosts->get_posts();
$ids = []; //array to store the id\'s of the wanted posts

/*Go through each post and check*/
foreach($posts1 as $post) {
    setup_postdata( $post );

    $classDate = get_field(\'class\'); //search if it matches class date
    $fullName = $post->post_title; //search if it matches post title

    //if its a match to one of the 2, add the ID to the array
    if((stripos($fullName, $string) > -1) || $classDate == $string){
        $ids[] = $post->ID;
    }

}
wp_reset_postdata();

if (!empty($ids)) { //search the array of good IDs
    /*make new query with the right IDs - need to do this to make pagination work*/
    $args = array(
        \'post__in\'      => $ids,
        \'post_type\'     => \'fallen_hero\',
        \'meta_key\'      => \'hero_last_name\',
        \'meta_type\'     => \'\',
        \'orderby\'       => \'meta_value\',
        \'order\'         => \'ASC\',
        \'post_status\'   => \'publish\',
        \'paged\'         => $paged,
    );
    $results = new WP_Query( $args );

    print_r($results);


    //this is for the pagination at the bottom
    $numPostsFound = count($ids);
然后在同一模板中

if ( function_exists(\'html5wp_cpt_pagination\') ) {
    html5wp_cpt_pagination($results, $numPostsFound);
}
最后是我的自定义post类型分页(由我之前的其他人编写)

function html5wp_cpt_pagination($cpt_query, $numPostsFound){
    $big = 999999999;

    if($cpt_query->max_num_pages){
        $maxpages = $cpt_query->max_num_pages;
    }else{
        //$maxpages= 20;
        //echo $numPostsFound;
        $maxpages = ceil($numPostsFound/get_option( \'posts_per_page\' ));
    }

    $paginate = paginate_links( array(
        \'base\' => str_replace($big, \'%#%\', get_pagenum_link($big)),
        \'type\' => \'array\',
        \'format\' => \'?paged=%#%\',
        \'current\' => max(1, get_query_var(\'paged\')),
        \'total\' => $maxpages,
        \'prev_text\' => __(\'«\'),
        \'next_text\' => __(\'»\'),
    ));


    if ($maxpages > 1) : ?>
<ul class="pagination">
    <?php foreach ( $paginate as $page ) {
    echo \'<li>\' . $page . \'</li>\';
    } ?>
</ul>
<?php
    endif;
}
EDIT步骤->1)从主查询(搜索查询)中获取“s”变量,以便我们可以将其与自定义帖子类型进行比较

2) 获取所有Fally\\u heroes帖子类型(是的,我知道我可以在这一部分中搜索元值,但我尝试扩展它,因为它没有那样工作)

3) 从上面收集的帖子中,搜索“s”字符串是否与字段“class”(用于class date)匹配,或者是否与人的姓名匹配(在本例中,我使用post\\u title)

4) 将所有匹配项添加到id[]数组,以便跟踪

5) 最后,使用ID数组查询所有Fally\\u hero帖子类型,但也要使用$paged,因为我们需要在此处进行分页。

1 个回复
SO网友:Milo

与其尝试使用默认的搜索查询,我将采用不同的方法,创建一个自定义搜索功能。

首先,在本例中,我们添加了一个新的自定义搜索查询varsearch_var. 然后,我们添加了几个重写规则,这样我们就可以有如下URL:

http://example.com/custom-search/1991/
http://example.com/custom-search/1991/page/2/
使用此功能:

function wpd_custom_search_rules() {
    add_rewrite_tag(
        \'%search_var%\',
        \'([^/]+)\'
    );
    add_rewrite_rule(
        \'custom-search/([^/]+)/?$\',
        \'index.php?post_type=fallen_hero&search_var=$matches[1]\',
        \'top\'
    );
    add_rewrite_rule(
        \'custom-search/([^/]+)/page/?([0-9]{1,})/?$\',
        \'index.php?post_type=fallen_hero&search_var=$matches[1]&paged=$matches[2]\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_custom_search_rules\' );
别忘了flush rewrite rules 添加这些之后。您还需要更新搜索表单以使用此新的查询变量/模式。

以上规则只是为我们的帖子类型设置了基本的主查询,WordPress基本上将其标识为帖子类型档案。

下一步是修改这些主要查询,以提供我们想要的帖子。您可以将大部分现有查询代码粘贴到此处,然后将生成的ID数组传递给主查询:

function wpd_custom_search_query( $query ) {
    if ( isset( $query->query[\'search_var\'] ) ) {
        // your custom query code would go here
        $post_ids = [23,42,66];
        $query->set( \'post__in\', $post_ids );
    }
}
add_action( \'pre_get_posts\', \'wpd_custom_search_query\', 10, 2 );
您不必担心分页,因为现在分页是自动进行的。如果您想为这些文件创建一个不同于post类型存档模板的特定模板,您可以filter the template hierarchy 然后注入一个新的。只要检查一下get_query_var(\'search_var\') 包含要知道的内容,您正在为其中一个搜索请求提供服务。

结束

相关推荐

Custom Pagination is Broken

下午好我正在为网站添加分页功能,目前工作正常,但由于某些原因,该功能会加载一个额外的页面。我们有7篇文章,我将其设置为每页显示4篇文章。然而,问题是分页加载了第三个不显示帖子的页面。我只是想知道为什么会这样,我怎么才能解决它?下面是我的意思的一个活生生的例子:http://weightcreative.com/blog http://weightcreative.com/blog/page/2http://weightcreative.com/blog/page/3以下是我的帖子页面中的代码:<?p