[WooCommerce] 擴充 Shortcode 短碼參數的兩種方法

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


WordPress 有一個很強的功能模組就是「Shortcode API」,知名 Page Builder 頁面編輯器 WPBakery 也是以此打出名號。

不過有時候有些 Shortcode 短碼就差一點點滿足目標需求時怎辦?

我通常會有兩個解法:

  1. 找找看有沒有 Hook 勾點來強化
  2. 繼承那個短碼寫法,然後客製化其中的邏輯

解法順序也是這樣排,有勾點先勾點處理,沒有也沒關係,還可以繼承它來處理。

這邊舉例 [products] 這個短碼,用來讓你在網站上任意地方呈現商品的方法。參數其實很多元,可以參考官方文件介紹。

但就是總有不滿足的時候,比方說如果自己有客製化一個商品分類的屬性,想要撈取這樣屬性對應的商品時就會需要客製化。

下面筆記這兩種我的作法。

WooCommerce 商品短碼的勾點:woocommerce_shortcode_products_query

function mxp_extend_products_shortcode_to_custom_attrs( $query_args, $atts, $loop_name ){
    if ( ! empty($atts['CUSTOM_ATTS']) ) {
        global $wpdb;
        // 不要忘記過濾帶入參數,避免使用者自己 XSS 自己
        $terms = array_map( 'intval', explode( ',', $atts['CUSTOM_ATTS'] ) );
        $ids = $wpdb->get_col( "客製化資料庫方法" );
        // 判斷取得的商品ID
        if ( ! empty( $ids ) ) {
            if ( 1 === count( $ids ) ) {
                $query_args['p'] = $ids[0];
            } else {
                // 複數商品 ID 使用這方法
                $query_args['post__in'] = $ids;
            }
        }
    }
    return $query_args;
}
add_filter( 'woocommerce_shortcode_products_query', 'mxp_extend_products_shortcode_to_custom_attrs', 10, 3 );

中間邏輯就是自由發揮的地方了,內建短碼有這個切入點可以運用。捕捉客製化帶入的參數屬性,又或是強化補充原本的邏輯。

繼承內建 Shortcode 短碼的實作

短碼本身是一種單獨功能呈現的用途方法,所以大多不會在短碼內實作核心邏輯。而僅是在短碼內的邏輯呼叫核心定義好的方法來處理。

建立短碼的方法是 add_shortcode,透過這方法註冊一個短碼來全站使用。

所以本次目標很簡單:先是找到 WooCommerce 定義 [products] 短碼的地方,找到他的那段程式邏輯(includes/class-wc-shortcodes.php),複製一份出來,自己重新定義過。

也就原本是 add_shortcode('products','callback_func'); 這樣定義短碼,先是順著找到 callback_func 方法後,擷取方法內的邏輯,自己寫過一個新方法 mxp_callback_func_extend 然後使用 add_shortcode('mxp_products','mxp_callback_func_extend'); 這方式註冊過一個新的短碼 mxp_products,這樣就算是無縫繼承出來原本的短碼方法囉!

這種 hack 的手法要注意的是如果外掛本身有變動到這塊核心,但自己客製化的地方沒有跟上,有機會造成網站發生錯誤。


Share:

作者: Chun

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

發佈留言

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


文章
Filter
Apply Filters
Mastodon