WordPress如何仅向订阅者和访客展示头部Adsense代码
问题根因
- WordPress 无内置
visitor用户角色,未登录访问者调用wp_get_current_user()返回的用户对象roles属性为空数组,因此原判断无法匹配访客场景。 - 原
array_intersect判断逻辑仅能匹配登录用户的角色,未覆盖未登录场景。
可行实现方案
方案1:基础逻辑实现(最直观)
直接先判断用户是否未登录,再判断已登录用户是否为subscriber角色:
<?php $user = wp_get_current_user(); // 未登录用户 或 角色为subscriber的登录用户,输出广告代码 if ( 0 === $user->ID || in_array( 'subscriber', $user->roles ) ) { echo '<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXX" crossorigin="anonymous"></script>'; } ?>
方案2:使用array_diff实现(满足你指定的函数需求)
如果需要用array_diff实现角色匹配,逻辑如下:
<?php $user = wp_get_current_user(); $allowed_roles = [ 'subscriber' ]; // 未登录,或者当前用户角色全部在允许角色列表内,输出广告 if ( 0 === $user->ID || empty( array_diff( $user->roles, $allowed_roles ) ) ) { echo '<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXX" crossorigin="anonymous"></script>'; } ?>
注意事项
- 代码需要挂载到WordPress的
wp_head钩子中,才能正确输出到页面HEAD部分,相比直接硬编码到主题模板header.php更易维护,挂载示例:
add_action( 'wp_head', function() { $user = wp_get_current_user(); $allowed_roles = [ 'subscriber' ]; if ( 0 === $user->ID || empty( array_diff( $user->roles, $allowed_roles ) ) ) { echo '<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXX" crossorigin="anonymous"></script>'; } } );
- 如果站点有多角色配置,可根据实际需求调整允许的角色列表。
内容的提问来源于stack exchange,提问作者Huxtable
相关产品推荐
相关产品推荐

