WooCommerce 訂單大改版


年過得如何啊?想不到一轉眼就已經開工五天了,過年前本想說要來好好整理自己的部落格結果卻一頭栽進 Blender 這套 3D 繪圖軟體的世界,每天大概都花八個小時在玩,東西超多超有趣,雖然還不知道自己學 3D 要幹嘛,就當作是放假時的休閒娛樂吧(?)

前陣子喵到 WooCommerce Developer Blog 發佈了一篇新文章,標題是 The plan for the WooCommerce custom order table,簡單說就是開發團隊決定把 WooCommerce 訂單的資料表拆分出來,進而改善資料庫的使用效率,因為這個改變會影響市面上八成 WooCommerce 相關的外掛,因此想說還是先整理一下未來可能會遇到的問題以及該如何預防的方法。

資料庫小科普

如果你對資料庫不熟的話可以把它想成是 Excel 的試算表,目前 WordPress 所採用的 MySQL 為關聯式資料庫,它就像是一個表格,有標頭、列與欄,每一筆存入的資料都會用表格的方式來記錄,下圖是 WordPress 文章的紀錄方式:

是不是就很像試算表裡面的表格?至於資料表就是資料庫裡面不同的表格,你可以把它視為 Excel 裡面的工作表 ( sheet ),WordPress 的文章資料主要寫在 wp_posts 這個資料表,眼尖的你可能會發現這張表紀錄的不只是「文章」,還紀錄了頁面、附件甚至是商品的資料,是不是覺得很奇怪?依照我們平常使用試算表的邏輯,不同類型的資料應該是拆分成不同工作表來整理會比較清楚,全部混在一起不就會很難找嗎?

我們試著新增一筆 WooCommerce 訂單看看:

沒錯,它也是紀錄在 wp_posts 裡面XD,WordPress 之所以會這樣紀錄是因為最早的時候它只是個寫部落格的工具,與內容相關的資料全都會放在這個資料表,在當年看起來是合情合理,但經過這麼多年的爆炸式成長,許多跟寫部落格完全沒關係的外掛被大量開發出來,但存放資料的地方卻一樣都是 wp_posts。

另一個比 wp_posts 更棘手的問題是 wp_postmeta:

這是一個會倍數式暴增的資料表,原因是 wp_posts 的欄位是固定的,當我們需要自行增加欄位時就會寫在 wp_postmeta 這個資料表,像是商品的價格、訂單的付款方式等等,另外如果你有用過自定義欄位的外掛 Admin Custom Fields 或是其他類似的工具,它們也會全部寫在這個資料表之中,可想而知它絕對是數一數二的肥。

WooCommerce 團隊長期以來一直想解決這個問題,試想要進入一個擁有上萬筆資料的表格找資料絕對不是一件容易的事,就算交給電腦找資料越多所需花費的時間就越長,因此拆分資料表勢在必行,事實上 WooCommerce 已經建立了許多新的資料表來存放相關的資料,而這次主要是針對訂單的部分來處理。

根據文中所述目前還在草案階段,該階段定義出全新的四張資料表,分別是:

  • wp_wc_orders - 紀錄訂單的基本資料,包含訂單編號、金額、付款方式等欄位
  • wp_wc_order_addresses - 紀錄訂單中與結帳相關的資訊,像是訂購人、運送地址、聯絡電話等欄位
  • wp_wc_order_operational_data - 紀錄訂單的附屬資訊,像是税、折價券等欄位
  • wp_wc_orders_meta - 紀錄訂單的自訂欄位,等同於 wp_postmeta

這些資料表的規劃都還是初稿,官方預定在 2022 年的第三季定案並且實作。

對商店經營者的影響

如果你有在使用 WooCommerce 經營購物網站,務必要確保你在使用的金物流、電子發票、客製訂單欄位的外掛有跟上這次的更新,雖然官方應該會確保舊版的相容性,但資料表變更影響的幅度很大,如果要相容舊版勢必要保留原本在 wp_posts 裡面的訂單,然後把新的訂單異動寫到新的資料表中,到時候會不會產生訂單資料錯亂或是衝突都還是未知數。

建議是到了今年秋天時多留意 WooCommerce 的更新內容,不要一看到有更新就立刻點下去,先觀望一下觀察社群的反應,如果確定要更新絕對不能忘記備份資料庫,不然造成業務損失就很悶了…

對開發者的影響

雖然是今年第三季才會定案,但身為開發者可以從現在開始就改變操作訂單的習慣,以往要處理訂單相關的操作我都會很習慣使用 WordPress 的 API,也就是 update_post_meta()get_post_meta(),但這些是針對寫入 wp_postmeta 用的,拆分後這些方法就 GG 了。

因此早在 2017 年 WooCommerce 就已經設計一支專門操作資料 CRUD 的抽象類別 WC_Data,目前可以操作的對象有訂單、訂單商品明細、商品、折價券以及顧客,以寫入訂單資料為例,當寫入訂單的付款方式時原本可以用 update_post_meta( $order_id, '_payment_method', 'oberon-pay' );,用 WC_Data 來處理的話會變成這樣:

$order = wc_get_order( $order_id ) $order->set_payment_method( ‘oberon-pay’ ); $order->save();

