我是一个新的WP插件开发人员。我希望搜索页面只包括当前用户的帖子。
我首先添加了一个新功能read_others_posts
仅限管理员和编辑。然后我尝试了以下代码,将其放置在函数中并将其挂接到pre_get_posts
措施:
if( !current_user_can(\'read_others_posts\') )
$query->set( \'author\', get_current_user_id() );
对于所有其他查询(包括在admin和home中),此“过滤器”起作用,但搜索不起作用。它仍会在结果页上显示所有帖子。
我做错什么了吗?有没有办法实现我所描述的?
EDIT:
如果有人想使用这个钩子,让我提供一个更通用的函数版本,尽管我确实认为有更好的方法来实现这一点:
function exclude_other_users_posts( $query ) {
if( !is_user_logged_in() ) {
// guests cannot read private posts
// and we exclude all public posts here
// so guests can read nothing :-)
$query->set( \'post_status\', \'private\' );
$query->set( \'perm\', \'readable\' );
} elseif( !current_user_can(\'read_others_posts\') )
$query->set( \'author\', get_current_user_id() );
}
add_action( \'pre_get_posts\', \'exclude_other_users_posts\' );
最合适的回答,由SO网友:karbuncle 整理而成
经过进一步测试,发现问题是由另一个过滤器引起的,posts_where
, 它被注册以支持自定义字段中的搜索,这就是为什么只影响搜索。
最初它会生成这样的结果,所以如果OR
语句返回true(当其中一个自定义字段包括foo
), 该帖子将显示在结果页上:
AND wp_posts.post_author IN (2) AND (
(
(wp_posts.post_title LIKE \'%foo%\') OR (wp_posts.post_content LIKE \'%foo%\')
)
) AND ( /* wordpress stuff... */ ) OR ( /* section the filter generates... */ )
我已进行修改,以便此筛选器返回:
AND wp_posts.post_author IN (2) AND (
(
(wp_posts.post_title LIKE \'%foo%\') OR (wp_posts.post_content LIKE \'%foo%\')
OR ( /* section the filter generates... */ )
)
) AND ( /* wordpress stuff */ )
感谢Johannes为我提供了原始代码应该工作的想法:)