我使用的其中一个支付网关会在交易失败或用户取消交易时将订单状态从“处理”更改为“失败”。当客户稍后尝试为失败的订单付款时,支付网关会抛出错误“重复订单ID”。因此,为了避免此问题,我希望在发生失败订单时自动删除它们。
有一个similar question on this site但是那里给出的解决方案似乎不起作用。
那里提到的代码看起来像这样。
<?php
function update_order_status( $order_id ) {
$order = new WC_Order( $order_id );
$order_status = $order->get_status();
if ('cancelled' == $order_status || 'failed' == $order_status || 'pending' == $order_status ) {
wp_delete_post($order_id,true);
}
}
答案 0 :(得分:0)
您可以使用挂钩在woocommerce_order_status_changed
动作挂钩中的此自定义函数,即订单状态更改时触发。
您需要在功能中设置相关的支付网关(网关ID)...
当状态更改为&#34;取消&#34;此功能将检测订单状态更改(对于此定义的支付网关)并且来自&#34;处理&#34;到&#34;失败&#34;状态。
因此,对于此特定支付网关和此特定订单状态的更改,与当前订单相关的所有数据都将从数据库中完全删除。
在Woocommerce中,所有提交给付款网关的订单都以&#34;待定&#34;状态,所以我们不会使用它。
代码:
add_action( 'woocommerce_order_status_changed', 'auto_destroy_failed_orders', 10, 4 );
function auto_destroy_failed_orders( $order_id, $old_status, $new_status, $order ){
// HERE set your payment Gateway ID (look in WC settings > checkout to get the Gateway ID)
$gateway_id = 'paypal';
if ( $order->get_payment_method() != $gateway_id ) return; // Only for this payment gateway
if ( ( $old_status == 'processing' && $new_status == 'failed' ) || $new_status == 'cancelled' ) {
wp_delete_post( $order_id, true );
}
}
代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。
经过测试和工作。
不方便:当订单状态在编辑订单后端更改时销毁时,您将被重定向到帖子列表页面,而不是重定向到订单编辑页面,因为它没有。 t已经存在了...我试图使用
wp_schedule_single_event()
来延迟,但我无法使用它......