在Contact Form7附件钩子中获取当前用户ID始终为0的求助
解决
get_current_user_id()返回0的问题 问题原因
get_current_user_id()返回0的核心原因是代码执行时机过早:WordPress要等到init钩子(默认优先级1)才会完成用户会话的初始化,在此之前调用该函数,系统还未识别当前用户,自然返回0。
你遇到的两种场景:
- 在
functions.php根级别直接调用:属于主题初始化的早期阶段,远早于init钩子,所以必然返回0。 - 在
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
相关产品推荐
相关产品推荐

