这是因为您的代码中有几个错误!
-
您正在使用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 不负责获取这些状态。
-
此外,在尝试调试/测试代码时,特别是在 transition_post_status 和 save_post 挂钩上,请不使用 javascript alert、console.log 和/或 php echo , print_r, var_dump 等等,因为当你点击这些钩子时,打印、回显、警报将不起作用。只需使用 php die 函数,它会停止应用程序并让您知道您成功了。
-
大小写也很重要!确保您为您的值使用了正确的大小写,例如,在这种情况下,所有内容都是小写的。所以请留意!
现在你能做些什么呢?
- 好吧,您可以将挂钩更改为
save_post 操作挂钩,这意味着每次您更新帖子时,它都会触发!
- 您可以更改条件检查以查找
itinerary-booking 自定义帖子类型。
- 你也可以使用
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 这是状态从“待定”更改为的日期和时间第一次“预订”。
所有的 sn-ps 和解释都已经过全面测试并且可以正常工作!