如何在MemberPress注册时捕获URL参数并保存到用户元数据?
解决MemberPress注册时无法获取URL中source参数并保存到用户元数据的问题
问题核心在于:MemberPress的注册流程通常包含页面跳转(比如表单提交后到处理页面),当mepr-event-member-signup-completed钩子触发时,原始请求的$_GET['source']参数已经丢失,无法直接获取。
解决方案思路
先将source参数临时存储到PHP会话中,待注册完成钩子触发时,再从会话中取出参数并保存到用户元数据,最后清理会话中的临时数据。
完整代码实现
- 初始化会话并临时存储source参数
// 初始化PHP会话 add_action('init', 'init_signup_referral_session'); function init_signup_referral_session() { if (!session_id()) { session_start(); } } // 在注册页面加载时,将source参数存入会话 add_action('template_redirect', 'store_signup_source_to_session'); function store_signup_source_to_session() { // 替换为你的MemberPress注册页面的slug或ID $signup_page_slug = 'register'; if (is_page($signup_page_slug) && isset($_GET['source']) && !empty($_GET['source'])) { $_SESSION['temp_signup_source'] = sanitize_text_field($_GET['source']); } }
- 修改原钩子函数,从会话中获取参数并保存
add_action('mepr-event-member-signup-completed', 'save_signup_source_to_usermeta', 10, 1); function save_signup_source_to_usermeta($membership_id){ $current_user = wp_get_current_user(); // 检查会话中是否存在临时存储的source参数 if (!isset($_SESSION['temp_signup_source']) || empty($_SESSION['temp_signup_source'])) { return; } $source = sanitize_text_field($_SESSION['temp_signup_source']); update_user_meta($current_user->ID, 'source', $source); // 清理会话中的临时数据,避免后续请求复用 unset($_SESSION['temp_signup_source']); }
注意事项
- 请确保
$signup_page_slug变量的值与你的MemberPress注册页面的slug一致,如果使用页面ID,可将is_page($signup_page_slug)改为is_page(123)(123为页面ID)。 - 若你的主机禁用了PHP会话,可改用WordPress的
transient临时存储,结合用户的浏览器cookie标识来关联数据(比如生成一个临时cookie,将source值存入transient并以cookie值为键)。 - 测试时需确保注册流程中没有清除会话的操作,部分缓存插件可能会影响会话,若遇到问题可临时禁用缓存插件排查。
内容的提问来源于stack exchange,提问作者Majid Ali shah
相关产品推荐
相关产品推荐

