基于用户角色限制的Wordpress搜索结果

问题描述 投票:0回答:1

我正在为一家拥有多个 B2B 品牌的公司创建一个知识库。对于每个品牌,客户必须与公司签署协议。客户将能够登录知识库并查看他们注册的品牌的内容。

我正在使用 Elementor 在 WordPress 中构建这个知识库。为了限制内容,我使用了 Code Atlantic 的“内容控制”插件。我还使用“用户角色编辑器”插件为每个品牌创建用户角色。

我创建了一个自定义帖子类型,允许公司员工撰写知识库文章。这些自定义帖子类型基于类别。

现在,当有人登陆主页时,一切正常。每当他们点击某个品牌时,他们都没有注册,因为内容是无法访问的。

我遇到的问题是搜索结果页面。我使用 Elementor 创建了一个搜索结果页面。那里有一个循环小部件,可根据搜索查询显示相关知识库文章。但是,如果登录用户未注册特定品牌,我不希望品牌文章显示在此结果页面上。如果客户 A 注册了品牌 A,他们应该只能看到品牌 A 的文章,而看不到品牌 B 的文章

在函数 PHP.file 中我插入了以下代码:

add_filter('pre_get_posts', 'custom_search_query');

function custom_search_query($query) {
    if (is_search() && $query->is_main_query()) {
        $user = wp_get_current_user();
        $roles = (array)$user->roles;
        $allowed_roles = array('cenzaa_klanten', 'mayee_klanten');
        $search_categories = array();

        // Define the allowed categories for each role
        if (in_array('cenzaa_klanten', $roles)) {
            $search_categories = array(
                'cenzaa-behandelformulieren',
                'cenzaa-marketing-en-promotiemateriaal',
                'cenzaa-prijslijsten',
                'cenzaa-producthandleidingen',
                'cenzaa-trainingen'
            );
        } elseif (in_array('mayee_klanten', $roles)) {
            $search_categories = array(
                'mayee-behandelformulieren',
                'mayee-prijslijsten',
                'mayee-trainingen'
            );
        }

        // Set the post type and category parameters for the query
        $query->set('post_type', 'artikel');
        $query->set('rubriek_name', implode(',', $search_categories)); // Allow only selected categories
    }

    return $query;
}

更多信息: “cenzaa_klanten”和“mayee_klanten”是我创建的用户角色。 Cenzaa 是品牌之一,Mayee 是品牌之一。 Code Atlantic 的“内容控制”插件用于设置受限内容的规则。

不同的类别以“cenza-..”和“mayee-..”开头

使用 ACF,我已将“类别”更改为“rubriek”(类别的荷兰语翻译在网址中看起来更好)

php wordpress search
1个回答
0
投票

对于这行代码:

$query->set('rubriek_name', implode(',', $search_categories)); // Allow only selected categories

如果

rubriek_name
与 WP_Query 参数
category_name
相同,则代码将使用逗号分隔列表来查找具有 $search_categories 中列出的类别中的
any
的帖子。 WordPress WP_Query Docs for Category 显示应使用
category_name
来查找一个且仅一个 类别名称。参数值应该是表示单个类别名称的字符串(不是逗号分隔的列表)。

要在列表中搜索 any 类别,应将类别 ID 数组与 WP_Query 参数

category__in
一起使用。

由于我们已经有了一个类别名称数组,如

$search_categories
,我们可以使用类似的方法来查找类别 ID 数组:

$category_ids = get_terms(
    array(
        'taxonomy'   => 'category',
        'fields'     => 'ids',              // Return an array of term IDs.
        'hide_empty' => true,               // Default. Hide categories not assigned to any posts.
        'name'       => $search_categories,
        'number'     => 0                   // Default. Do not limit the number of IDs returned.
    )
);

要更新

$query
,我们可以使用这样的东西:

$query->set('rubriek__in', $category_ids);

这假设

rubriek__in
与 WP_Query 参数
category__in
相同。

© www.soinside.com 2019 - 2024. All rights reserved.