WooCommerce订阅:修改结束日期时添加订单备注失败求助
WooCommerce订阅结束日期修改时添加订单备注失败的解决
我尝试在WooCommerce订阅的结束日期被修改时自动添加一条订单备注,但目前使用的代码片段无法实现这个功能。
原代码如下:
function add_subscription_note_when_end_date_change($subscription_id){ $subscription = wc_get_order($subscription_id); $old_end_date = substr($end[0],0,10); if($_POST['end'] !==null && $old_end_date !== $_POST['end']){ $note = 'End date changed from '.$old_end_date. ' to ' .$_POST['end']; $subscription->add_order_note($note); } } add_action('woocommerce_process_shop_order_meta','add_subscription_note_when_end_date_change',0);
问题分析
- 变量
$end未定义,直接调用$end[0]会触发PHP错误,导致函数执行中断 - 使用的
woocommerce_process_shop_order_meta钩子是针对普通订单的,不适用于订阅订单 - 直接使用
$_POST未做安全处理,且未验证数据是否存在 - 未验证获取的
$subscription是否为有效的订阅对象
修正后的代码
function add_subscription_note_when_end_date_change( $subscription_id ) { // 获取并验证订阅对象 $subscription = wc_get_order( $subscription_id ); if ( ! $subscription || ! is_a( $subscription, 'WC_Subscription' ) ) { return; } // 获取原结束日期并格式化为Y-m-d $old_end_date = $subscription->get_time( 'end', 'site' ); $old_end_date = date( 'Y-m-d', strtotime( $old_end_date ) ); // 安全获取提交的新结束日期 $new_end_date = isset( $_POST['end'] ) ? sanitize_text_field( $_POST['end'] ) : ''; // 日期不一致时添加订单备注 if ( ! empty( $new_end_date ) && $old_end_date !== $new_end_date ) { $note = sprintf( '结束日期已从 %s 修改为 %s', $old_end_date, $new_end_date ); $subscription->add_order_note( $note ); } } // 绑定订阅专属的保存钩子,确保触发时机正确 add_action( 'woocommerce_subscription_options_save', 'add_subscription_note_when_end_date_change', 10 );
修正说明
- 增加订阅对象有效性校验,避免处理非订阅订单
- 按照官方文档用法,通过
get_time('end')获取原结束日期 - 使用
sanitize_text_field过滤POST数据,提升代码安全性 - 替换为订阅专属钩子
woocommerce_subscription_options_save,确保在订阅设置保存时触发 - 调整钩子优先级为10,保证订阅数据已更新后再添加备注
内容的提问来源于stack exchange,提问作者Nik7
相关产品推荐
相关产品推荐

