排除查询中的内容非常昂贵,但也是可以避免的。更重要的是,根据帖子的元数据过滤帖子也非常昂贵。随着帖子数量的增加,该查询将以指数级的速度变慢。
相反,你可以通过告诉它你想要什么,而不是你不想要什么来完全避免这种情况。因此,与其从主页中排除内容,不如将其包括在内。
为了避免后期元查询并使其超快速,请使用私有分类法。设置\'public\' => false
注册时。
最后,假设我们的私有分类法被称为filters
, 我们可以加入save_post
和设置show_on_homepage
用这样的钩子:
add_action( \'init\', function() {
register_taxonomy( \'filters\', \'post\', [
\'public\' => false
] );
} );
add_filter( \'save_post\', function( int $post_id ) : int {
$hide = get_post_meta( $post_id, \'exclude_from_homepage_bloglist\', true );
if ( $hide ) {
wp_remove_object_terms( $post_id, [ \'homepage-show\' ], \'filters\' );
} else {
wp_add_object_terms( $post_id, [ \'homepage-show\' ], \'filters\' );
}
return $post_id;
}
现在你有了一种超级快速的方法来过滤主页上的内容,例如:。
add_action( \'pre_get_posts\', function ( $query ) {
if ( ! $query->is_home() ) {
return; // we only want the homepage
}
$query->set( \'filters\', \'homepage-show\' );
}
你有一个非常有用的方法来突出事物!如果您还添加了
featured
地区然后您可以添加
featured
术语和查询如下:
$query = new WP_Query( [
\'filters\' => \'featured\'
] );
// followed by a standard post loop...
当然,您仍然有您的post meta,如果您愿意,可以删除它并使用
has_term
但您可能正在使用类似ACF的插件来为您提供UI。ACF和其他人可以被告知使用分类法进行保存,但您可以使用它并保留post meta,以便在需要时简化操作。您还需要将主页显示术语添加到所有现有帖子中,以便它们也显示在主页上