分页仅在第2页添加额外的帖子

时间:2016-08-29 作者:Garry Aylott

在接近我的主题之后,我已经跨过了最后一关。基本上,我的主页上有三个不同的区域:

最新帖子显示在标题中,并设置为特色帖子样式,最新帖子样式下方的两篇帖子样式为最新帖子样式,最新帖子(1)下方的其余帖子(10)和最近的两篇帖子(2)使用自定义WP\\U查询显示,其余十篇帖子(3)使用带有偏移功能的标准循环显示,该功能还解决了分页问题但是第二页有个小问题。出于某种原因,它会在帖子列表的顶部额外添加三篇帖子(3篇)?在这之后,从第3页开始,它就可以正常工作了。我还应该提到的是,最新和最新的帖子(1和2)将在页面循环时始终显示在顶部。

以下是包含不同区域和邮编的布局:

Layout

下面是用于处理主帖子(3)和分页修复的函数的代码(偏移量用于跳过上面显示的最新和最近的帖子):

function offset_main_query ( $query ) {
     if ( $query->is_home() && $query->is_main_query() && !$query->is_paged() ) {
         $query->set( \'offset\', \'3\' );
    }
 }
add_action( \'pre_get_posts\', \'offset_main_query\' );
任何帮助都会很好,因为这是让我绊倒的最后一点。

谢谢:)

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

下面是一个支持different 主页上的帖子数比其他分页页面上的帖子数要多。如果可能,我们应该使用主查询,而不是子查询。

Formula

将分页页面的偏移量取为:

offset_op = ( paged - 1 ) * pp_op + ( pp_fp - pp_op ) + offset_fp           
          = ( paged - 2 ) * pp_op + pp_fp + offset_fp 
在哪里paged (“分页”),pp_fp每页帖子数),pp_op每其他页的帖子数)和offset\\u fp(第一页的offset)是非负整数。

对于paged=1 偏移量为offset_fp, 否则就是offset_op 对于其他页面。

Example #1:

首先,我们计算几页的偏移量,以便更好地理解这一点:

For paged=1:
    offset_fp = 0

For paged=2:
    offset_op = (2-2)*10 + 13 + 0
              = 13

For paged=3:
    offset_op = (3-2)*10 + 13 + 0
              = 10+13
              = 23
...
以下是每页的帖子索引列表:

0,1,2,3,4,5,6,7,8,9,10,11,12    (offset_fp=0,  pp_fp=13, paged=1)
13,14,15,16,17,18,19,20,21,22   (offset_op=13, pp_op=10, paged=2)
23,24,25,26, 27,28,29,30,31,32  (offset_op=23, pp_op=10, paged=3)
...
我们可以看到偏移量与索引匹配。

Example #2:

让我们采取行动pp_fp = 3, pp_op = 5, offset_fp=4 并计算偏移量op:

For paged=1:
    offset_fp = 4

For paged=2:
    offset_op = (2-2)*5 + 3 + 4
              = 7

For paged=3:
    offset_op = (3-2)*5 + 3 + 4
              = 5+3+4
              = 12
...
并将其与指数进行比较:

4,5,6          (offset_fp=4,  pp_fp=3,  paged=1)
7,8,9,10,11    (offset_op=7,  pp_op=5,  paged=2)
12,13,14,15,16 (offset_op=12, pp_op=5,  paged=3)
...

Demo Plugin

下面是一个演示实现:

/**
 * Plugin Name: WPSE demo
 */
add_action( \'pre_get_posts\', function( \\WP_Query $query ) 
{
    // Nothing to do if backend or not home page or not the main query
    if ( is_admin() || ! $query->is_home() || ! $query->is_main_query() )
        return;

    // Get current pagination
    $paged = get_query_var( \'paged\', 1 );

    // Modify sticky posts display
    $query->set( \'ignore_sticky_posts\', true );

    // Modify post status
    $query->set( \'post_status\', \'publish\' );

    // Edit to your needs
    $pp_fp      = 13; // posts per first page
    $pp_op      = 10; // posts per other pages
    $offset_fp  = 0;  // offset for the first page

    // Offset for other pages than the first page
    $offset_op = ( $paged - 2 ) * $pp_op + $pp_fp + $offset_fp;

    // Modify offset
    $query->set( \'offset\', $query->is_paged() ? $offset_op : $offset_fp );

    // Modify posts per page
    $query->set( \'posts_per_page\', $query->is_paged() ? $pp_op : $pp_fp );  
} );
希望您能根据自己的需要进行调整!

SO网友:The J

我可能会在没有&& !$query->is_paged() (您已经有了两个条件,这应该足够了,即使只有第一个条件也应该有效),如果不起作用,请尝试输出$paged 并查看如何更好地调整函数。

一些调试想法:

// get current page we are on. If not set we can assume we are on page 1.
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
// are we on page one?
if(1 == $paged) {
    //true
}

相关推荐

Add pagination to WP_Query

我试图在下面的代码中添加分页,但不知道如何与之集成。请帮忙在帖子上找到页码。<?php $child_query = new WP_Query(array(\'post_type\' => \'blogpost\', \'orderby\' => \'date\', \'order\' => \'DESC\')); while ( $child_query->ha