摆弄用户角色可能是最可靠的解决方案,但要设置一种快速而肮脏的方法post meta-data 要标记应隐藏的帖子,请添加meta-query 使用发布查询a pre_get_posts hook 为了将结果限制为非登录用户的非隐藏帖子。
以下内容将限制all 已注销访问者的帖子查询到那些没有关联hide_from_guests 元数据,或将该元数据设置为\'false\':
function wpse225120_hide_posts_from_guests( $query ) {
// If the user\'s logged in, exit the function now.
if( is_user_logged_in() )
return;
// Get the current metadata query so we can alter it instead of overwriting it
$meta_query = $query->get( \'meta_query\' );
// Create a meta-query filtering out hidden posts
$hidden_meta_query = array(
\'relation\' => \'OR\',
array(
\'key\' => \'hide_from_guests\',
\'value\' => \'false\'
),
array(
\'key\' => \'hide_from_guests\',
\'compare\' => \'NOT_EXISTS\'
)
);
// If there\'s not already a meta-query, supply the one for hidden posts and exit
if( ! is_array( $meta_query ) || empty( $meta_query ) ) {
$query->set( \'meta_query\', $hidden_meta_query );
return;
}
// If there is an existing meta-query, modify it to support our new hidden posts
// meta-query as a top-level \'AND\' condition, if need be
if( isset( $meta_query[ \'relation\' ] ) && \'OR\' === $meta_query[ \'relation\' ] )
$meta_query = array(
\'relation\' => \'AND\',
$meta_query
);
}
// Add the hidden posts meta-query and overwrite $query\'s old meta-query
$meta_query[] = $hidden_meta_query;
$query->set( \'meta_query\', $meta_query );
}
add_action( \'pre_get_posts\', \'wpse225120_hide_posts_from_guests\' );
Note 像这样对每个查询进行全局更改通常被认为是一种不好的做法。如果可能,使用
is_main_query() 和其他
conditional tags 限制查询修改仅限于相关查询,以防止意外行为和性能影响。
这个\'hide_from_guests\' 可以使用custom fields 界面post metadata functions, 或实现自定义metabox 并以其他方式将其附加到相关的职位类型。