WooCommerce订单退款获得数量退款

时间:2020-06-19 作者:SamXronn

我有一些自定义元数据绑定到一个产品,我想增加订单退款时的计数。退款发出后,您当然只能退还部分或全部订购数量。我只想拿到一定数量的退款。

如果您有5个相同项目的订单,并且退款1,我的函数将返回1,如果您在最初退款1后再退款2,则返回1。我的函数返回3,这是该会话中的总数,而不是具体数字。

是否有可能只获取具体行动的数量,而不是总数?

function action_woocommerce_order_refunded( $order_id, $refund_id ) 
{ 
    //init
    $restock_items = $_POST[\'restock_refunded_items\'];
    $order = wc_get_order( $order_id );
    $order_refunds = $order->get_refunds();


// If restock isn\'t checked skip
if($restock_items == \'true\'){
    foreach( $order_refunds as $refund ){
        foreach( $refund->get_items() as $item_id => $item ){

            $refunded_quantity = $item->get_quantity();         // returns negative number e.g. -1
            $refunded_quantity = substr($refunded_quantity, 1); // trim the negative "-" from the string

            $usa_stock_toggle = get_post_meta($item->get_product_id() , \'_usa_stock_toggle\', true);

            if(!empty($usa_stock_toggle)){
                $usa_stock_levels = get_post_meta($item->get_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($item->get_product_id() , \'_usa_stock_field\', $updated_usa_stock_levels ); // Update stock level
            }
            
        }
    }
}
}
add_action( \'woocommerce_order_refunded\', \'action_woocommerce_order_refunded\', 10, 2 ); 

1 个回复
SO网友:Jamio

我一直在寻找同一问题的解决方案-我在网上找不到任何帮助,但我自己能够解决,因此对于其他人,这里有一个解决方案:

将挂钩从woocommerce_order_refundedwoocommerce_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 如果您需要删除错误发放的退款,并需要重新存储元数据。

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在