这是因为您的代码中有几个错误!
你正在使用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_status
和save_post
hooks,不要使用 javascriptalert
和console.log
/或 phpecho
等print_r
,var_dump
因为当你点击这些钩子时,打印、回显、警报将不起作用。只需使用 phpdie
函数,该函数将停止应用程序并让您知道您成功了。
大小写也很重要!确保您为您的值使用了正确的大小写,例如,在这种情况下,所有内容都是小写的。所以请密切注意!
现在你能做些什么呢?
- 好吧,您可以将您的钩子更改为
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
这是状态第一次从“待定”变为“已预订”的日期和时间。
所有的片段和解释都已经过全面测试并且可以工作!