WordPress中get_current_user_id()与数字严格比较失效问题问询
WordPress template_include 过滤器逻辑问题原理说明
1. 初始代码失效的核心原因
初始代码的判断逻辑和需求完全相反,和类型比较没有任何关系:
你的需求是「仅ID为11的用户可加载single-ressource.php,其余用户返回single.php」,但初始代码的条件为:
// 匹配到自定义模板 且 用户ID为11时,返回默认模板 if ( $template === locate_template('single-ressource.php') && get_current_user_id() === 11 ) { return locate_template( 'single.php' ); }
这就导致你自己(ID11)访问时反而被强制切换到single.php,普通用户反而能正常看到自定义模板,自然不符合预期。
2. 改为字符串'11'后误判生效的原因
get_current_user_id()返回值为整数类型,=== '11'属于严格比较,类型不一致时条件永远为假,整个if分支永远不会执行,所有用户访问时都直接返回single-ressource.php。你作为ID11的用户访问时能看到自定义模板,就误以为逻辑生效,实际上权限控制完全失效,所有用户都可访问该模板。
3. 最终代码生效的逻辑
你将判断条件改为get_current_user_id() !== 11后,逻辑完全匹配需求:
当匹配到single-ressource.php模板且当前用户不是ID11的管理员时,才返回默认single.php,ID11的用户会跳过判断分支直接加载自定义模板,符合权限控制要求。
补充优化建议
- 不要用WordPress内置钩子名
template_redirect作为自定义函数名,避免命名冲突 - 可用WP原生条件函数
is_singular('ressource')判断自定义文章类型单页,比模板路径判断更稳定,不受模板目录结构变化影响,优化后代码参考:
function custom_ressource_template_control( $template ) { if ( is_singular( 'ressource' ) && get_current_user_id() !== 11 ) { $single_template = locate_template( 'single.php' ); return $single_template ? $single_template : $template; } return $template; } add_filter( 'template_include', 'custom_ressource_template_control', 99 );
内容的提问来源于stack exchange,提问作者Idan Carta-Lag
相关产品推荐
相关产品推荐

