【问题标题】:Wordpress pagination issues with Custom Post Type and custom rewrite rule自定义帖子类型和自定义重写规则的 Wordpress 分页问题
【发布时间】:2019-12-09 14:48:04
【问题描述】:

我们使用最新的 WP (5.2.2)。我们有一个名为 Stories 的自定义帖子类型(slug:stories),在设置过程中具有以下功能。

    Public: true
    Publicly Queryable: true
    Show UI: true
    Has Archive: true
    Exclude From Search: false
    Hierarchical: false
    Rewrite: true
    Custom Rewrite Slug: stories/%category%
    Show in Nav Menus: true
    Show in REST API: true
    With Front: true
    Query Var: true

这很好用。例如,我们创建一个名为“Huckleberry Cafe Opens”的新故事并将其分配给一个名为“食物”的类别,并且 URL 有效:

site.com/stories/food/huckleberry-cafe-open

我们的永久链接设置为 /%category%/%postname%,但对于自定义帖子类型,我们还使用有用的插件 Permalink Manager Lite。这包含“permastructures”,我们使用与上述自定义帖子类型中的“自定义重写 slug”匹配的模式:

stories/%category%/%stories%

我们自然有一个分类页面,在archive-stories.php。这样,无论类别是食品、时尚还是家居维修,相同的整体主题都适用于这种自定义帖子类型。

问题在于分页。有了这个网站和posts like these 的一些有用的评论,我现在终于可以看到页码了。

问题: 点击第 2 页或之后的内容与第 1 页相同。

我使用了有用的 permalink debug script from Github,它确实告诉我“使用的模板”在第 1 页和第 2 页中有所不同。

第 1 页:/故事/食物 使用通常的category.php(为什么?这是自定义帖子类型!)

第 2 页:/stories/food/page/2 使用更可预测的archive-stories.php

请注意,这些类别在我们网站的所有自定义帖子类型中都是相同的。我们有自定义帖子类型,如故事、商店等。所有这些都被分配了相同的基本类别(食品、风格、家居维修......)。

在archive-stories.php 和category.php (目前,为了测试,完全相同的文件),我们在顶部有以下WP_Query:

<?php

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
        'post_type'      => 'stories',
        'orderby'        => 'date',
        'order'          => 'DESC',
        'posts_per_page' => 10,
        'post_status'    => array('publish', 'pending', 'draft'),
        'paged'          => $paged
    );

$the_query = new WP_Query($args);
while( $the_query->have_posts() ) : $the_query->the_post(); 

 ?>

 ......LOOP HERE.....

<?php


// DO THE "TOTAL PAGES" THING
$total_pages = $the_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'    => __('« prev'),
        'next_text'    => __('next »'),
    ));
}    


?>

这确实很好地显示了循环本身,并且正确显示了分页。但是点击第 2 页及以后的页面总是显示与第 1 页完全相同的页面。

顺便说一句,如果我们使用print_r($the_query); 转储 WP_Query(),我们会看到第 1 页和第 2 页所创建的 SQL 完全相同,这就解释了为什么页面相同。 LIMIT 子句中的“偏移”值始终为 0。在第 2 页上,这应该是 10,在第 3 页上,这应该是 20,等等。我们不确定为什么它是 0。

SELECT SQL_CALC_FOUND_ROWS  
    wp_posts.ID 
FROM wp_posts  
WHERE 1=1  
      AND wp_posts.post_type = 'stories' 
      AND ((wp_posts.post_status = 'publish' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending'))  
      ORDER BY wp_posts.post_date 
      DESC LIMIT 0, 10
;

如果有帮助,我们注意到我们需要 functions.php 中的以下代码才能使 /page/2 正常工作,否则会抛出 404。这是来自 plugin for Category Pagination Fix

     function remove_page_from_query_string($query_string)
    { 
        if (isset($query_string['name']) && $query_string['name'] == 'page' && isset($query_string['page'])) {
            unset($query_string['name']);
            // 'page' in the query_string looks like '/2', so i'm spliting it out
            @list($delim, $page_index) = explode('/', $query_string['page']);
            $query_string['paged'] = $page_index;
        }      
        return $query_string;
    }
    // I will kill you if you remove this. I died two days for this line 
    add_filter('request', 'remove_page_from_query_string');

    // following are code adapted from Custom Post Type Category Pagination Fix by jdantzer
    function fix_category_pagination($qs){
        if(isset($qs['category_name']) && isset($qs['paged'])){
            $qs['post_type'] = get_post_types($args = array(
                'public'   => true,
                '_builtin' => false
            ));
            array_push($qs['post_type'],'post');
        }
        return $qs;
    }
    add_filter('request', 'fix_category_pagination');

非常感谢您的任何指点!

【问题讨论】:

    标签: wordpress pagination custom-post-type


    【解决方案1】:

    我不确定它是否能解决您的问题,但您可以尝试在 $args 中设置偏移量

    $paged = get_query_var('paged') ? get_query_var('paged') : 1;
    $posts_per_page = 10;
    $offset = ( $paged - 1 ) * $posts_per_page;
    
    $args = array(
            'post_type'      => 'stories',
            'orderby'        => 'date',
            'order'          => 'DESC',
            'posts_per_page' => $posts_per_page,
            'post_status'    => array('publish', 'pending', 'draft'),
            'paged'          => $paged,
            'offset' => $offset
        );
    

    更改后尝试刷新您的永久链接。 Wordpress->设置->固定链接->保存

    清除缓存

    【讨论】:

    • 谢谢。它没有帮助,因为 page/2 现在是 404。但这是一个有用的提示,非常感谢。
    • @KhomNazid 也尝试刷新永久链接?可能会解决 404 问题
    • 谢谢。是的,我刷新永久链接的次数比我记得的要多:) 在这种情况下没有多大作用。
    【解决方案2】:

    我是永久链接管理器的作者。看起来您在这里发布了相同的问题,但之后没有回复: https://wordpress.org/support/topic/custom-post-type-pagination-issue/

    您的问题是您使用了错误的分页 slug。对于单个帖子、页面和自定义帖子类型项目,您不应使用 /page/,例如:

    /stories/food/huckleberry-cafe-opens/page/2

    但只是一个数字索引,例如:

    /stories/food/huckleberry-cafe-opens/2

    Wordpress 中有两个不同的分页端点。一个(paged)用于档案和术语,另一个(page)用于单个帖子: https://wordpress.stackexchange.com/a/180785/38240


    如果你还是想使用 /page/ 端点,你可以使用下面的代码 sn-p:

    function pm_adjust_pagination($request) {
        if(!empty($request['post_type']) && !empty($request['name']) && $request['paged']) {
            $request['page'] = $request['paged'];
            unset($request['paged']);
        }
    
        return $request;
    }
    add_filter('request', 'pm_adjust_pagination', 99);
    

    最好的问候, 马切耶

    【讨论】:

    • 感谢 Maciej 的所有帮助。我认为我的永久链接内容现在已整理好,但分页仍然无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多