如果要在首页上的所有查询中隐藏某些帖子,请删除正在使用的条件并进行检查is_front_page()
而是:
function exclude_single_posts_home($query) {
if (is_front_page()) {
$query->set(\'post__not_in\', array(69489,69177,68878,68736));
}
}
通常情况下,检查全局状态是过滤查询的不正确方式(您最初所做的是正常的正确方式),但在您的情况下,您实际上希望根据全局状态过滤所有查询,因此这是适当的。
要知道post__not_in
性能很差,尤其是当您同时将其应用于多个查询时。您可能需要考虑另一种方法,例如使用自定义字段或自定义分类法,您可以将其应用于要隐藏的帖子。基于这些的查询将更加高效。
添加了hide
字段到帖子使用高级自定义字段,可以通过设置元查询筛选出这些帖子:
function exclude_single_posts_home($query) {
if (is_front_page()) {
$original_meta_query = $query->get( \'meta_query\' );
$new_meta_query = [
\'relation\' => \'OR\',
[
\'key\' => \'hide\',
\'compare\' => \'NOT EXISTS\',
],
[
\'key\' => \'hide\',
\'value\' => \'1\',
\'compare\' => \'!=\'
],
];
if ( $original_meta_query ) {
$meta_query = [
\'relation\' => \'AND\',
$original_meta_query,
$new_meta_query
];
} else {
$meta_query = $new_meta_query;
}
$query->set(\'meta_query\', $meta_query );
}
}
这方面的代码要复杂得多,原因如下:
由于您只是第一次添加该字段,因此会有一些帖子没有正值或负值hide
, 因此,我们需要将没有此字段的帖子视为不隐藏。这就是NOT EXISTS
查询用于。考虑到这种复杂性,我实际上不确定性能是否会有所改善。您可能希望安装查询监视器插件并比较每个插件的性能我相对有信心,头版上没有任何现有的查询对post__not_in
, 所以没有费心处理冲突的可能性。然而,更有可能的是,一些现有查询已经具有meta_query
设置,因此此代码包含逻辑,该逻辑添加新的元查询,用于将帖子隐藏到其存在的任何现有查询中,而不是替换它们