如何在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
相关产品推荐
相关产品推荐

