如何在WooCommerce管理员订单屏幕上编辑订单时更新订单项目

时间:2020-02-05 作者:kojak

是否可以在woocommerce管理员编辑订单屏幕中编辑订单项目总计和自定义费用?我唯一能找到的钩子是woocommerce_new_order_item, 但是,当我在管理中添加/删除产品时,我需要调整自定义订单项目总数(例如,作为订单行项目费用的押金和交货费)。

例如,如果我在“编辑订单管理”中增加了产品的数量(或向订单中添加了其他产品),我还需要增加订单上的存款金额。我还需要做相反的事情,如果我减少数量或从订单中删除某个产品,我将需要减少押金金额。

这可行吗??我应该看什么钩子?我搜索了几个论坛,似乎找不到答案。

任何帮助都将不胜感激。

2 个回复
最合适的回答,由SO网友:kojak 整理而成

这个woocommerce_order_before_calculate_totals 当项目更改或按下“重新计算”按钮时,钩子将在编辑订单管理屏幕中执行。这允许您循环查看订单中的每个项目和费用,并根据需要进行编辑。我有一笔叫做“存款”的费用,如果存在,我会更新,如果没有,我会添加。

function custom_order_before_calculate_totals($and_taxes, $order ) {
    // The loop to get the order items which are WC_Order_Item_Product objects since WC 3+
    // loop all products and calculate total deposit
    $total_deposit = 0;
    foreach( $order->get_items() as $item_id => $item ) {
        // get the WC_Product object
        $product = $item->get_product();

        // get the quantity
        $product_quantity = $item->get_quantity();

        // get the deposit amount
        $deposit = $product->get_attribute(\'deposit\') * $product_quantity;

        // sum of deposits from all products
        $total_deposit += $deposit;
    }


    // update the Deposit fee if it exists
    $deposit_fee_exists = false;
    foreach( $order->get_fees() as $item_id => $item_fee ) {
        $fee_name = $item_fee->get_name();

        if ( $fee_name == \'Deposit\' ) {
            $item_fee->set_tax_status(\'none\'); // no tax on deposit
            $item_fee->set_total($total_deposit);
            $deposit_fee_exists = true;
            break;
        }
    }

    // if there isn\'t an existing deposit fee then add it
    if ( $total_deposit > 0 && !$deposit_fee_exists ) {
        // Get a new instance of the WC_Order_Item_Fee Object
        $item_fee = new WC_Order_Item_Fee();

        $item_fee->set_name( "Deposit" ); // Generic fee name
        $item_fee->set_amount( $total_deposit ); // Fee amount
        $item_fee->set_tax_status( \'none\' ); // or \'none\'
        $item_fee->set_total( $total_deposit ); // Fee amount

        // Add Fee item to the order
        $order->add_item( $item_fee );
    }
}
add_action( \'woocommerce_order_before_calculate_totals\', "custom_order_before_calculate_totals", 10, 3);

SO网友:Yashar

首先,欢迎来到社区:)

添加/删除订单项目(例如产品)时,WooCommerce使用Ajax调用来更新订单。

向订单中添加新项目WC_AJAX::add_order_item(). 此方法执行添加过程,然后激发woocommerce_ajax_order_items_added 行动挂钩。我们可以用这个动作在订单上做一些讨厌的事情!

例如,如果我想添加总计为1000的订单费用,当产品类别188中的一个产品添加到订单中时,这将实现以下技巧:

add_action(\'woocommerce_ajax_order_items_added\', \'tst_update_order\', 10, 2);

/**
 * @param \\WC_Order_Item[]  $added_items
 * @param \\WC_order $order
 */
function tst_update_order( $added_items, $order )
{
    foreach ( $added_items as $added_item ) {

        if ( \'line_item\' === $added_item->get_type() ) {

            /** @var \\WC_Order_Item_Product $added_item */
            $product = $added_item->get_product();
            $cat_ids = $product->get_category_ids();

            if ( in_array( 188, $cat_ids ) ) {
                $fee = new \\WC_Order_Item_Fee();
                $fee->set_name(\'Order Fee\');
                $fee->set_total(\'1000\');
                $fee->save();
                $order->add_item($fee);
                $order->save();
            }
        }
    }
}
Note: 还有一个动作woocommerce_ajax_add_order_item_meta 更新每个订单项目时激发。您可能希望使用它,而不是循环$added_items.

从订单中删除现有项目从当前订单中删除项目的相应方法是WC_AJAX::remove_order_item(). 此方法本身使用wc_delete_order_item() 函数删除订单项。您可能需要使用woocommerce_before_delete_order_item 此函数中定义的用于执行计算和更新订单的操作。

相关推荐

使用force_ssl_admin强制使用SSL

我跟着this advice 从官方文件中强制SSL:define(\'FORCE_SSL_ADMIN\', true); if (strpos($_SERVER[\'HTTP_X_FORWARDED_PROTO\'], \'https\') !== false) $_SERVER[\'HTTPS\']=\'on\'; Wordpress在docker容器中运行。当它开始时,它说警告:未设置\\u服务器变量。默认为空字符串。Wordpress的日志显示:PHP致命错误:赋值只能发生