ℒℯ𝓉 𝓅𝒶𝓈𝓉 𝓈𝓉𝒶𝓎 𝓅𝒶𝓈𝓉

WordPress排除定义分类中的文章显示

如果不想某个分类显示在首页或者别的页面,可以把要求整理一下,尽量逻辑清晰,把相关参数等一并打包发给AI,让他帮你就行了,省事儿。发明ai的人真是个智能,让本来一无所知的我更加懒惰了。

感谢ai,未来路上有你,让我们这些不愿意站起来的可以好好的躺下享受果实,至于谁栽的果树?头疼,能吃果子就行了,管它那只鸡下的蛋啊?

同时感谢ai又可以让那些愿意站着行走的人们减轻没必要的重复动作,并提供了旅程的宽度和厚度。

总而言之,言而总之,好也ai,毁也ai。萌萌AI:我特么得罪谁了?反杀。

以下是ai对话(

  • 作用场景:专门处理文章页(is_single())的上下页导航查询
  • 为什么需要它:WordPress 的上下页导航(previous_post_link() 和 next_post_link())使用的是独立查询(get_previous_post 和 get_next_post),这个查询默认不会受 pre_get_posts 钩子影响(因为它是 “次级查询”)。
  • 原理:通过 get_previous_post_where 和 get_next_post_where 钩子,直接修改上下页查询的 SQL 条件(WHERE 子句),强制排除分类 15、16 的文章,确保上下页导航中不会出现这些分类的内容。

为什么这段代码 “比较好”?

因为它针对性解决了两种查询场景的差异

  • pre_get_posts 处理大部分页面的主查询(文章列表);
  • 上下页导航的查询独立于主查询,需要单独通过 get_previous_post_where 等钩子处理。

这种 “双管齐下” 的方式覆盖了所有可能显示目标分类文章的场景,所以效果更彻底。

补充建议

虽然代码生效了,但可以再优化两处细节(不影响功能,更规范):

  1. 去掉 exclude_category_single_page 中的 return $query;pre_get_posts 作为动作钩子,不需要返回值);
  2. 分类 ID 参数去掉空格(-15,-16 而非 -15, -16),避免潜在的解析问题。

优化后代码:

//functions.php 修改,这个方法是比较好的,建议使用。  
function exclude_category_single_page( $query ) {
    if ( ($query->is_home() || $query->is_single() || $query->is_archive()) && !is_admin() ) {
        $query->set( 'cat', '-15,-16' ); // 去掉空格
    }
}
add_action( 'pre_get_posts', 'exclude_category_single_page' ); // 用add_action更规范
// 专门处理相邻文章查询
function exclude_category_adjacent_posts( $where ) {
    if ( is_single() ) {
        global $wpdb;
        $excluded_cats = array(15, 16);// 要排除的分类ID
        $where .= " AND {$wpdb->posts}.ID NOT IN (
            SELECT object_id FROM {$wpdb->term_relationships} 
            WHERE term_taxonomy_id IN (" . implode(',', $excluded_cats) . ")
        )";
    }
    return $where;
}
add_filter( 'get_previous_post_where', 'exclude_category_adjacent_posts' );
add_filter( 'get_next_post_where', 'exclude_category_adjacent_posts' );

内容遵循“CC BY-NC-SA 4.0”:印画 » WordPress排除定义分类中的文章显示

整两句

你可是要准备赏口饭吃?

支付宝扫一扫打赏

微信扫一扫打赏