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

如何在WordPress所有get_post循环中注入代码控制文章显示?

实现WordPress文章按用户角色自动过滤显示

问题说明

已手动实现文章循环内的判断逻辑:对比用户角色与文章自定义字段,决定是否显示文章。现需将该逻辑封装为函数,让每次执行get_posts()或文章查询时自动过滤,无需手动在循环内添加判断。核心规则为:当$ure_display为true时显示文章,否则隐藏。

实现方案

方案一:查询阶段过滤(推荐,性能更优)

通过WordPress的posts_where过滤器,在数据库查询阶段直接排除不符合权限的文章,避免无效数据加载:

function filter_posts_by_user_role($where, $query) {
    // 仅在前台主查询生效,可根据需求调整(如添加特定文章类型判断)
    if (!is_admin() && $query->is_main_query()) {
        $user = wp_get_current_user();
        // 未登录用户直接返回原条件,可修改为隐藏所有受限文章
        if (!$user->ID) {
            return $where;
        }
        
        global $wpdb;
        $user_roles = (array) $user->roles;
        $role_conditions = [];
        
        // 为每个用户角色生成安全的LIKE匹配条件
        foreach ($user_roles as $role) {
            $role_conditions[] = $wpdb->prepare("pm2.meta_value LIKE %s", '%' . $role . '%');
        }
        $role_condition = implode(' OR ', $role_conditions);
        
        // 添加自定义字段的关联过滤规则
        $where .= $wpdb->prepare(" AND EXISTS (
            SELECT 1 FROM {$wpdb->postmeta} pm1
            JOIN {$wpdb->postmeta} pm2 ON pm1.post_id = pm2.post_id
            WHERE pm1.post_id = {$wpdb->posts}.ID
            AND pm1.meta_key = %s AND pm1.meta_value = %s
            AND pm2.meta_key = %s AND ({$role_condition})
        )", 'ure_prohibit_allow_flag', '2', 'ure_content_for_roles');
    }
    return $where;
}
add_filter('posts_where', 'filter_posts_by_user_role', 10, 2);

方案二:加载后过滤(兼容原逻辑)

若需保留原判断逻辑,可通过the_post钩子在文章对象加载后修改状态,实现自动隐藏:

function hide_posts_by_user_role($post) {
    $user = wp_get_current_user();
    $get_roles = (array) $user->roles;
    $cust = get_post_custom($post->ID);
    
    $ure_roles = isset($cust["ure_content_for_roles"][0]) ? $cust["ure_content_for_roles"][0] : '';
    $ure_flag = isset($cust["ure_prohibit_allow_flag"][0]) ? $cust["ure_prohibit_allow_flag"][0] : '';
    $ure_display = false;
    $permchk = 0;
            
    foreach ($get_roles as $value) {
        if (str_contains($ure_roles, $value)) {
            $permchk = 1;
        }
    }
            
    if ($permchk == 1 && $ure_flag == 2) {
        $ure_display = true;
    }
    
    // 不满足条件时标记为私有,实现隐藏
    if (!$ure_display) {
        $post->post_status = 'private';
    }
    return $post;
}
add_filter('the_post', 'hide_posts_by_user_role');

注意事项

  • 方案一直接在数据库层面过滤,性能更优,优先推荐使用。
  • 可根据需求调整钩子的生效范围,比如添加$query->is_singular()或$query->post_type == 'post'来限制特定场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:52:52