1

WP travel我在插件中有一个名为“Booking”的自定义帖子类型。当我将该自定义帖子类型的状态从“待定”更改为“已预订”时,我希望它触发一个事件。

该事件应向相关用户发送确认电子邮件。

我尝试了以下方法:

function show_alert_msg( $new_status, $old_status, $post ) {
    if ( 'Booked' === $new_status && 'pending' !== $old_status && $post->post_type=='Booking' )
        
     {
         echo '<script>alert(Show message after transition to booked)</script>' ;
    }else{
        echo '<script>alert(failed)</script>' ;

    }
}
add_action( 'transition_post_status', 'show_alert_msg', 10, 3 );

但每当我改变状态时,什么都没有发生。

我做错了什么?以及如何正确处理此问题,以便当预订状态从待定更改为已预订时,将确认电子邮件发送给用户?

4

1 回答 1

4

这是因为您的代码中有几个错误!

  • 你正在使用WP travel plugin. 此插件将其自定义帖子类型注册为"itinerary-booking",但在您的代码中,您正在检查一个名为的自定义帖子类型"Booking",它不存在,因此该条件永远不会返回 true!

    您可以导航到此路径:
    “您的网站文件夹 > wp-content > 插件 > wp-travel > inc”
    并在线打开class-post-types.php文件,126您会看到这个register_post_type( 'itinerary-booking', $args );

  • 此外,您正在使用transition_post_status用于检查帖子状态的操作挂钩。pending和的状态booked是自定义的帖子元数据,并以名称保存到数据库中,wp_travel_booking_status与帖子状态本身无关!这意味着它与您尝试做的完全不同。

在此处输入图像描述 在此处输入图像描述

因此,此过滤器挂钩transition_post_status不负责获取这些状态。

  • 此外,在尝试调试/测试代码时,特别是 ontransition_post_statussave_posthooks,不要使用 javascriptalertconsole.log/或 phpechoprint_rvar_dump因为当你点击这些钩子时,打印、回显、警报将不起作用。只需使用 phpdie函数,该函数将停止应用程序并让您知道您成功了。

  • 大小写也很重要!确保您为您的值使用了正确的大小写,例如,在这种情况下,所有内容都是小写的。所以请密切注意!


现在你能做些什么呢?

  1. 好吧,您可以将您的钩子更改为save_post操作钩子,这意味着每次您更新帖子时,它都会触发!
  2. 您可以更改条件检查以查找itinerary-booking自定义帖子类型。
  3. 你也可以使用get_post_meta函数来检查你的状态变化!

现在将它们放在一起,您可以使用以下代码:

add_action( 'save_post', 'sending_email_confirmation_to_user');

function sending_email_confirmation_to_user( $post_id )
{

  if ( 'itinerary-booking' == get_post_type( $post_id ) ){

    $post_status_after_update = get_post_meta( $post_id, 'wp_travel_booking_status', true );

    if( 'booked' === $post_status_after_update ){
      die("Send your email here!");
    } else {
      die("your post status is not booked!");
    }
  }

}

笔记:

  • 我使用die语句只是为了给你一个例子,所以一定die("Send your email here!");要用你的发送电子邮件的自定义函数替换!
  • 的状态booked是小写的,所以不要像你在代码中尝试的那样把它改成大写!否则就不行了!
  • 当您的帖子状态不是“已预订”时,您无需执行任何操作,我曾经die("your post status is not booked!");只是给您举个例子!

更新

当您使用save_post钩子时,它会在您每次更新自定义帖子数据时运行,您不想每次都发送电子邮件。对?

当您将状态从“待定”更改为“已预订”时,您可以save a meta data在数据库中知道您已经发送了一封电子邮件确认并且您不想再发送一封电子邮件。你可以使用update_post_meta函数来做到这一点。

add_action( 'save_post', 'sending_email_confirmation_to_user');

function sending_email_confirmation_to_user( $post_id )
{

  if ( 'itinerary-booking' == get_post_type( $post_id ) ){

    $post_email_status = get_post_meta( $post_id, 'custom_confirmation_email', true );
    $post_status_after_update = get_post_meta( $post_id, 'wp_travel_booking_status', true );

    if( 'booked' === $post_status_after_update && empty( $post_email_status )){
      $email_sent = update_post_meta( $post_id, 'custom_confirmation_email', 'sent-at-'. date( 'M_d_Y-H_i_s' ) );
      die("Send your email here!");
    } 
  }

}

笔记:

  • 这将确保您只发送一次电子邮件确认!
  • 如果数据库中的电子邮件确认数据为空,它将发送电子邮件并更新数据库中的值,并且不会发送额外的电子邮件。
  • 另外,我在您的数据库中存储了一个元数据,custom_confirmation_email并用作'sent-at-'. date('M_d_Y-H_i_s')它的值,如下所示:sent-at-Oct_01_2021-17_42_42这是状态第一次从“待定”变为“已预订”的日期和时间。

所有的片段和解释都已经过全面测试并且可以工作!

于 2021-10-01T00:12:32.080 回答