问题描述
在其他页面的第一页上,我需要每页不同的帖子数量。
例如,这就是我需要的
-
帖子总数:6
-
第一页:显示 3 个帖子
-
以下页面:每页显示 2 个帖子
这是我的代码:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset
if( $paged == 1 ) {
$limit = $fp_limit;
} else {
$offset = $fp_limit + ( ($paged - 2) * $limit );
}
$args = array(
'post_type' => 'my_post_type',
'post_status' => 'publish',
'offset' => $offset,
'posts_per_page' => $limit,
'caller_ get_ posts' => -1, // remove sticky post
'paged' => $paged,
'tax_query' => array(
array(
'taxonomy' => 'my_taxo',
'field' => 'slug',
'terms' => array('slug1', 'slug2', 'slug3')
)
)
);
$my_query = null;
$my_query = new WP_Query($args);
// basic loop
if( $my_query->have_posts() ) :
while ($my_query->have_posts()) : $my_query->the_post();
...
endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }
wp_reset_query();
在存档的第一页,此代码假定:
那么,每页 6 个帖子和 3 个帖子。所以我需要 2 个档案页面,我给你的分页是:
[1] [2]
但是,代码中存档的任何其他页面都假定:
那么,每页 6 个帖子和 2 个帖子。所以我需要 3 个档案页面,我给你的分页是:
[1] [2] [3]
需要一点帮助来解决这个问题。
最佳解决方案
编辑 – 解答
我正在处理另一个解决方案,这实际上是原来的答案。这不涉及任何自定义查询,我认为为了所有目的,我的原始答案可以删除,但为信息目的
我仍然相信你在主页上,也会这样对待。所以这是我的新解决方案
步骤 1
从主页中删除自定义查询,并将其替换为默认循环
<?php
if ( have_posts() ) :
// Start the Loop.
while ( have_posts() ) : the_post();
///<---YOUR LOOP--->
endwhile;
//<---YOUR PAGINATION--->
else :
//NO POSTS FOUND OR SOMETHING
endif;
?>
第 2 步
使用 pre_get_posts
更改主查询以将您的自定义分类法添加到主查询以显示在主页上。
步骤 3
现在,从后端获取 posts_per_page
选项集 (我假设为 2),并设置我们要使用的 offset
。那将是 1
,因为在第 1 页和第 2 页需要 3 个帖子
$ppg = get_option('posts_per_page');
$offset = 1;
步骤 4
在第一页,您需要将 offset
添加到 posts_per_page
中,最多可以添加 3 以获得第三个帖子。
$query->set('posts_per_page', $offset + $ppp);
步骤 5
您必须将 offset
应用到所有后续页面,否则您将在下一页重复上一页的页面
$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset);
步骤 6
最后,您需要从 found_posts
中减去您的偏移量,否则您最后一页的分页将错误,并给您一个 404
错误,因为最后一篇文章将丢失,因为不正确的帖子数
注意:这段代码在搜索页面上打破了分页。这是现在已经修复,看到更新的代码
function homepage_offset_pagination( $found_posts, $query ) {
$offset = 1;
if( $query->is_home() && $query->is_main_query() ) {
$found_posts = $found_posts - $offset;
}
return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );
全部一起
这是你的完整查询将如何看起来应该进入 functions.php
function tax_and_offset_homepage( $query ) {
if ($query->is_home() && $query->is_main_query() && !is_admin()) {
$query->set( 'post_type', 'my_post_type' );
$query->set( 'post_status', 'publish' );
$query->set( 'ignore_sticky_posts', '-1' );
$tax_query = array(
array(
'taxonomy' => 'my_taxo',
'field' => 'slug',
'terms' => array('slug1', 'slug2', 'slug3')
)
);
$query->set( 'tax_query', $tax_query );
$ppp = get_option('posts_per_page');
$offset = 1;
if (!$query->is_paged()) {
$query->set('posts_per_page',$offset + $ppp);
} else {
$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset);
}
}
}
add_action('pre_get_posts','tax_and_offset_homepage');
function homepage_offset_pagination( $found_posts, $query ) {
$offset = 1;
if( $query->is_home() && $query->is_main_query() ) {
$found_posts = $found_posts - $offset;
}
return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。