【问题标题】:How to get order items on a foreach loop in WooCommerce 3如何在 WooCommerce 3 的 foreach 循环中获取订单商品
【发布时间】:2019-05-23 02:20:00
【问题描述】:

当我尝试通过我的 functions.php 获取订单商品时,我在这里遇到了这个问题:

未捕获的错误:调用未定义的方法 WC_Order::get_order_items()

这是我的代码(我找不到问题):

add_filter( 'wp_nav_menu_objects', 'set_navigation_user_name' );
function set_navigation_user_name( $menu_items ) {

    //Get current user
    $current_user = wp_get_current_user();

    foreach ( $menu_items as $menu_item ) {
        if ( '{user_name}' === $menu_item->title ) {
            //Get first and lastname from current user
            $user_firstname = $current_user->user_firstname;
            $user_lastname  = $current_user->user_lastname;

            $menu_item->title = $user_firstname . ' ' . $user_lastname;
        } elseif ( '{available_pay}' === $menu_item->title ) {

            $available_pay = 0;

            $order_states = array(
                'wc-completed',
                'wc-pending'
            );

            $orders = wc_get_orders( array(
                'numberposts' => - 1,
                'meta_key'    => '_customer_user',
                'meta_value'  => get_current_user_id(),
                'post_status' => $order_states
            ) );

            foreach ( $orders as $order ) {
                if ( count( $order->get_order_items() ) > 0 ) {
                    foreach ( $order->get_order_items() as $item_id => $item ) {
                        //Order pay
                        $order_pay = wc_get_order_item_meta( $item_id, '_line_total', true );

                        //Add order pay to available pay
                        $available_pay += $order_pay;
                    }
                }
            }

            $menu_item->title = 'Order pay sum: ' . wc_price( $available_pay );
        }
    }

    return $menu_items;
}

【问题讨论】:

    标签: php wordpress methods woocommerce orders


    【解决方案1】:

    您需要改用WC_Order method get_items()... 因为 WC_Order get_order_items() Woocommerce 方法不存在......

    此外,从 Woocommerce 3 开始,您可以使用 WC_Order_Item_Product get_total() 方法而不是 wc_get_order_item_meta( $item_id, '_line_total', true );

    因此,在您的代码中,您将更改以下内容:

                foreach ( $orders as $order ) {
                    if ( count( $order->get_items() ) > 0 ) {
                        foreach ( $order->get_items() as $item_id => $item ) {
                            // Add order pay to available pay
                            $available_pay += $item->get_total();
                        }
                    }
                }
    

    相关话题:

    【讨论】:

    • 这行得通。谢谢!另一种方法可以正常工作,例如在订单页面上,很奇怪。
    猜你喜欢
    • 2018-01-24
    • 2021-04-02
    • 2019-01-26
    • 1970-01-01
    • 2017-09-17
    • 2019-02-23
    • 1970-01-01
    • 2019-02-28
    • 2018-10-14
    相关资源
    最近更新 更多