在搜索中仅包括当前用户的帖子

时间:2014-07-23 作者:karbuncle

我是一个新的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\' );

1 个回复
最合适的回答,由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为我提供了原始代码应该工作的想法:)

结束

相关推荐

Custom Search Query

我想设置一个自定义搜索页面,该页面执行以下操作:用户以一种他希望在搜索中看到返回的表单(基本上是从标签列表中选择)检查多个项目。返回与他选择的所有标记匹配的结果(使用和不使用或)。具体示例如下:返回标记=“小学”和“公园”的“区域”类别中的所有帖子我需要为我的搜索表单命名特别的内容吗在搜索结果页面上,如何对自定义查询进行编码,使其能够捕获区域类别内的所有帖子,并具有用户在搜索表单中选择的所有标签的标签