使用‘parse_Query’过滤器显示来自多个条件的帖子

时间:2015-01-26 作者:GreatBlakes

我试图在WordPress管理中过滤帖子页面,以显示符合“A”或“B”标准的帖子。我仔细查看了文档,找不到一个好的方法来完成这项工作。

详细信息:我已经确定了用户角色的范围,因此作者只能编辑自己的帖子。然而,我已经添加了一个自定义字段,以便作者可以选择其他作者来编辑文章。如果我在“parse\\u query”过滤器中使用一个或另一个,则此功能非常有效,但如果我尝试同时启用这两个查询,则认为我希望显示符合所有条件的帖子(无)。

以下是我的代码(位于functions.php中),以供参考:

add_filter(\'parse_query\', \'show_appropriate_posts\');
function show_appropriate_posts($query) {
    if ( strpos($_SERVER[ \'REQUEST_URI\' ], \'/wp-admin/edit.php\') !== false ) {
        if ( !current_user_can(\'manage_options\') ) {
            global $current_user;

            //Only list posts by this user (A).
            $query->set(\'author\', $current_user->id);

            //List posts this user is "tagged" in (B).
            $query->set(\'meta_key\', \'add_editing_permission_for\');
            $query->set(\'meta_value\', $current_user->id);
            $query->set(\'meta_compare\', \'LIKE\');

            //@TODO: Need to show posts that meet (A) -or- (B).
        }
    }
}
同样,单独运行时,(A)和(B)都工作。

1 个回复
最合适的回答,由SO网友:David Gard 整理而成

忽略我对的评论meta_query. 它不仅不适用于$query->set(), 你无法控制关键的“A”OR B“查询的要求。

相反,我相信您所需要的是通过两者的结合pre_get_posts 行动挂钩和posts_where 过滤器挂钩如下。

add_action(\'pre_get_posts\', \'my_show_appropriate_posts\');
function my_show_appropriate_posts($query){

    if(strpos($_SERVER[ \'REQUEST_URI\' ], \'/wp-admin/edit.php\') !== false) :

        if(!current_user_can(\'manage_options\')) :

            /** Unset so that we can control exactly where this part of the query is included */
            $query->set(\'author\', null);

            /** Ensure that the relevant tables required for a meta query are included */
            $query->set(\'meta_query\', array(
                array(
                    \'key\'       => \'add_editing_permission_for\',
                    \'value\'     => \'dummy\', // This cannot be empty because of a bug in WordPress
                    \'compare\'   => \'=\'
                )
            ));

            /** Call the filter to amend the \'$where\' portion of the query */
            add_filter(\'posts_where\', \'my_custom_posts_where\');

        endif;

    endif;

}

function my_custom_posts_where( $where = \'\' ){

    global $wpdb;

    /** Add our required conditions to the \'$where\' portion of the query */
    $where.= sprintf(
        \' AND ( %1$s.post_author = %2$s OR ( %3$s.meta_key = "add_editing_permission_for" AND %3$s.meta_value = %2$s ) )\',
        $wpdb->posts,
        get_current_user_id(),
        $wpdb->postmeta
    );

    /** Remove the filter to call this function, as we don\'t want it any more */
    remove_filter(\'posts_where\', \'my_custom_posts_where\');

    return $where;

}

Recommended reading

pre_get_posts action hook - http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

posts_where filter hook - http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where

结束

相关推荐

将网站从本地主机上传到实时服务器后,wp-admin的空白页面

我最近将站点从localhost移动到了实时服务器。当我尝试访问wp-admin 页面我一直得到空白页面,没有显示错误,尽管WP_DEBUG 是true. 当我打开wp-login.php, 我确实获得了登录屏幕,但无法登录并出现以下错误:错误:浏览器阻止或不支持Cookie。您必须启用Cookie才能使用WordPress我在每次<?php 在?>. 我删除了所有空白,但没有成功。请帮帮我