如何从存档中隐藏受保护的帖子?

时间:2020-10-05 作者:D_P

Im试图从循环中隐藏WP中受保护的帖子:

function hideProtectedPosts( $where = \'\' ) {
    if (!is_single() && !is_admin()) {
        $where .= " AND post_password = \'\'";
    }
    return $where;
}
add_filter( \'posts_where\', \'hideProtectedPosts\' );
工作正常,但归档除外。我六月份有一个职位。在日历小部件中,我仍然可以看到这是在这个日期发布的,但当我到达那个里时,我得到了404。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

有两个答案,具体取决于您要在哪里执行此操作。一个有好消息,另一个有坏消息

在任何使用Post查询的地方,修改SQL在这里几乎没有必要,而且通常是被忽略的迹象。在这种情况下,WP_Query 已经提供了一个简单的参数来执行此操作,名为has_password.

考虑到这一点,我们可以修改主循环,通过pre_get_posts:

add_action( \'pre_get_posts\', function ( \\WP_Query $q ) {
    if ( is_admin() || $q->is_singular() ) {
        return;
    }
    $q->set( \'has_password\', false );
} );

使用get_calendar 功能包括日历小部件和块,恐怕消息不太好。

get_calendar 不使用WP_Query, 而是使用原始SQL查询来统计帖子(它不会检索帖子)。它也没有为SQL提供过滤器。

但它确实提供了两个机会:

get_calendar 过滤器为您提供最终HTML,允许您对最终字符串进行一些修改。有了它,您可以通过重新实现get_calendar 并返回新的HTML,该HTML排除了SQL中的私有帖子query 滤器因为get_calendar 直接调用WPDB查询,您可以对此进行筛选,however, 此筛选器在WP进行的所有查询上运行,而不仅仅是日历查询。您需要确定查询是否来自get_calendar 或者没有,这可能很难或不可能。如果修改的查询不是来自get_calendar 您可能会导致导致不稳定的问题。还有一个潜在的bug,get_calendar 检查是否有任何帖子,如果没有找到,则返回空字符串。如果该帖子是带密码的帖子,则可能导致日历没有帖子。请小心使任何过滤器在此运行得尽可能快,否则会大大降低WP的速度,这意味着过滤器中没有新的DB查询,没有获取数据,没有发出http请求或加载文件。还有递归循环的危险get_calendar 按月和按年缓存,因此需要刷新缓存以查看更新的输出

为什么没有posts_where 工作

它不起作用,因为该过滤器是WP_Query, 未使用的get_calendar. 我建议不要使用这个,因为它会破坏post_password 的参数WP_Query 以及依赖于它的功能(例如get_posts 或管理区域)

相关推荐

Get posts for each user

对于学生项目,我使用WordPress和木材(树枝)+ACF在这个项目中,我创建了3种自定义帖子类型:dissertation, subject-imposed 和subject-free每个学生只能按自定义帖子类型创建一篇帖子(我为此创建了一个限制)。但现在我想显示一个列表,列出每个学生的名字和他们的3篇帖子。这样的列表:Nicolas Mapple<自定义职位类型的标题dissertation + 自定义帖子类型名称+图像(ACF字段)自定义帖子类型的标题subject-imposed + 自定