如何在wp_Query结果中添加帖子?

时间:2015-01-04 作者:Михаил Семёнов

我有2个用户组:authorsclients

作者可以发布帖子并在metabox for wich中指定client 这些职位是为。

客户端可以发布帖子并查看、编辑帖子,创建人Authors 为了他们。

Problem:

在wp admin on posts屏幕(wp admin/edit.php)中,我需要显示:

如果Author: 仅限作者帖子

如果Client: 客户帖子和帖子where meta value is client id

如果admins: 所有帖子

已添加I\'vpre_get_posts 筛选仅筛选作者帖子:


/**
 * Show only author posts, but all for admins
**/
function m7_24_ee_posts_for_current_author( $query ) {

    if( $query->is_admin && \'post\' == $query->query_vars[\'post_type\'] && ! current_user_can( \'administrator\' ) ) {
        global $user_ID;
        $query->set( \'author\',  $user_ID );
        if( current_user_can( \'client\' ) ) {
            $query->set( \'meta_key\', \'client\' );
            $query->set( \'meta_value\', $user_ID );
        }
    }
    return $query;
}
add_filter( \'pre_get_posts\', \'m7_24_ee_posts_for_current_author\' );
但问题是meta_keyauthor 字段的行为类似AND, 但我需要他们是“或”。or author is $user_ID or meta_value is $user_ID

如果这些问题没有简单的解决方案,那么可以通过将2个查询(1个带作者,2个带元值)加上边框来解决,但问题是我不知道应该使用哪个钩子来加边框,因为pre_get_posts 火烧得很早。

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

以下是对wp-admin 这应该可以做到:

/**
 * Modification of the wp-admin main (post) query: 
 *     If current user has the "client" role then 
 *     show client\'s posts OR posts where the "client" meta value is the client id.
 *
 * @see http://wordpress.stackexchange.com/a/173967/26350
 */

function wpse_pre_get_posts( $q )
{
    if( is_admin()
        && $q->is_main_query()
        && \'post\' === $q->get( \'post_type\' ) 
        && ! current_user_can( \'administrator\' )  
    ) 
    {
        $q->set( \'author\',  get_current_user_id() );
        if( current_user_can( \'client\' ) ) 
        {
            $q->set( \'author\',  null );
            $q->set( \'meta_key\', \'client\' );
            $q->set( \'meta_value\', get_current_user_id() );
            add_filter( \'posts_where\', \'wpse_posts_where\' );
        }
    }
    return $query;
}
add_filter( \'pre_get_posts\', \'wpse_pre_get_posts\' );
其中posts_where 过滤器定义为:

function wpse_posts_where( $where )
{
    global $wpdb;
    remove_filter( current_filter(), __FUNCTION__ );
    return str_ireplace(
        "{$wpdb->postmeta}.meta_key",
        sprintf( 
            "{$wpdb->posts}.post_author = %d 
             OR {$wpdb->postmeta}.meta_key", 
            get_current_user_id() 
        ),
        $where
    );
}
我想那里有no 主菜单上的其他元查询wp-admin. 如果不是这样的话,那么您应该能够进一步细化它。

结束

相关推荐

WP_USER_Query。‘Relationship’=>‘OR’有什么问题?

我希望所有满足任一条件1的用户OR 条件2。按姓氏排序。如果我接受条件1AND 条件2(\'关系\'=>\'和\'),查询正常。如果我取“relation”=>“OR”,我会得到所有记录和未排序的记录。怎么了? $args = array( \'meta_query\' => array( \'relation\' => \'OR\', 0 => array( \'k