使用PRE_GET_POST更改每页帖子和偏移量

时间:2015-06-25 作者:evu

我有一个过滤器,它使用pre\\u get\\u posts将新闻登录页上每页的帖子数量从4个更改为所有其他页面(第2、3页等)上的8个。然而,我似乎没有得到正确的偏移量,或者别的什么,因为我的get_next_posts_page_link 不显示第3页,即使手动转到url时它确实存在。当前偏移量是我偶然想到的,我认为它在第2页是正确的,但当我添加更多的测试帖子时,我意识到它不起作用。

function page_2_posts_per_page_filter( $query ) {

    $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;

    if ( !is_admin() && $query->is_paged && $query->is_main_query() ) {

        $offset = 4 + (($paged - 2) * 8);
        $query->set( \'offset\', $offset );
        $query->set( \'posts_per_page\', 8 );

    } else if (!is_admin() && $query->is_main_query()) {

        $query->set( \'posts_per_page\', 4 );

    }
    return;
}
add_action( \'pre_get_posts\', \'page_2_posts_per_page_filter\', 1 );

EDIT: SOLUTION

function page_2_posts_per_page_filter( $query ) {

    $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
    $offset = 4;

    if ( !is_admin() && $query->is_paged && $query->is_main_query() ) {

        $offset = (($paged - 1) * 8) - $offset;
        $query->set( \'posts_per_page\', 8 );
        $query->set( \'offset\', $offset );

    } else if (!is_admin() && $query->is_main_query()) {

        $query->set( \'posts_per_page\', 4 );

    }
    return;
}
add_action( \'pre_get_posts\', \'page_2_posts_per_page_filter\');

function found_offset( $found_posts, $query ) {

    $offset = 4;

    if( !is_admin() && $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}
add_action( \'found_posts\', \'found_offset\', 10, 2 );

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

这是我最近对另一个问题的回答,和你的一样。因为答案从未被投票或接受过,我无法将这个问题标记为重复,所以我删除了另一篇帖子中的答案,并将其重新发布在这里。

请注意,有些观点不是针对这个问题的,可以忽略,而且,您只需要对这些值进行一些更改,因为我在原始帖子中没有更改任何内容。因此,不要对答案中的某些信息感到震惊;-)

重新调整用途的答案

Here 是我对同一情景的回答的一个微小变化。这里的不同之处在于你想要的更少posts_per_page 在第一页

STEP 1

去除query_posts. 永远不要使用query_posts

Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query_posts()是一种过于简单且有问题的方法,它通过将页面的主查询替换为查询的新实例来修改页面的主查询。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。

将其替换为默认循环

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    <?php if ( \'regularproducts\' == get_post_type()  ) : ?>

        //CONTENT HERE

    <?php endif; ?>

    <?php if ( \'wpsc-product\' == get_post_type()  ) : ?>

        //CONTENT HERE

    <?php endif; ?>

<?php endwhile; endif; ?>

STEP 2

使用pre_get_posts 要更改主查询,请将自定义post\\u类型添加到主查询中,以显示在主页上。

STEP 3

现在,获取posts_per_page 从后端设置选项(应设置为300),并设置offset 我们将使用它。那将是200 因为你需要在第一页上发表100篇文章,其余的300篇。

如果您不想更改posts_per_page 选项,然后只需设置变量$ppg300

$ppg = get_option( \'posts_per_page\' );
//$ppg = 300;
$offset = 200;

STEP 4

在第一页,你需要减去offsetposts_per_page

$query->set( \'posts_per_page\', $ppp - $offset );

STEP 5

您必须应用offset 到所有后续页面,否则您将在下一页重复该页面的最后一篇文章

$offset = ( ( $query->query_vars[\'paged\']-1 ) * $ppp ) - $offset;
$query->set( \'posts_per_page\', $ppp );
$query->set( \'offset\', $offset ); 

STEP 6

最后,需要将偏移量添加到found_posts 否则,分页将不会显示最后一页

注意:这段代码破坏了搜索页面上的分页。现已修复,请参阅更新的代码

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 200;

    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 );

ALL TOGETHER

这就是您的完整查询应该进入函数的样子。php

function tax_and_offset_homepage( $query ) {
  if ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
    $query->set( \'post_type\', array( \'regularproducts\', \'wpsc-product\' ) );

    $ppp = get_option( \'posts_per_page\' );
//$ppp = 300;
    $offset = 200;
    if ( !$query->is_paged() ) {
      $query->set( \'posts_per_page\', $ppp - $offset );
    } else {
      $offset = ( ( $query->query_vars[\'paged\']-1 ) * $ppp ) - $offset;
      $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 = 200;

    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 );

结束

相关推荐

Search with filters and title

我想搜索custom_post 按标题和ACF字段。所以,我用了WP_Query WordPress函数,但我不能按标题过滤,只能按过滤器过滤。当我提交表单时,我有这样的URL:http://example.com/?s=titre&filter1=condition1&filter2=condition2&filter3=condition3 我的代码:$title = $_GET[\'s\']; $args = array( \'pagenam