WordPress如何在WP Travel的Booking自定义文章状态变更时发送确认邮件
原代码错误原因
- 状态值匹配错误:
transition_post_status钩子传递的状态参数是小写slug,你写的大写Booked无法匹配,同时判断逻辑写反,你需要的是旧状态等于pending,但你写的是'pending' !== $old_status,完全不符合触发条件。 - 自定义文章类型slug错误:WP Travel插件的预订自定义文章类型默认slug是
wp-travel-booking,不是你填写的大写Booking,post_type判断不成立。 - 钩子使用场景错误:
transition_post_status是后台逻辑执行阶段的钩子,直接输出script标签大概率不会被渲染到前端,看不到alert属于正常情况。 - 缺少冗余场景过滤:没有排除自动保存、修订版本等非用户主动修改状态的场景,就算前面判断对了也可能出现误触发或者不触发的情况。
正确实现代码
下面的代码可以直接放到你主题的functions.php文件,或者自定义代码片段插件中使用:
function send_booking_confirmation_email( $new_status, $old_status, $post ) { // 过滤场景:排除自动保存、修订版本 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if ( wp_is_post_revision( $post->ID ) ) return; // 核心判断:自定义文章类型是WP Travel的预订,且状态从pending变为booked if ( $post->post_type === 'wp-travel-booking' && $old_status === 'pending' && $new_status === 'booked' ) { // 获取预订关联的用户邮箱,WP Travel的预订数据默认存在post meta里,key是wp_travel_booking_email $customer_email = get_post_meta( $post->ID, 'wp_travel_booking_email', true ); if ( ! is_email( $customer_email ) ) return; // 邮件配置 $subject = '您的预订已确认'; $message = '您好,您的订单已预订成功,感谢您的选择。订单编号:' . $post->ID; $headers = array('Content-Type: text/html; charset=UTF-8'); // 发送邮件 wp_mail( $customer_email, $subject, $message, $headers ); } } add_action( 'transition_post_status', 'send_booking_confirmation_email', 10, 3 );
- 如果你的WP Travel自定义了预订文章类型的slug,把
wp-travel-booking替换成你实际的自定义文章类型slug即可 - 邮件内容可以根据你的需求自行调整,还可以通过
get_post_meta获取更多订单数据插入到邮件内容里
内容的提问来源于stack exchange,提问作者mouna
相关产品推荐
相关产品推荐

