为档案和搜索结果组合WordPress分页功能

时间:2019-09-14 作者:MultiformeIngegno

我目前正在更新一个旧的WordPress主题(一个独立的主题,不是任何官方主题的产物)。尝试构建分页时,我发现创建一个既适用于存档又适用于搜索的功能时存在一些问题。第一个代码段可以很好地处理归档(类别、循环等):

function pagination_bar() {
    global $wp_query;

    $total_pages = $wp_query->max_num_pages;

    if ($total_pages > 1){
        $current_page = max(1, get_query_var(\'paged\'));

        echo paginate_links(array(
            \'base\'      => get_pagenum_link(1) . \'%_%\',
            \'format\'    => \'page/%#%\',
            \'current\'   => $current_page,
            \'total\'     => $total_pages,
            \'prev_text\' => __(\'« Previous page\'),
            \'next_text\' => __(\'Next page »\'),
        ));
    }
}
问题是,如果我在搜索结果页面中使用,链接最终会domain.com/?s=QUERYpage/2 (虽然应该是domain.com/page/2/?s=query)

因此,我创建了一个自定义函数,用于搜索中的分页:

function pagination_bar_search() {
    global $wp_query;

    $total_pages = $wp_query->max_num_pages;

    if ($total_pages > 1){
        $current_page = max(1, get_query_var(\'paged\'));

        echo paginate_links(array(
            \'base\'      => get_home_url() . \'%_%\',
            \'format\'    => \'/page/%#%/\',
            \'current\'   => $current_page,
            \'total\'     => $total_pages,
            \'prev_text\' => __(\'« Previous page\'),
            \'next_text\' => __(\'Next page »\'),
        ));
    }
}
这两个功能都可以正常工作,但您对如何将这两个功能结合起来,使其在存档和搜索中都能正常工作有何想法?

我正在使用最新的WordPress(5.2.3)。

这是search.php 循环功能:

<?php
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
if ($wp_query->max_num_pages > 1)
echo \'Page \' . $paged.\' of \'.$wp_query->max_num_pages; 
?>

...

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

...

<?php endwhile; ?>

<?php pagination_bar_search(); ?>

3 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

Codex:

要将分页添加到搜索结果和存档中,可以使用以下示例:

<?php
global $wp_query;

$big = 999999999; // need an unlikely integer

echo paginate_links( array(
  \'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
  \'format\' => \'?paged=%#%\',
  \'current\' => max( 1, get_query_var(\'paged\') ),
  \'total\' => $wp_query->max_num_pages
) );
?>
基于此,我修改了你的函数:

function pagination_bar( $query = null ) {
    global $wp_query;

    $total_pages = $query ?
        $query->max_num_pages :
        $wp_query->max_num_pages;

    if ( $total_pages > 1 ) {
        $big = 999999999; // need an unlikely integer
        $current_page = max( 1, get_query_var( \'paged\' ) );

        echo paginate_links( array(
            \'base\'      => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
            \'format\'    => \'?paged=%#%\',
            \'current\'   => $current_page,
            \'total\'     => $total_pages,
            \'prev_text\' => __( \'« Previous page\' ),
            \'next_text\' => __( \'Next page »\' ),
        ) );
    }
}
它在档案和搜索结果方面都运行良好。

我还添加了对自定义查询的支持(即。new WP_Query), 例如,您可以:

$my_query = new WP_Query( array( ... ) );
pagination_bar( $my_query );

SO网友:Simo Patrek

即使使用了上述方法,我也面临着同样的问题,对我来说,问题不是来自WP\\u查询类或分页。

我刚发现offset 参数忽略并中断paged 参数和整个分页,问题是我不能放弃offset 参数,因为我的主题结构依赖于它。这件事有什么解决办法吗?谢谢

SO网友:Robert Went

为了保持相同的格式,而不是使用查询参数,我在函数中添加了一个检查,以查看是否在搜索页面上,并修改了基和格式。

/**
 * Numbered pagination
 */
function so_348298_pagination_links() {
    global $wp_query;

    $total_pages = $wp_query->max_num_pages;

    if ( $total_pages > 1 ) {
        $current_page = max( 1, get_query_var( \'paged\' ) );

        $base = get_pagenum_link( 1 ) . \'%_%\';
        $format = \'page/%#%\';

        if (is_search()) {
            $base = get_home_url() . \'%_%\';
            $format = \'/page/%#%/\';
        }

        echo \'<div class="pagination-links col-12 text-center mb-5">\' .
             paginate_links( array(
                 \'base\'    => $base,
                 \'format\'  => $format,
                 \'current\' => $current_page,
                 \'total\'   => $total_pages,
                 \'type\'    => \'list\',
             ) ) .
             \'</div>\';
    }
}

相关推荐

Show pagination in WP_Query

我正在编写一个foodblog,并试图在特定页面中显示收藏夹帖子列表,但我对分页有一些问题。我在前面的问题中尝试了不同的解决方案,但都没有解决问题。非常感谢 <?php $my_favs = get_user_meta(get_current_user_id(), \'user_favs\', true); $args = array( \'post_type\' => array(\'recipe\', \'post