【发布时间】: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