PAGINATE_LINKS方法没有显示我的自定义wp_查询的第二页

时间:2019-05-28 作者:Perl

我正在尝试使用wp\\u查询创建自定义搜索页面。我正在使用post方法获取搜索值。起初,搜索做得很好,但当我得到超过4篇文章的搜索结果(我设置每页显示4篇文章)并尝试访问结果的第二页时,它会返回到正常的查询结果(没有搜索值)。这是我的代码:

if (isset($_POST[\'btn_search\'])) {

    $by_year = $_POST[\'sel_year\'];
    $by_platform = $_POST[\'sel_platform\'];
    $by_title = $_POST[\'txt_title\'];
    $by_genre = $_POST[\'txt_genre\'];

    if ($by_year!=""&&$by_platform!="") {
        $by_year = $by_year."+".$by_platform;
    }


}
我将平台和年份字段组合在一起,因为它们都在类别中。这里是查询:

$currentPage = get_query_var(\'paged\');

    $allGames = new WP_Query(array(
        \'category_name\' => $by_year,        
        \'posts_per_page\' => 4,
        \'tag\' => $by_genre,
        \'paged\' => $currentPage,
        \'s\' => $by_title

    ));


    if ($allGames->have_posts()) {

        while ($allGames->have_posts()) {
            $row_counter++;
            $post_count++;
            $row_start = "";
            $row_end = "";

            $allGames->the_post();

            if ($row_counter!=2) {
             $row_start = \'<div class="row"><div class="card-deck">\';

            } else {
                $row_end=\'</div></div><br>\';
                $row_counter=0;
            }

            if ($post_count==$allGames->post_count) {
                $row_end=\'</div></div><br>\';
                $row_counter=0;
                $post_count=0;
            }

            echo $row_start;
            echo \'<div class="col-md-6 col-sm-12 text-center">
                    <!-- Card -->
                    <div class="card special-color">
                      <!-- Card image -->
                      <div class="view overlay zoom">
                          <img class="card-img-top" src="\'.get_the_post_thumbnail_url().\'" alt="Card image cap">
                          <a href="#!">
                            <div class="mask rgba-white-slight"></div>
                          </a>
                      </div>
                      <!-- Card content -->
                      <div class="card-body">
                        <!-- Title -->
                        <h2 class="card-title"><a class="text-white-50" href="\'.get_the_permalink().\'">\'.get_the_title().\'</a></h2>
                        <!-- Text -->
                        <p class="card-text">\'.get_the_excerpt().\'</p>
                        <!-- Button -->
                        <a href="#" class="btn blue-grey btn-block">View</a>
                      </div>
                    </div>
                    <!-- Card -->
                </div>\';
            echo $row_end;

            }


        }


        ?>

        <div class="text-center">
        <?php
        echo paginate_links(array(
            \'total\' => $allGames->max_num_pages
        ));

        wp_reset_postdata();
        ?>
        </div>
我希望尽快得到答复。我非常需要:(。提前谢谢!

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

如果使用主查询并使用pre_get_posts.

所以首先,使用search.php 作为模板,并使用主查询。所以没有new WP_Query(), 并使用have_posts()the_post() 函数,而不是方法。

因此,您的模板(简化)如下所示:

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        // etc.
    }
}

echo paginate_links();

wp_reset_postdata();
然后更改txt_title 要使用本机的字段s 搜索的名称。

然后,要处理额外的搜索参数,请使用pre_get_posts 挂钩:

function wpse_338980_search( $query ) {
    if ( is_admin() ) {
        return;
    }

    if ( $query->is_search() ) {
        $query->set( \'posts_per_page\', 4 );

        if ( isset( $_POST[\'sel_year\'] ) && isset( $_POST[\'sel_platform\'] ) ) {
            $query->set( \'category_name\', $_POST[\'sel_year\'] . \'+\' . $_POST[\'sel_platform\'] );
        }

        if ( isset( $_POST[\'txt_genre\'] ) ) {
            $query->set( \'tag\', $_POST[\'txt_genre\'] );
        }
    }
}
add_action( \'pre_get_posts\', \'wpse_338980_search\' );
这样做意味着主查询将根据您的搜索参数进行适当过滤,并且由于它是主查询,分页功能将立即运行。

相关推荐

如何为class-wp-query.php追踪这些PHP通知和警告的原因?

我的WordPress调试。日志文件中充满了这些PHP通知,间隔大约15分钟,然后是几个小时…[23-Mar-2018 05:33:00 UTC] PHP Notice: Trying to get property of non-object in /home/mysite/public_html/wp-includes/class-wp-query.php on line 3736 [23-Mar-2018 05:33:00 UTC] PHP Notice: Trying to get p