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

在Contact Form7附件钩子中获取当前用户ID始终为0的求助

解决get_current_user_id()返回0的问题

问题原因

get_current_user_id()返回0的核心原因是代码执行时机过早:WordPress要等到init钩子(默认优先级1)才会完成用户会话的初始化,在此之前调用该函数,系统还未识别当前用户,自然返回0。

你遇到的两种场景:

  1. 在functions.php根级别直接调用:属于主题初始化的早期阶段,远早于init钩子,所以必然返回0。
  2. 在nmr_create_attachment_id_generated钩子中调用:该插件钩子的触发时机可能在CF7表单处理流程的早期,此时用户身份还未完成加载。

解决方案

1. 修复functions.php中直接调用的问题

不要在functions.php根级别直接调用get_current_user_id(),将代码放到init或更晚的钩子中执行:

add_action('init', function() {
    $user_id = get_current_user_id();
    // 后续逻辑
});

2. 修复插件钩子中关联用户的问题

我们可以借助CF7的wpcf7_before_send_mail钩子(触发时机晚于用户初始化)先获取并存储用户ID,再在附件生成钩子中使用:

// 存储当前提交表单的用户ID
add_action('wpcf7_before_send_mail', function($contact_form) {
    global $cf7_current_user_id;
    $cf7_current_user_id = get_current_user_id();
});

// 在附件生成后关联用户
function example_callback_id_generated($attachment_id) {
    global $cf7_current_user_id;
    // 仅当用户已登录时执行关联
    if ($cf7_current_user_id > 0) {
        update_user_meta($cf7_current_user_id, 'ownership_document', $attachment_id);
    }
}
add_action('nmr_create_attachment_id_generated', 'example_callback_id_generated', 10, 1);

或者,也可以在附件钩子的回调中延迟执行关联逻辑,确保用户身份已加载:

function example_callback_id_generated($attachment_id) {
    // 借助wp钩子延迟执行,此时用户已初始化
    add_action('wp', function() use ($attachment_id) {
        $user_id = get_current_user_id();
        if ($user_id > 0) {
            update_user_meta($user_id, 'ownership_document', $attachment_id);
        }
    });
}
add_action('nmr_create_attachment_id_generated', 'example_callback_id_generated', 10, 1);

内容的提问来源于stack exchange,提问作者Amirhossein Hajighorbani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:30:24