WordPress注册邮件通知无法显示2个用户元字段数据求助
WordPress注册通知邮件自定义字段无法显示问题排查
问题描述
使用下方代码实现用户注册后向管理员发送通知邮件,后台用户的tp_phone_number(电话)和description(公司)字段已填写完整,但邮件中这两个字段始终显示为N/A,尝试添加update_user_meta同步数据也未解决。
原代码
function custom_registration_notification($user_id) { $user = get_userdata($user_id); $admin_email = 'admin@hl.de'; // 接收通知的管理员邮箱 $subject = 'Neue Registrierung auf www.hl.de'; // 用户基础信息 $username = $user->user_login; $user_email = $user->user_email; // 获取用户自定义字段 $first_name = get_user_meta($user_id, 'first_name', true); $last_name = get_user_meta($user_id, 'last_name', true); $tp_phone_number = get_user_meta($user_id, 'tp_phone_number', true); update_user_meta($user_id, 'tp_phone_number', $tp_phone_number); $description = get_user_meta($user_id, 'description', true); update_user_meta($user_id, 'description', $description); // 为空字段设置默认值 if (empty($first_name)) { $first_name = 'N/A'; } if (empty($last_name)) { $last_name = 'N/A'; } if (empty($tp_phone_number)) { $tp_phone_number = 'N/A'; } if (empty($description)) { $description = 'N/A'; } $message = 'Ein neuer Benutzer hat sich auf der Website registriert:' . "\n\n"; $message .= 'Vorname: ' . $first_name . "\n"; $message .= 'Nachname: ' . $last_name . "\n"; $message .= 'E-Mail: ' . $user_email . "\n"; $message .= 'Telefonnummer: ' . $tp_phone_number . "\n"; $message .= 'Unternehmen: ' . $description . "\n"; wp_mail($admin_email, $subject, $message); error_log('Custom Registration Error: ' . print_r($tp_phone_number, true)); } add_action('user_register', 'custom_registration_notification');
问题原因分析
- 钩子触发时机不对:
user_register钩子在用户账号创建完成后立即触发,但如果注册表单是通过插件或自定义代码实现的,tp_phone_number、description这类额外字段可能在user_register之后才被写入数据库,此时调用get_user_meta自然取不到数据。 - 冗余代码无效:代码里的
update_user_meta完全没用——刚从数据库取出值,又把相同的值写回去,对解决字段为空的问题没有任何帮助。 - 字段键名可能不匹配:需确认注册表单提交时,电话和公司字段的
name属性是否与tp_phone_number、description完全一致,键名大小写、拼写错误都会导致取数失败。
解决方案
1. 更换触发钩子
将user_register替换为profile_update,该钩子在用户资料(包括注册时的额外字段)保存完成后触发,确保能取到所有字段数据。同时添加判断,避免重复发送邮件:
function custom_registration_notification($user_id, $old_user_data) { // 仅在用户首次注册时触发(旧数据为空即为新用户) if (empty($old_user_data->ID)) { $user = get_userdata($user_id); $admin_email = 'admin@hl.de'; $subject = 'Neue Registrierung auf www.hl.de'; $username = $user->user_login; $user_email = $user->user_email; $first_name = get_user_meta($user_id, 'first_name', true); $last_name = get_user_meta($user_id, 'last_name', true); $tp_phone_number = get_user_meta($user_id, 'tp_phone_number', true); $description = get_user_meta($user_id, 'description', true); if (empty($first_name)) $first_name = 'N/A'; if (empty($last_name)) $last_name = 'N/A'; if (empty($tp_phone_number)) $tp_phone_number = 'N/A'; if (empty($description)) $description = 'N/A'; $message = 'Ein neuer Benutzer hat sich auf der Website registriert:' . "\n\n"; $message .= 'Vorname: ' . $first_name . "\n"; $message .= 'Nachname: ' . $last_name . "\n"; $message .= 'E-Mail: ' . $user_email . "\n"; $message .= 'Telefonnummer: ' . $tp_phone_number . "\n"; $message .= 'Unternehmen: ' . $description . "\n"; wp_mail($admin_email, $subject, $message); error_log('Custom Registration Phone: ' . print_r($tp_phone_number, true)); } } add_action('profile_update', 'custom_registration_notification', 10, 2);
2. 移除冗余代码
删除原代码中这两行无用的update_user_meta代码:
update_user_meta($user_id, 'tp_phone_number', $tp_phone_number); update_user_meta($user_id, 'description', $description);
3. 验证字段键名正确性
检查注册表单中电话字段的name是否为tp_phone_number,公司字段是否对应description(部分主题/插件可能使用自定义键名,比如company而非description)。
4. 增强日志排查
在获取字段后添加日志,确认实际取到的值,方便定位问题:
error_log('Phone Meta Value: ' . print_r($tp_phone_number, true)); error_log('Description Meta Value: ' . print_r($description, true));
通过查看WordPress日志(通常在wp-content/debug.log),确认字段是否真的未被写入数据库。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

