You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress多品牌知识库基于用户角色的搜索结果限制问题

问题分析
  1. Elementor循环组件使用自定义查询:你当前的代码仅对主查询(is_main_query())生效,但Elementor循环组件生成的是独立的自定义查询,不会被该条件捕获,导致未授权内容出现在搜索结果中。
  2. 角色判断逻辑有遗漏:代码只处理了cenzaa_klanten和mayee_klanten角色,未覆盖管理员、编辑等其他角色,也没处理未登录用户的情况。
  3. 分类过滤参数兼容性不足:直接使用rubriek_name不如tax_query稳定,尤其是在自定义查询场景下。
解决方案

方案1:针对Elementor循环组件精准过滤

使用Elementor官方过滤器elementor/query/query_args,专门修改循环组件的查询参数:

add_filter( 'elementor/query/query_args', 'filter_elementor_search_results_by_role', 10, 2 );
function filter_elementor_search_results_by_role( $query_args, $widget ) {
    // 仅针对搜索结果页的Elementor文章循环组件
    if ( ! is_search() || $widget->get_name() !== 'posts' ) {
        return $query_args;
    }

    $user = wp_get_current_user();
    if ( ! $user->exists() ) {
        // 未登录用户返回空结果,可根据需求调整
        $query_args['post__in'] = array(0);
        return $query_args;
    }

    $roles = (array) $user->roles;
    $allowed_categories = array();

    // 匹配角色对应允许的分类
    if ( in_array( 'cenzaa_klanten', $roles ) ) {
        $allowed_categories = array(
            'cenzaa-behandelformulieren',
            'cenzaa-marketing-en-promotiemateriaal',
            'cenzaa-prijslijsten',
            'cenzaa-producthandleidingen',
            'cenzaa-trainingen'
        );
    } elseif ( in_array( 'mayee_klanten', $roles ) ) {
        $allowed_categories = array(
            'mayee-behandelformulieren',
            'mayee-prijslijsten',
            'mayee-trainingen'
        );
    } elseif ( current_user_can( 'manage_options' ) ) {
        // 管理员不受限制,直接返回原查询参数
        return $query_args;
    } else {
        // 其他未授权角色返回空结果
        $query_args['post__in'] = array(0);
        return $query_args;
    }

    // 使用tax_query过滤分类(若rubriek是自定义分类法,将taxonomy值改为'rubriek')
    $query_args['tax_query'] = array(
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => $allowed_categories,
            'operator' => 'IN',
        ),
    );

    // 限定文章类型为artikel
    $query_args['post_type'] = 'artikel';

    return $query_args;
}

方案2:优化原代码覆盖所有查询

如果希望同时处理主查询和自定义查询,去掉is_main_query()限制并完善角色判断:

add_filter('pre_get_posts', 'custom_search_query');
function custom_search_query($query) {
    // 仅处理前台的搜索查询
    if ( ! is_admin() && is_search() ) {
        $user = wp_get_current_user();
        if ( ! $user->exists() ) {
            $query->set('post__in', array(0));
            return $query;
        }

        $roles = (array)$user->roles;
        $search_categories = array();

        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'
            );
        } elseif (current_user_can('manage_options')) {
            // 管理员不受限制
            return $query;
        } else {
            $query->set('post__in', array(0));
            return $query;
        }

        $query->set('post_type', 'artikel');
        // 改用tax_query确保兼容性
        $query->set('tax_query', array(
            array(
                'taxonomy' => 'category', // 若rubriek是自定义分类法则替换为'rubriek'
                'field' => 'slug',
                'terms' => $search_categories,
                'operator' => 'IN'
            )
        ));
    }

    return $query;
}

额外验证步骤

  1. 确认Elementor循环组件的查询类型设置为“搜索结果”或基于当前搜索词查询。
  2. 用不同角色的测试账号登录,验证未授权品牌的文章不会出现在搜索结果中。
  3. 保留Content Control插件的访问限制规则,实现双重保障(即使查询过滤失效,点击未授权内容仍会被拦截)。

内容的提问来源于stack exchange,提问作者TimoK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:55:42