如何使用PRE_GET_POSTS更改类别页面的POSTS_PER_PAGE,其中‘POSTS_PER_PAGE’将是动态的

时间:2018-02-06 作者:Siddika

我在WordPress的编辑类别页面中有带有自定义字段的类别模板。有一个自定义字段用于在分类页面中显示每页的帖子数量。我正在使用pre_get_posts 更改默认值posts_per_page 对于类别页面。

以下是我的功能:

function my_limit_posts_per_cat_page( $query ){
$cat_id = get_query_var(\'cat\');
$cat_data = get_option("category_$cat_id");
$category_posts_pp = \'\';
if(isset($cat_data[\'category_posts_pp\'])){
$category_posts_pp = $cat_data[\'category_posts_pp\']; //this is the custom field value available in edit category page
}
if(isset($cat_data[\'category_posts_pp\'])){
$post_show_limit = $category_posts_pp;
} else {
$post_show_limit = get_option(\'posts_per_page\'); //if the custom field is empty the Reading Settings posts per page will be using
}

if ( is_category() ){
    $query->set( \'posts_per_page\', $post_show_limit );
    return;
}
以及pre_get_posts 我用于该功能的挂钩:

add_action( \'pre_get_posts\', \'my_limit_posts_per_cat_page\' );
问题是,没有在此处传递自定义字段值。无论我在编辑类别页面的自定义字段中输入什么,该值在我的函数中都不起作用。但是,相同的自定义字段值在其他地方也起作用(即模板页)。

然而,有时我看到自定义字段值在那里工作,但在这种情况下分页会产生问题。例如:类别页面中有19篇帖子,其中10篇是通过阅读设置设置的。因此,默认情况下将有2页。现在,如果在自定义字段中输入4,那么将有5页。正确显示分页中的5页。但是,这些页面一直持续到第二页。第3页、第4页和第5页不起作用。如果我们在阅读设置中设置7而不是10,那么分页的页面将一直工作到第3页,然后其余页面变为空白或404。

有人告诉我哪里出了问题吗?如果你需要更多的解释,请询问。

干杯

1 个回复
SO网友:Milo

如果启用了相当多的永久链接,并且访问了类别存档,则填充的查询变量为category_name. 这个cat 只有在运行查询后,才会填充查询变量。因此,虽然您的代码将在模板中工作,但在pre_get_posts 为此原因采取的行动。

要解决此问题,需要从类别slug中获取类别ID:

function my_limit_posts_per_cat_page( $query ){
    if( $query->is_main_query() && is_category() ){

        $cat_slug = get_query_var( \'category_name\' );
        $category = get_term_by( \'slug\', $cat_slug, \'category\' );
        $cat_id = $category->term_id;

        // the rest of your code using $cat_id goes here...
    }
}
add_action( \'pre_get_posts\', \'my_limit_posts_per_cat_page\' );
注:此处的另一个补充是$query->is_main_query() 将此代码限制为仅在主查询上运行。

开发时,我的一般建议是记录所有内容,并验证您使用的数据是否符合预期。在WordPress中,时间就是一切。

结束

相关推荐

How to test pagination?

我一直在从无到有地构建一个主题,所以我在网上的每一个地方都能从无到有地写作,这教会了我如何实现分页,主要是展示如何将标准的Wordpress版本变成一种风格。我还了解到大约有3种不同的分页方式(上一页/下一页、归档页、分页符),我假设这些都需要不同的代码。目前,我已经成功实现了上一页/下一页:这是通过以下方式实现的:<div class=\"postnav six columns droided-box prev clearfix\"> <h2>Previous P