You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:54:03