我一直在寻找同一问题的解决方案-我在网上找不到任何帮助,但我自己能够解决,因此对于其他人,这里有一个解决方案:
将挂钩从woocommerce_order_refunded
到woocommerce_order_partially_refunded
. 这只会在订单部分退款时触发。如果您退还订单中剩余的全部项目数量,则订单状态将更改为Refunded 以及woocommerce_order_refunded
钩子会开火。
以下是此问题的工作代码。确保单击Recalculate 上的按钮Edit Order 处理部分退款后的屏幕-我在WooCommerce中发现了一个错误,在同一订单中为不同的商品单独发出额外的部分退款-原始退款金额将被错误更改。“重新计算”按钮可解决此问题,但仅当您在发放部分退款之前按下该按钮时。
function action_woocommerce_order_refunded( $order_id, $refund_id )
{
//init
$restock_items = $_POST[\'restock_refunded_items\'];
// If restock isn\'t checked skip
if( $restock_items == \'true\' ) {
$refund = wc_get_order( $refund_id );
$refunded_items = $refund->get_items();
foreach( $refunded_items as $refunded_item_id => $refunded_item ) {
$refunded_quantity = $refunded_item->get_quantity(); // returns negative number e.g. -1
$refunded_quantity = $refunded_quantity *-1; // convert to positive number
$refunded_product_id = $refunded_item->get_product_id();
$usa_stock_toggle = get_post_meta( $refunded_product_id, \'_usa_stock_toggle\', true );
if( !empty( $usa_stock_toggle ) ){
$usa_stock_levels = get_post_meta( $refunded_product_id \'_usa_stock_field\', true ); // Get stock level
$updated_usa_stock_levels = $usa_stock_levels + $refunded_quantity; // Work out new stock level
update_post_meta( $refunded_product_id, \'_usa_stock_field\', $updated_usa_stock_levels ); // Update stock level
}
}
}
}
add_action( \'woocommerce_order_partially_refunded\', \'action_woocommerce_order_refunded\', 10, 2 );
当订单从部分退款更改为完全退款时,您需要计算退款数量的差异,我开始研究这个问题,但尚未找到解决方案。
您可能还想看看如何使用挂钩woocommerce_refund_deleted
如果您需要删除错误发放的退款,并需要重新存储元数据。