WooCommerce 訂單顯示自定義文字 以綠界超商取貨門市資訊為例

2017-07-06

使用外掛後 有時候會需要在訂單顯示額外的資訊

這邊以綠界超商取貨門市資訊為例
依序介紹在
1. 管理者後台的訂單詳細頁面
2. 使用者前台的訂單詳細頁面
3. 使用者收到的訂單 email
顯示自定義文字

如果這筆訂單是使用超商取貨
每筆訂單會多出四個資訊
_purchaserStore : 門市名稱
_purchaserAddress : 門市地址
_purchaserPhone : 門市電話
_CVSStoreID : 門市店號

或是有可能為開頭是 _shipping 的資訊
_shipping_purchaserStore : 門市名稱
_shipping_purchaserAddress : 門市地址
_shipping_purchaserPhone : 門市電話
_shipping_CVSStoreID : 門市店號

可以使用以下方式依據訂單編號取得

$_purchaserStore = (array_key_exists('_shipping_purchaserStore', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserStore', true ) : get_post_meta( $order->id, '_purchaserStore', true );

接著就是在 wp-includes/functions.php 中加入以下程式

// 後台訂單詳細頁面 顯示超商取貨門市資訊
function my_custom_field_admin_info( $order ){
    $_purchaserStore = (array_key_exists('_shipping_purchaserStore', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserStore', true ) : get_post_meta( $order->id, '_purchaserStore', true );
    if( !empty($_purchaserStore) ){  
        $ecPay_shipping = get_post_meta( $order->id, 'ecPay_shipping', true );
        $shop_type = $ecPay_shipping;
        if ($ecPay_shipping == 'UNIMART' || $ecPay_shipping == 'UNIMART_Collection') {
            $shop_type = '7-11';
        } else if ($ecPay_shipping == 'FAMI' || $ecPay_shipping == 'FAMI_Collection') {
            $shop_type = '全家';
        } else if ($ecPay_shipping == 'HILIFE' || $ecPay_shipping == 'HILIFE_Collection') {
            $shop_type = '萊爾富';
        }

        $_purchaserAddress = (array_key_exists('_shipping_purchaserAddress', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserAddress', true ) : get_post_meta( $order->id, '_purchaserAddress', true );
        $_purchaserPhone = (array_key_exists('_shipping_purchaserPhone', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserPhone', true ) : get_post_meta( $order->id, '_purchaserPhone', true );
        $_CVSStoreID = (array_key_exists('_shipping_CVSStoreID', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_CVSStoreID', true ) : get_post_meta( $order->id, '_CVSStoreID', true );

        echo '<h4>門市資訊</h4>';
        echo "<p>". $shop_type ."&nbsp;".$_purchaserStore." (".$_CVSStoreID .")</p>";
        echo "<p>門市地址: ".$_purchaserAddress ."</p>";
        if (!empty($_purchaserPhone)) {
            echo "<p>門市電話: ".$_purchaserPhone ."</p>";
        }
    }
}

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'my_custom_field_admin_info' );


// 前台 使用者 訂單詳細頁面 顯示超商取貨門市資訊
function my_custom_field_display_on_order_received( $order ){
    $_purchaserStore = (array_key_exists('_shipping_purchaserStore', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserStore', true ) : get_post_meta( $order->id, '_purchaserStore', true );
    if( !empty($_purchaserStore) ){  
        $ecPay_shipping = get_post_meta( $order->id, 'ecPay_shipping', true );
        $shop_type = $ecPay_shipping;
        if ($ecPay_shipping == 'UNIMART' || $ecPay_shipping == 'UNIMART_Collection') {
            $shop_type = '7-11';
        } else if ($ecPay_shipping == 'FAMI' || $ecPay_shipping == 'FAMI_Collection') {
            $shop_type = '全家';
        } else if ($ecPay_shipping == 'HILIFE' || $ecPay_shipping == 'HILIFE_Collection') {
            $shop_type = '萊爾富';
        }

        $_purchaserAddress = (array_key_exists('_shipping_purchaserAddress', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserAddress', true ) : get_post_meta( $order->id, '_purchaserAddress', true );
        $_purchaserPhone = (array_key_exists('_shipping_purchaserPhone', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserPhone', true ) : get_post_meta( $order->id, '_purchaserPhone', true );
        $_CVSStoreID = (array_key_exists('_shipping_CVSStoreID', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_CVSStoreID', true ) : get_post_meta( $order->id, '_CVSStoreID', true );

        echo '<h2>超商取貨門市資訊</h2>';
        echo "<p>". $shop_type ."&nbsp;".$_purchaserStore." (".$_CVSStoreID .")</p>";
        echo "<p>門市地址: ".$_purchaserAddress ."</p>";
        if (!empty($_purchaserPhone)) {
            echo "<p>門市電話: ".$_purchaserPhone ."</p>";
        }
    }
}

add_action('woocommerce_order_details_after_order_table', 'my_custom_field_display_on_order_received' );


// 訂單 email 顯示超商取貨門市資訊
function my_custom_field_order_email( $order, $sent_to_admin ){
    $_purchaserStore = (array_key_exists('_shipping_purchaserStore', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserStore', true ) : get_post_meta( $order->id, '_purchaserStore', true );
    if( !empty($_purchaserStore) ){  
        $ecPay_shipping = get_post_meta( $order->id, 'ecPay_shipping', true );
        $shop_type = $ecPay_shipping;
        if ($ecPay_shipping == 'UNIMART' || $ecPay_shipping == 'UNIMART_Collection') {
            $shop_type = '7-11';
        } else if ($ecPay_shipping == 'FAMI' || $ecPay_shipping == 'FAMI_Collection') {
            $shop_type = '全家';
        } else if ($ecPay_shipping == 'HILIFE' || $ecPay_shipping == 'HILIFE_Collection') {
            $shop_type = '萊爾富';
        }

        $_purchaserAddress = (array_key_exists('_shipping_purchaserAddress', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserAddress', true ) : get_post_meta( $order->id, '_purchaserAddress', true );
        $_purchaserPhone = (array_key_exists('_shipping_purchaserPhone', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_purchaserPhone', true ) : get_post_meta( $order->id, '_purchaserPhone', true );
        $_CVSStoreID = (array_key_exists('_shipping_CVSStoreID', get_post_meta($order->id))) ? get_post_meta( $order->id, '_shipping_CVSStoreID', true ) : get_post_meta( $order->id, '_CVSStoreID', true );

        echo '<h2>超商取貨門市資訊</h2>';
        echo "<p>". $shop_type ."&nbsp;".$_purchaserStore." (".$_CVSStoreID .")</p>";
        echo "<p>門市地址: ".$_purchaserAddress ."</p>";
        if (!empty($_purchaserPhone)) {
            echo "<p>門市電話: ".$_purchaserPhone ."</p>";
        }
    }
}

add_action( 'woocommerce_email_after_order_table', 'my_custom_field_order_email', 10, 2 );

以上三個函式都是使用 hook 的方式在預設的內容中插入自定義文字
所以可以依據自身情況修改其內的程式

以下為設置後會顯示的地方及樣式

管理者後台的訂單詳細頁面

使用者前台的訂單詳細頁面

使用者收到的訂單 email

ref:

WooCommerce添加自定义结账字段图文详解

Comments

  • 大哥!有件很重要的事情需要拜託你!
    此篇教學這段程式碼「$_purchaserStore = get_post_meta( $order->id, ‘_purchaserStore’, true );」我不知道該放在那個頁面的那一行裡。

    可以請前輩告知嗎?因為我現在購物車網站在下單後,顧客無法明確的知道超商資訊,我只能在後台看到相關便利商店資訊。

  • hsin 說:

    不知道是我文章哪裡講的比較不清楚,可以講一下哪裡不懂嗎?我好修改文章來讓內容更容易懂。

    要加入自定義文字,都是加在 wp-includes/functions.php 這隻裡面(或是 plugin 自己的 functions.php 也可以)。
    程式中依序列出的三個 function ,顯示的結果就是下方依序的三張圖紅框顯示的文字。

    每個 function 後接續都有一個 add_action( hook 插入位置 , function 名稱 ) 來表示要在哪裡插入文字。
    像是第一個例子 add_action( ‘woocommerce_admin_order_data_after_shipping_address’, ‘my_custom_field_admin_info’ );
    woocommerce_admin_order_data_after_shipping_address 就是 WooCommerce 內建的要插入的位置 : 後台訂單詳細頁面
    my_custom_field_admin_info 就是自定義的 function 名稱

    如果上面都看不懂的話,可能還需要先補充 PHP 或是 WordPress Plugin 的基礎知識,這些可能就要再自己去補充了。

  • 大哥…我靜靜的在電腦前沉思了好久…反覆的想跟上網腦補相關資訊,因為我真的是沒有什麼基礎知識…但我好想要現在搞懂該如何操作…大哥…真的很不好意思勞駕您了!
    請問您指的「HOOK插入位置」與「 function 名稱」是我自行設定嗎?還是依據網站主題內的那個檔案做修改或插入?

  • hsin 說:

    找到 wp-includes/functions.php 這隻檔案了嗎

  • 這個檔在您這篇文的時候我就找到了,我也依照您上述的程式碼全複製貼進此檔案內,但是網站操作結果仍然是一樣的結果,無法像您呈現的方式。

  • hsin 說:

    那這樣我不太清楚問題出在哪,可能幫不上忙。

  • 大哥!最後一個問題!請原諒我…您提供的程式碼中是否有地方需要做修改?

  • hsin 說:

    基本上複製貼上就可以了,所以應該是有其它的問題才會沒辦法顯示。

  • 謝謝大哥…讓我免去傷腦根之苦…萬分感謝!

  • hsin 說:

    可能是綠界更新了程式,我已經將文章內的程式更新了,你可以再試試看。

  • chen 說:

    請問 前輩的顧客資訊是怎麼加上去的?

  • hsin 說:

    我印象中沒有改過那邊,應該是預設就會顯示的。

  • 發表迴響

    彙整

    分類