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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:36:07