如果不想某个分类显示在首页或者别的页面,可以把要求整理一下,尽量逻辑清晰,把相关参数等一并打包发给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等钩子处理。
这种 “双管齐下” 的方式覆盖了所有可能显示目标分类文章的场景,所以效果更彻底。
补充建议
虽然代码生效了,但可以再优化两处细节(不影响功能,更规范):
- 去掉
exclude_category_single_page中的return $query;(pre_get_posts作为动作钩子,不需要返回值); - 分类 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排除定义分类中的文章显示

印画
ℒℯ𝓉 𝓅𝒶𝓈𝓉 𝓈𝓉𝒶𝓎 𝓅𝒶𝓈𝓉 
