WooCommerce重新订阅时如何获取_subscription_resubscribe元数据
解决WooCommerce重新订阅时获取原订阅ID的问题
你遇到的核心问题是钩子触发时机过早,导致_subscription_resubscribe元数据还未被写入订阅/订单对象,所以返回null。以下是可行的解决方案:
推荐使用的钩子及代码示例
1. woocommerce_checkout_subscription_created钩子
这个钩子在订阅创建完成且关联订单的元数据已保存后触发,适配重新订阅场景:
function get_original_subscription_id_on_resubscribe( $subscription, $order ) { // 直接从订阅对象获取原订阅ID $original_subscription_id = $subscription->get_meta( '_subscription_resubscribe' ); if ( ! empty( $original_subscription_id ) ) { update_option( 'cancelledSubscriptionId', $original_subscription_id ); update_option( 'NewSubscriptionId', $subscription->get_id() ); } } add_action( 'woocommerce_checkout_subscription_created', 'get_original_subscription_id_on_resubscribe', 10, 2 );
2. woocommerce_subscription_post_created钩子
这是订阅创建后的动作钩子,确保元数据已被持久化到对象中:
function get_original_subscription_id_after_creation( $subscription_id, $subscription ) { $original_subscription_id = $subscription->get_meta( '_subscription_resubscribe' ); if ( ! empty( $original_subscription_id ) ) { update_option( 'cancelledSubscriptionId', $original_subscription_id ); update_option( 'NewSubscriptionId', $subscription_id ); } } add_action( 'woocommerce_subscription_post_created', 'get_original_subscription_id_after_creation', 10, 2 );
关键说明
- 无需通过
wc_get_order转换对象,WC_Subscription本身继承自WC_Order,直接调用订阅对象的get_meta方法即可获取元数据,更高效且避免不必要的转换操作。 - 你之前使用的
wcs_create_subscription和woocommerce_subscription_renewal_order_created触发时机过早,此时_subscription_resubscribe元数据尚未被写入到对象中,因此返回null。
内容的提问来源于stack exchange,提问作者Manohar singh
相关产品推荐
相关产品推荐

