[WooCommerce] 移除或取代內建預設事件的方法

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


WooCommerce 真的是一套很強的 WordPress 電商系統外掛。學習的過程也會發現其實設計複雜度不亞於一套 WordPress 核心。

「內建預設事件」這件事可以從 woocommerce/includes/ 目錄下的 wc-XXXX-functions.php 來追。

有些是用來註冊勾點的方法,有些是包裝成方便外掛或延伸開發的外掛呼叫的方法。

截至發文當下此目錄中的事件勾點六百多個、事件過濾器接近三百。不用細數的原因則是,絕對還會更多,越多就是越彈性的證明!

如果不善於從原始碼中查詢這些勾點,還可以透過外掛 WP Hooks FinderAnother Show Hooks 這類型視覺化輔助的工具來查詢,有找到勾點的關鍵字也會比較容易切入!

包裝成改直接呼叫的方法基本上目的就是讓人去呼叫使用,但不要去覆寫或更動。本身採用 do_actionapply_filters 居多,這種的就不在「取代」或「移除」的討論範圍,最多就是透過這些勾點做改動而已。

而前者 WooCommerce 自己定義的一些方法使用 add_actionadd_filter 來註冊勾點的,就可以用來移除或取代。

方法也很簡單,使用 remove_actionremove_filter,兩個方法來處理即可。

以下舉例:

// 已付款訂單,觸發更新庫存管理機制
add_action('woocommerce_order_status_pending', 'wc_maybe_reduce_stock_levels');
add_action( 'woocommerce_payment_complete', 'wc_maybe_reduce_stock_levels' );
add_action( 'woocommerce_order_status_completed', 'wc_maybe_reduce_stock_levels' );
add_action( 'woocommerce_order_status_processing', 'wc_maybe_reduce_stock_levels' );
add_action( 'woocommerce_order_status_on-hold', 'wc_maybe_reduce_stock_levels' );
// 取消的訂單狀態觸發返還商品庫存機制
add_action( 'woocommerce_order_status_cancelled', 'wc_maybe_increase_stock_levels' );
add_action( 'woocommerce_order_status_pending', 'wc_maybe_increase_stock_levels' );

上述內建針對訂單狀態的操作,如果要移除就是把 add_action 改成 remove_action 這樣寫在自己外掛或子主題內。

反之如果你註冊了新的訂單狀態,如果也要讓他有一些連動的事件發生,就不能忘記也註冊這些勾點方法!

再來是如果藏的比較隱密,是寫在類別裡的方法,像是「透過 URL 路徑請求加入購物車」的方法,寫在 includes/class-wc-form-handler.phpWC_Form_Handler 類別裡。

要停用這個 add_to_cart_action 方法就要寫成:

// 關閉內建 add-to-cart URL 加入購物車功能
remove_action('wp_loaded', 'WC_Form_Handler::add_to_cart_action', 20);

這種機會也不是沒有,只是這算是動到 WooCommerce 核心方法的操作,但從這方法的設計(不是獨立一個方法來註冊勾點),就可以知道他的設計在規劃上沒打算要這麼公開的說歡迎移除或修改。

這邊要注意移除一個勾點的事件、過濾器,要完全的找到當初外掛是如何設計方法的,然後比照存取他的方法來移除他。有些事件埋得太深,要繞不少路來處理,這邊有一個專案可以用來協助方便移除: Object Hooks Remover

上述對於 WooCommerce 運作上操作的勾點,都偏向內建自己互動的方法。如果要針對佈景主題這邊,那就是一定要往 wc-template-hooks.php 這檔案來研究了。

實作一套支援 WooCommerce 電商的主題又或是要去改一套電商主題的範本,很多時候可以不用重新寫過,只需要去查到主題註冊了哪個 WooCommerce template 的勾點,看是去解除註冊來移除,又或是去覆寫方法來改變都好。

主題整合開發的完整與否,觀察點就在這邊!

最近寫一套特殊的購物服務,使用 WooCommerce 當商城基底來作業,真的是又重新好好的認識一遍,比起從零開發,這樣的整合算是經濟實惠而且聰明了,畢竟這套的發展行之有年,比起自己從零開發,站在巨人肩膀上肯定是少踩很多雷。

最有趣的事大概也算是發現了在 includes/wc-core-functions.php 這檔案中的「wc_transaction_query()」方法。讓如果有要避開同時寫入錯誤的情境可以使用這方法來避免,但 WooCommerce 內建都沒有地方呼叫過他,就是一個給開發者去延伸開發的一個好用工具。


Share:

作者: Chun

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

發佈留言

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


文章
Filter
Apply Filters
Mastodon