子页面页面模板中WP_Query循环的分页

时间:2021-07-06 作者:Josh M

See edit at bottom.

我在自定义帖子类型(“success\\u stories”)的页面模板中有一个wp\\U查询循环。循环本身工作正常,但我似乎无法使分页工作正常。我已经尝试了在这些论坛上找到的所有解决方案,每次我尝试导航到/page/child-page/page/2/WordPress时,都会通过301重定向将我返回到/page/child-page/。

我当然已经冲洗过permalinks大约100次了。以下是我正在使用的代码:

<?php


if ( get_query_var(\'paged\') ) {
    $paged = get_query_var(\'paged\');
} elseif ( get_query_var(\'page\') ) { // \'page\' is used instead of \'paged\' on Static Front Page
    $paged = get_query_var(\'page\');
} else {
    $paged = 1;
}
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;

// Query arguments
$args = array(
    \'post_type\'             => array( \'success_stories\' ),
    \'posts_per_page\'        => \'3\',
    \'paged\'                 => $paged,
    \'ignore_sticky_posts\'   => true,
    \'tax_query\'             => array(
            array(
                \'taxonomy\' => \'practice_areas_taxonomy\',
                \'field\'    => \'ID\',
                \'terms\'    => array( 17 ),
            )
    )
);

// Instantiate custom query
$practice_area_query = new WP_Query( $args );

// Pagination fix
$temp_query = $wp_query;
$wp_query   = NULL;
$wp_query   = $practice_area_query;

// Output custom query loop
if ( $practice_area_query->have_posts() ) :

    echo \'<div>\';

    while ( $practice_area_query->have_posts() ) :
        $practice_area_query->the_post(); ?>

        <div class="<?php echo $pa_class_inner; ?>">

            <blockquote>&ldquo;<?php echo get_the_excerpt();?>&rdquo;</blockquote>


        </div>

    <?php endwhile;

    echo \'</div>\';

endif;


// Pagination
$total_pages = $wp_query->max_num_pages;
         
if ($total_pages > 1) {

    $big = 999999999;
    $current_page = max(1, get_query_var(\'paged\'));

    echo \'<nav class="pagination clearfix">\';

    echo paginate_links(
        array(
            \'base\' => str_replace($big, \'%#%\', esc_url(get_pagenum_link($big))),
            \'current\' => $current_page,
            \'total\' => $total_pages,
            \'prev_text\' => \'Prev\',
            \'next_text\' => \'Next\',
            \'mid_size\' => 1,
            \'end_size\' => 3
        )
    );

    echo \'</nav>\';   
}

wp_reset_postdata();

// Reset main query object
$wp_query = NULL;
$wp_query = $temp_query; ?> 
我哪里做错了?这不能从(孩子)身上做到吗页面模板?

编辑:添加以下重写规则几乎可以解决此问题:


// Primary Rewrite Rule
add_rewrite_rule( \'practice-areas/family-law/?\', \'index.php?post_type=success_stories\', \'top\' );
// Pagination Rewrite Rule
add_rewrite_rule( \'practice-areas/family-law/page/([0-9]{1,})/?\', \'index.php?post_type=success_stories&paged=$matches[1]\', \'top\' );
唯一的问题是(a)在分页的页面上,我突然在另一个模板(archive.php)中,(b)WordPress似乎默认为常规的wp\\U查询参数。也就是说,它是;“遗忘”;以上查询中的所有参数,以及偏移量,甚至分类查询。

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

很高兴你找到了一个解决方案,是的,确实有效。但您可以通过使用is_single( \'<parent slug>/<child slug>\' ), e、 g。is_single( \'family-law/success-stories\' ) 在你的情况下。

其次,这不完全是redirect_canonical <钩子(hook)导致在单数分页的贴子页面上进行(301)重定向(URL具有/page/<number>). 相反,它是the $addl_path partredirect_canonical() 函数redirect_canonical 钩更具体地说,该零件仅在以下情况下运行! is_single() 为true(当前页码为2或更多),因此:

如果请求(即当前页面)URL用于example.com/practice-areas/family-law/success-stories/page/2/ 哪里practice-areas 是CPT段塞和success-stories 是的孩子family-law, 重定向/规范URL将not 包含page/2/ 因为! is_single() 是假的,因此$addl_path 将为空。

同样的情况也会发生在example.com/practice-areas/family-law/page/2/ (即父帖子的第2页)和其他单数CPT页面,包括常规帖子(默认情况下post 类型),例如atexample.com/hello-world/page/2/, 但不在单数页上(帖子类型page) 因为! is_single() 为false-因为is_single() 适用于任何立柱类型,但attachmentpage.

因此,如果请求URL与规范URL不匹配,则WordPress会运行(301)重定向,这解释了为什么会发生这种情况:每次我尝试导航到/page/child-page/page/2/ WordPress将我发送回/page/child-page/ 使用301重定向;。

此外,redirect_canonical() 被钩住了template_redirect, 因此,与其让函数运行确定重定向/规范URL的各种逻辑,但最终返回一个空字符串,不如像这样禁用该函数:

add_action( \'template_redirect\', \'my_template_redirect\', 1 );
function my_template_redirect() {
    if ( is_paged() && is_single( \'family-law/success-stories\' ) ) {
        remove_action( \'template_redirect\', \'redirect_canonical\' );
    }
}
是的,不需要额外的重写规则,因为WordPress已经生成了它们(处理/page/<number>) 用于您的CPT。但我不知道WordPress为什么会这样做! is_single() 检查

最后但并非最不重要的是,在我最初的回答和评论中,我建议您删除$temp_query 部分内容,您的回答是:“我将保留$temp\\u查询位,因为它允许分页组件工作,而无需重写或使事情复杂化;和<我想你只是说不需要它;。

是的,第二句话你说得对。但更准确地说,我实际上测试了您的模板代码single-practice-areas.php 然后移除$temp_query 零件(和使用的$total_pages = $practice_area_query->max_num_pages;), 以及/page/<number> 在上面的帮助下,分页对我来说很好my_template_redirect() 作用

所以我想知道$temp_query 修复,或者为什么必须分配$wp_query$practice_area_query?

但如果你真的必须保留它,那么你需要移动wp_reset_postdata(); 至之后$wp_query = $temp_query;, i、 e.恢复全局$wp_query 变量返回到实际的主查询。否则,如果你the_title(), 您将在自定义查询中看到最后一篇文章的标题,而不是主查询中当前(也是唯一)的标题。

SO网友:Josh M

问题是redirect\\u规范过滤器。这导致301返回到子页面本身。

解决方案是有选择地禁用该过滤器。下面是我所做的,虽然没有我想要的那么有选择性。

但它确实允许分页工作,without the need of any rewrite rules.

// redirect_canonical is preventing pagination on PA child pages. This removes the filter in that context
add_filter( \'redirect_canonical\', \'namespace_prevent_redirect_on_pagination\', 10 );
function namespace_prevent_redirect_on_pagination( $redirect_url ) {
    if ( is_singular(\'practice-areas\') && !is_admin() && get_post()->post_parent ) {
        return \'\';
    }
 
    return $redirect_url;
}

相关推荐

pagination leads to 404 page

我想弄明白为什么我的分页没有显示出来,我快发疯了。我将设置场景:我有一个页面“category.php”。在这个页面中,我为所有分类帖子设置了一个自定义查询。它们是自定义帖子类型,并显示该类别的自定义帖子。我的问题如下:我已经尝试过这个函数:the_post_pagination();$category = get_category(get_query_var(\'cat\')); if ( get_query_var(\'paged\') ) { $paged = get_query_var(