基于Mollie支付状态更新WooCommerce订单自定义元数据求助
修复WooCommerce Mollie支付状态同步自定义字段代码
原代码问题分析
- 触发时机错误:
woocommerce_checkout_update_order_meta钩子在订单刚创建时执行,此时支付流程尚未完成,Mollie的支付状态字段还未更新,无法获取正确的支付状态。 - 方法调用错误:
$order->get_mollie_paid_and_processed()并非WooCommerce或Mollie官方提供的标准方法,无法正确读取支付状态标记。
修复方案一:基于WooCommerce订单状态变更钩子
利用订单状态变更触发更新,适配所有支付方式的状态逻辑:
add_action( 'woocommerce_order_status_changed', 'update_custom_is_order_paid_field', 10, 4 ); function update_custom_is_order_paid_field( $order_id, $old_status, $new_status, $order ) { // 定义已支付状态集合,可根据业务调整 $paid_statuses = array( 'processing', 'completed' ); if ( in_array( $new_status, $paid_statuses ) ) { update_post_meta( $order_id, 'custom_is_order_paid', '1' ); } elseif ( in_array( $new_status, array( 'pending', 'failed', 'cancelled' ) ) ) { update_post_meta( $order_id, 'custom_is_order_paid', '0' ); } }
修复方案二:基于Mollie专属支付状态钩子(精准适配)
直接监听Mollie支付状态更新事件,仅针对Mollie支付订单生效:
add_action( 'mollie_payment_status_updated', 'update_custom_is_order_paid_field', 10, 2 ); function update_custom_is_order_paid_field( $payment, $order ) { $order_id = $order->get_id(); $mollie_status = $payment->getStatus(); // 根据Mollie官方支付状态映射自定义字段 if ( in_array( $mollie_status, array( 'paid', 'authorized' ) ) ) { update_post_meta( $order_id, 'custom_is_order_paid', '1' ); } elseif ( in_array( $mollie_status, array( 'failed', 'expired', 'canceled' ) ) ) { update_post_meta( $order_id, 'custom_is_order_paid', '0' ); } }
补充:若需依赖_mollie_paid_and_processed元字段
如果业务必须基于该字段判断,可在上述钩子中替换判断逻辑:
$mollie_paid_flag = get_post_meta( $order_id, '_mollie_paid_and_processed', true ); update_post_meta( $order_id, 'custom_is_order_paid', $mollie_paid_flag === '1' ? '1' : '0' );
内容的提问来源于stack exchange,提问作者Jeriss Cloud Center
相关产品推荐
相关产品推荐

