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

functions.php中set_current_user钩子定义的常量无法被同文件函数访问

问题排查与解决方案

核心原因分析

虽然admin_enqueue_scripts的执行顺序确实晚于set_current_user,但出现常量未定义的问题,通常是以下场景导致:

  • set_current_user的回调函数优先级过低,导致admin_enqueue_scripts触发时,常量还未完成定义
  • 回调函数中存在前端专属的条件判断(比如is_front_page()、is_single()),后台执行时跳过了常量定义逻辑

具体解决步骤

  1. 调整钩子优先级
    给set_current_user的回调设置更高的优先级(比如5,比默认的10更早执行),确保常量在admin_enqueue_scripts之前被定义:
add_action('set_current_user', 'define_custom_constants', 5);
function define_custom_constants() {
    define('_S_IS_USER_LOGGED_IN', is_user_logged_in());
    // 你的其他常量定义逻辑
    define('_S_IS_BUSINESS_CARD_USER_1', /* 你的判断条件 */);
}
  1. 检查回调中的条件逻辑
    如果回调里有针对前端页面的判断,移除或补充后台兼容的逻辑,确保后台执行时也会定义常量:
function define_custom_constants() {
    // 去掉仅前端生效的判断,或者增加后台兼容逻辑
    // if (is_frontend()) { /* 原逻辑 */ }
    define('_S_IS_USER_LOGGED_IN', is_user_logged_in());
    define('_S_IS_BUSINESS_CARD_USER_1', current_user_can('some_capability') || /* 后台适用的判断 */);
}
  1. 替代方案:改用init钩子定义常量
    如果set_current_user的执行时机在后台仍有不确定性,可以把常量定义移到init钩子——它在前后台都会触发,且执行顺序远早于admin_enqueue_scripts:
add_action('init', 'define_custom_constants', 10);
function define_custom_constants() {
    define('_S_IS_USER_LOGGED_IN', is_user_logged_in());
    define('_S_IS_BUSINESS_CARD_USER_1', /* 你的判断逻辑 */);
}

验证方法

在常量定义后加日志输出,确认后台执行时是否成功定义:

function define_custom_constants() {
    define('_S_IS_USER_LOGGED_IN', is_user_logged_in());
    define('_S_IS_BUSINESS_CARD_USER_1', /* 你的判断 */);
    error_log('Custom constants defined: ' . _S_IS_BUSINESS_CARD_USER_1);
}

打开后台后查看PHP错误日志,确认是否有这条记录,以此验证常量是否被正常定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:45:54