echo $order->get_payment_method(); // oberon-pay

wc_get_order()會回傳 WC_Order 物件,而 WC_Order 則是繼承 WC_Data 而來,所以上述的範例中 $order 就可以使用 WC_Data 的屬性跟方法,WC_Data 有三個特色:

1.利用 $data 屬性存放所有需要操作的欄位
2.利用 setter 與 getter 寫入與取得資料
3.利用 save() 方法儲存資料庫

有了這個類別我們就可以用 set_xxx 來把我們的所需要的值寫入 $data 這個屬性中,像是 set_payment_methodset_billing_first_name 等等,最後面的 save() 記得不要漏掉,因為 setter 只是把資料寫入 $data 而已,要執行 save 才會把 $data 更新進資料庫。

然後要取得值的話就是用 get_xxx:get_payment_methodget_billing_first_name,不知道你覺得這樣用起來有沒有比較直覺?我自己是還不太習慣,而且不知為何在某些 Hook 下會拿不到資料,結果最後還是用 get_post_meta() 來處理,但不管如何還是必須要改變了,更多關於 WC_Data 的資料可以參考:

希望今天的內容不會太硬,如果你發現內容有誤的地方還請多指點了,這陣子在研究一套很適合 WordPress 使用的圖床服務,有心得後下禮拜再來分享,我們下週五見!

WordPress 開發日常

Read more from WordPress 開發日常

自從 LINE Notify 終止服務後所有站長都在找尋替代方案,如果還是想在 LINE 裡面收到管理員的訂單通知,只能採用與一般顧客相同的方式,也就是申請官方帳號接收通知,雖然一樣有免費額度可以使用,但對於量大的站長來說又是一筆新的支出成本。 如果不想要新增這筆開銷,勢必要尋找其他即時通訊軟體來接收通知,像是採用 Discord 或是 Telegram,如果站長本身就沒有在使用這些軟體需要額外安裝,安裝後還需要申請開發者帳號取得金鑰,而網站這邊也要另外使用外掛或是請工程師進行串接。 難道沒有更方便、更優雅的方式來解決這個問題嗎?不僅可以在桌機上收到通知,同時還能推播到手機甚至是穿戴型裝置上,最重要的是每一則推播不會被收費、也不用擔心原本免費的方案終止服務或是漲價,而這解決方案我們在各大新聞網站都曾見過它,那就是網頁推播通知技術 ( Web Push Notification )。 外掛介紹 DWP 網站助理整合網頁推播通知,可以讓訂閱者在訂單狀態改變時收到推播訊息,支援所有平台,包含 Windows、MacOS、Android 以及 iOS...

這禮拜有幸約到網路創業家蕭上農 Fox 大大進行一對一的創業諮詢面談,從我小時候就是看著他的創業故事長大的,一直有持續在關注他分享的內容,現在自己也走在創業的這條路上,想說何不約一下已經走過這一遭的 Fox,想知道他是怎麼看 WooCommerce 外掛創業的機會。 我們談到三個大主題:OrderNotify 現況分析、創業主題的選擇、AI 浪潮下產品開發的思維。 OrderNotify 現況分析 根據我提供的銷售狀況來看,Fox 覺得這個產品在這些年的業績已經足以代表市場不夠大,目前針對的使用者族群太細了,要有使用 WooCommerce 架站又要有認真經營 LINE 官方帳號的商家數量群體本身就不夠大。 以漏斗的角度來看,這已經是最最下面的底層,業績無法有突破純粹是市場太小,如果是鎖定更大的市場,像是支援 Whatsapp 或是開發 Shopify 的 App 才有足夠大的量能讓個人開發者過活,或是要把眼光放在海外而非僅限於台灣,朝著漏斗的上方移動才行。 我用 Built with 查了一下台灣 WooCommerce 的網站數量是 10,610,以我目前的顧客數量 120...

創業是一場實驗,可以依照自己的想法去實踐的過程非常有趣,雖然免不了許多挫折失敗的時刻,但只要一想到令人興奮的點子又是希望破表。我從這篇文章開始紀錄創業的過程,希望一年後回過頭來看可以回憶起一年前的自己都在想些什麼五四三XD 上一次完全沒有案件收入的狀況要回朔到十幾年前,當時不知道該怎麼找案子,手邊的生活急用金只有兩個月,在時間壓力下只能重回職場先求溫飽。這一次從接案者的身份「離職」,為此我做足了準備,希望在資金燒完前可以找到合適自己的商業模式, 三月份我將心力放在產品的更新與行銷上,做了很多以前沒做過的事,處處充滿了新鮮感,但也因為都沒做過,不曉得哪些有效哪些沒效,所以打算以後在每個月的最後一週寫一篇創業日記,紀錄做對跟做錯了哪些事,算是幫自己回顧這一路上的過程。 第一個月設定的主要目標:行銷,在與 ChatGPT 諮詢過後,它給我的建議是公司產品是有市場的,但因為曝光量不足,所以營收無法提升,要增加曝光度為首要目標。剛好這個月 LINE Notify 停用,就決定以這個切入點來強化產品功能並撰寫行銷內容。 三月份的總工作時數為 41.12 小時,加上客服時間總計約 48...