能否延迟执行WordPress函数?解决新用户团队信息为空问题
延迟执行WordPress注册邮件函数解决方案
由于WooCommerce Memberships for Teams插件在用户注册完成后才会分配团队,直接在user_register钩子触发时发送邮件会导致团队名称为空。可以通过WordPress的单次定时事件实现延迟执行邮件发送,确保团队分配完成后再获取团队信息。
代码修改步骤
- 替换原注册触发逻辑,改为调度延迟任务
移除你原来的registration_email_to_admin函数及对应的钩子,替换为以下代码,用于调度延迟执行的邮件发送任务:
add_action( 'user_register', 'schedule_delayed_registration_email_to_admin', 10, 1 ); function schedule_delayed_registration_email_to_admin( $user_id ) { // 设置延迟时间,这里是5分钟(300秒),可根据需求调整 $delay_seconds = 300; $run_time = time() + $delay_seconds; // 检查是否已有相同任务,避免重复调度 $existing_task = wp_next_scheduled( 'custom_delayed_admin_registration_email', array( $user_id ) ); if ( ! $existing_task ) { wp_schedule_single_event( $run_time, 'custom_delayed_admin_registration_email', array( $user_id ) ); } }
- 添加延迟任务的执行函数
注册自定义钩子并编写邮件发送逻辑,确保延迟后执行:
add_action( 'custom_delayed_admin_registration_email', 'send_delayed_registration_email_to_admin', 10, 1 ); function send_delayed_registration_email_to_admin( $user_id ) { // 验证用户是否存在,防止无效ID导致错误 $user = get_user_by( 'id', $user_id ); if ( ! $user ) { return; } // 触发管理员通知邮件 wp_new_user_notification( $user_id ); }
- 保留原邮件内容过滤函数
你之前编写的custom_wp_new_user_notification_admin_email过滤函数无需修改,延迟发送时用户已完成团队分配,wc_memberships_for_teams_get_teams()将能正确获取团队名称。
关键注意事项
- 调整延迟时间:根据团队分配的实际耗时修改
$delay_seconds的值,比如1分钟设为60秒,确保团队分配完成后再执行邮件发送。 - 确保Cron正常运行:WordPress的定时任务依赖内置Cron功能,如果你的网站Cron未正常启用,需联系主机服务商开启,或使用服务器系统Cron替代(更稳定)。
- 避免重复调度:代码中加入了
wp_next_scheduled检查,防止同一用户注册时重复创建延迟任务。
内容的提问来源于stack exchange,提问作者George Fragkos
相关产品推荐
相关产品推荐

