本篇文章更新時間:2021/06/05
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


這篇文章是引用 How to Get Order Details by Order ID 這篇文中分享的方法。

因為實際應用情境經過測試發現預設的太完美,沒有針對例外處理判斷。我這邊 fork 過來後就修正一些問題,之後也是就這份自己維護了! 其中也包含 wc_display_item_meta 這個方法呼叫有問題,預設是會 echo 資料出來,作為包裝在方法內只會留下一個 NULL ,有點懷疑原作真的有測試過嗎XD

我修正的版本如下:

//to get full order details
function mxp_get_order_detail_by_id($id, $fields = null, $filter = array()) {

    if (is_wp_error($id)) {
        return false;
    }
    // Get the decimal precession
    $dp    = (isset($filter['dp'])) ? intval($filter['dp']) : 2;
    $order = wc_get_order($id); //getting order Object
    if ($order === false) {
        return false;
    }
    $order_data = array(
        'id'                        => $order->get_id(),
        'order_number'              => $order->get_order_number(),
        'created_at'                => $order->get_date_created()->date('Ymd'),
        'updated_at'                => $order->get_date_modified()->date('Ymd'),
        'completed_at'              => !empty($order->get_date_completed()) ? $order->get_date_completed()->date('Ymd') : '',
        'status'                    => $order->get_status(),
        'currency'                  => $order->get_currency(),
        'total'                     => wc_format_decimal($order->get_total(), $dp),
        'subtotal'                  => wc_format_decimal($order->get_subtotal(), $dp),
        'total_line_items_quantity' => $order->get_item_count(),
        'total_tax'                 => wc_format_decimal($order->get_total_tax(), $dp),
        'total_shipping'            => wc_format_decimal($order->get_total_shipping(), $dp),
        'cart_tax'                  => wc_format_decimal($order->get_cart_tax(), $dp),
        'shipping_tax'              => wc_format_decimal($order->get_shipping_tax(), $dp),
        'total_discount'            => wc_format_decimal($order->get_total_discount(), $dp),
        'shipping_methods'          => $order->get_shipping_method(),
        'order_key'                 => $order->get_order_key(),
        'payment_details'           => array(
            'method_id'    => $order->get_payment_method(),
            'method_title' => $order->get_payment_method_title(),
            'paid_at'      => !empty($order->get_date_paid()) ? $order->get_date_paid()->date('Y - m - dH:i:s') : '',
        ),
        'billing_address'           => array(
            'first_name'       => $order->get_billing_first_name(),
            'last_name'        => $order->get_billing_last_name(),
            'company'          => $order->get_billing_company(),
            'address_1'        => $order->get_billing_address_1(),
            'address_2'        => $order->get_billing_address_2(),
            'city'             => $order->get_billing_city(),
            'state'            => $order->get_billing_state(),
            'formated_state'   => WC()->countries->states[$order->get_billing_country()][$order->get_billing_state()], //human readable formated state name
            'postcode'         => $order->get_billing_postcode(),
            'country'          => $order->get_billing_country(),
            'formated_country' => WC()->countries->countries[$order->get_billing_country()], //human readable formated country name
            'email'            => $order->get_billing_email(),
            'phone'            => $order->get_billing_phone(),
        ),
        'shipping_address'          => array(
            'first_name'       => $order->get_shipping_first_name(),
            'last_name'        => $order->get_shipping_last_name(),
            'company'          => $order->get_shipping_company(),
            'address_1'        => $order->get_shipping_address_1(),
            'address_2'        => $order->get_shipping_address_2(),
            'city'             => $order->get_shipping_city(),
            'state'            => $order->get_shipping_state(),
            'formated_state'   => WC()->countries->states[$order->get_shipping_country()][$order->get_shipping_state()], //human readable formated state name
            'postcode'         => $order->get_shipping_postcode(),
            'country'          => $order->get_shipping_country(),
            'formated_country' => WC()->countries->countries[$order->get_shipping_country()], //human readable formated country name
        ),
        'note'                      => $order->get_customer_note(),
        'customer_ip'               => $order->get_customer_ip_address(),
        'customer_user_agent'       => $order->get_customer_user_agent(),
        'customer_id'               => $order->get_user_id(),
        'customer'                  => array(),
        'view_order_url'            => $order->get_view_order_url(),
        'line_items'                => array(),
        'shipping_lines'            => array(),
        'tax_lines'                 => array(),
        'fee_lines'                 => array(),
        'coupon_lines'              => array(),
    );
    if ($order->get_user_id() != null) {
        $customer      = new WC_Customer($order->get_user_id());
        $last_order    = $customer->get_last_order();
        $customer_data = array(
            'id'               => $customer->get_id(),
            'created_at'       => $customer->get_date_created()->date('Ymd'), // API gives UTC times.
            'email'            => $customer->get_email(),
            'first_name'       => $customer->get_first_name(),
            'last_name'        => $customer->get_last_name(),
            'username'         => $customer->get_username(),
            'last_order_id'    => is_object($last_order) ? $last_order->get_id() : null,
            'last_order_date'  => is_object($last_order) ? $last_order->get_date_created()->date('Ymd') : null, // API gives UTC times.
            'orders_count'     => $customer->get_order_count(),
            'total_spent'      => wc_format_decimal($customer->get_total_spent(), 2),
            'avatar_url'       => $customer->get_avatar_url(),
            'billing_address'  => array(
                'first_name' => $customer->get_billing_first_name(),
                'last_name'  => $customer->get_billing_last_name(),
                'company'    => $customer->get_billing_company(),
                'address_1'  => $customer->get_billing_address_1(),
                'address_2'  => $customer->get_billing_address_2(),
                'city'       => $customer->get_billing_city(),
                'state'      => $customer->get_billing_state(),
                'postcode'   => $customer->get_billing_postcode(),
                'country'    => $customer->get_billing_country(),
                'email'      => $customer->get_billing_email(),
                'phone'      => $customer->get_billing_phone(),
            ),
            'shipping_address' => array(
                'first_name' => $customer->get_shipping_first_name(),
                'last_name'  => $customer->get_shipping_last_name(),
                'company'    => $customer->get_shipping_company(),
                'address_1'  => $customer->get_shipping_address_1(),
                'address_2'  => $customer->get_shipping_address_2(),
                'city'       => $customer->get_shipping_city(),
                'state'      => $customer->get_shipping_state(),
                'postcode'   => $customer->get_shipping_postcode(),
                'country'    => $customer->get_shipping_country(),
            ),
        );
        $order_data['customer'] = $customer_data;
    }
    //getting all line items
    foreach ($order->get_items() as $item_id => $item) {

        $product = $item->get_product();

        $product_id  = null;
        $product_sku = null;
        // Check if the product exists.
        if (is_object($product)) {
            $product_id  = $product->get_id();
            $product_sku = $product->get_sku();
        }

        $order_data['line_items'][] = array(
            'id'                    => $item_id,
            'subtotal'              => wc_format_decimal($order->get_line_subtotal($item, false, false), $dp),
            'subtotal_tax'          => wc_format_decimal($item['line_subtotal_tax'], $dp),
            'total'                 => wc_format_decimal($order->get_line_total($item, false, false), $dp),
            'total_tax'             => wc_format_decimal($item['line_tax'], $dp),
            'price'                 => wc_format_decimal($order->get_item_total($item, false, false), $dp),
            'quantity'              => wc_stock_amount($item['qty']),
            'tax_class'             => (!empty($item['tax_class'])) ? $item['tax_class'] : null,
            'name'                  => $item['name'],
            'product_id'            => (!empty($item->get_variation_id()) && ('product_variation' === $product->post_type)) ? $product->get_parent_id() : $product_id,
            'variation_id'          => (!empty($item->get_variation_id()) && ('product_variation' === $product->post_type)) ? $product_id : 0,
            'product_url'           => get_permalink($product_id),
            'product_thumbnail_url' => wp_get_attachment_image_src(get_post_thumbnail_id($product_id), 'thumbnail', TRUE)[0],
            'sku'                   => $product_sku,
            'meta'                  => wc_display_item_meta($item, array('echo ' => false)),
        );
    }

    //getting shipping
    foreach ($order->get_shipping_methods() as $shipping_item_id => $shipping_item) {
        $order_data['shipping_lines'][] = array(
            'id'           => $shipping_item_id,
            'method_id'    => $shipping_item['method_id'],
            'method_title' => $shipping_item['name'],
            'total'        => wc_format_decimal($shipping_item['cost'], $dp),
        );
    }

    //getting taxes
    foreach ($order->get_tax_totals() as $tax_code => $tax) {
        $order_data['tax_lines'][] = array(
            'id'       => $tax->id,
            'rate_id'  => $tax->rate_id,
            'code'     => $tax_code,
            'title'    => $tax->label,
            'total'    => wc_format_decimal($tax->amount, $dp),
            'compound' => (bool) $tax->is_compound,
        );
    }

    //getting fees
    foreach ($order->get_fees() as $fee_item_id => $fee_item) {
        $order_data['fee_lines'][] = array(
            'id'        => $fee_item_id,
            'title'     => $fee_item['name'],
            'tax_class' => (!empty($fee_item['tax_class'])) ? $fee_item['tax_class'] : null,
            'total'     => wc_format_decimal($order->get_line_total($fee_item), $dp),
            'total_tax' => wc_format_decimal($order->get_line_tax($fee_item), $dp),
        );
    }

    //getting coupons
    foreach ($order->get_items('coupon') as $coupon_item_id => $coupon_item) {

        $order_data['coupon_lines'][] = array(
            'id'     => $coupon_item_id,
            'code'   => $coupon_item['name'],
            'amount' => wc_format_decimal($coupon_item['discount_amount'], $dp),
        );
    }

    return $order_data;
}

適用 WooCommerce 3.x 以後的版本,放置於主題目錄的 functions.php 中。

至於 WooCommerce 2.6.x 之前的版本留作紀錄,沒在維護了。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon