我正在为一家拥有多个 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”(类别的荷兰语翻译在网址中看起来更好)
对于这行代码:
$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
相同。