按用户角色数组筛选帖子/页面

时间:2015-09-04 作者:Patrice Poliquin

我编写了一个代码,用于根据您的user\\u角色筛选要显示的页面。一切都很好。但我的客户创建了新角色,名称/slug相似。

因此,现在,如果有些人有这个角色,例如:Group APTNB,他将能够看到具有APTNB\\u CA角色的页面,因为在slug中,“APTNB”类似于我的comparison中的“APTNB\\u CA”。

我试图探索在这篇文章中使用“IN”的可能性:Meta_query compare operator explanation

我的剧本在我使用时爆炸了。

这是我的密码。

global $current_user;

$user_roles = $current_user->roles;
$user_role_query = array();

for ($i=0; $i < sizeof($user_roles); $i++) { 
    $user_role_query[] = array(
        \'key\'=>\'attribution_roles\',
        \'value\' => $user_roles[$i],
        \'compare\'=>\'LIKE\'
    );
}

// WP_Query arguments
$args = array (
    \'post_type\'      => \'suivi_des_comites\',
    \'order\'          => \'ASC\',
    \'orderby\'        => \'title\',
    \'posts_per_page\' => -1,
    \'meta_query\'     => array_merge(
        array( \'relation\' => \'OR\' ),    // this must be an array
        $user_role_query
    )
);
我认为,关键是重做array()\'s以使其正常工作。

这里是我的一些print\\u r();

print_r($user_role_query);

Array
(
    [0] => Array
        (
            [key] => attribution_roles
            [value] => aptnb
            [compare] => LIKE
        )

)

print_r($args);

Array
(
    [post_type] => suivi_des_comites
    [order] => ASC
    [orderby] => title
    [posts_per_page] => -1
    [meta_query] => Array
        (
            [relation] => OR
            [0] => Array
                (
                    [key] => attribution_roles
                    [value] => aptnb
                    [compare] => LIKE
                )

        )

)
在my DB中,页面属性“attributement\\u roles”返回此值。

a:2:{i:0;s:8:"aptnb_ca";i:1;s:13:"administrator";}
当我使用该方法时LIKE 我的查询如下所示。

SELECT wp_posts.* FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND (( wp_postmeta.meta_key = \'attribution_roles\' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE \'%administrator%\' )) AND wp_posts.post_type = \'suivi_des_comites\' AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\') GROUP BY wp_posts.ID ORDER BY wp_posts.post_title ASC

当我使用该方法时= 我的查询如下所示。

SELECT wp_posts.* FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( ( wp_postmeta.meta_key = \'attribution_roles\' AND CAST(wp_postmeta.meta_value AS CHAR) = \'administrator\' ) ) AND wp_posts.post_type = \'suivi_des_comites\' AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\') GROUP BY wp_posts.ID ORDER BY wp_posts.post_title ASC

我的目标是解决[值=>aptnb与[值=>aptnb\\U ca相同的问题

我的查询如下:查找具有自定义post\\u类型suivi\\u des\\u委员会的所有post,其中user\\u role==“aptnb\\u ca”或user\\u role==“aptnb”

它需要是精确的字符串,而不是其中的一部分。

1 个回复
SO网友:Ehsaan

你用过LIKE 比较方法,这意味着将匹配每个相似的表达式,包括精确字符串和相似字符串。

如果要匹配精确的字符串,应使用= 操作人员

示例:

global $current_user;

$user_roles = $current_user->roles;
$user_role_query = array();

for ($i=0; $i < sizeof($user_roles); $i++) { 
    $user_role_query[] = array(
        \'key\'=>\'attribution_roles\',
        \'value\' => $user_roles[$i],
        \'compare\'=>\'=\'
    );
}
我建议阅读WP_Query page in WordPress codex 有关比较方法、关系方式等的详细信息。

希望对您有用;)

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the