iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 26
1
自我挑戰組

Wordpress 外掛開發系列 第 26

「Wordpress 外掛開發」從get_tems到wp_query大破解,媽的你搞誰啊

原本預計是想探討個大家的loader或者是開始下一個mutiple roles,但是昨天wp_query讓我弄的不是很爽,所以做個專門的講解

get_category

原本的使用是在一開始對上taxonomy,但是新版(4.5版之後)的使用是在第一個參數直接帶進一個object來做,但是官方網站之中,他很糟糕的就只有details get_terms,昨天當下看到真的超怒,我們來看看他主要能被使用什麼參數吧,從官網一個頁面需要連轉兩層真是不好的感受。

在裡頭的參數物件,是WP_Term_Query組成,而裡頭的參數,而自使用之前,我們得先了解woocommerce的目錄是被儲存在taxonomy之中,所以需要去調動,就是使用taxonomy去對product_cat,然後再來做比對。

  • taxonomy
    txonomy 的名稱,這個欄位通常也可以放很以陣列的方式儲存多個也是主要在wp_terms表中看到的名稱。
  • object_ids
    這物件的id是4.7版後新增的,可以使用post_id來去存取當個post的id,像是可以使用get_the_ID來做連結。
  • orderby
    排序的欄位,使用截圖來寫他所支援的使用
    https://ithelp.ithome.com.tw/upload/images/20201010/20104531ruYe00RFPv.jpg
  • order
    選擇為遞減DESC或是遞增ASC
  • hide_empty
    是否顯示空目錄
  • include
    可以包含你要拉取的term_id,昨天遇到瓶頸應該需要使用include來做join的,再以orderby來做sort以達到不用多一個寫法,而他可以只單一輸入一個string,或是輸入陣列來支援多個,而string可以使用逗號或空白來做多個的處理,像是"23 64 54"
  • exclude
    這就是把不要的term_id放進去,拉永遠也不會拉回你放的,如果我們的include有值,exclude則不會執行。
  • exclude_tree
    與exclude功能相仿,特別的一點是他會把該term的child都抹除,如果我們的include有值,exclude則不會執行。
  • number
    可以回傳多少terms回來,這邊是可以接著自己設定的option設定,來決定一個頁面會出現多少個terms
  • offset
    如果有限制number,可以當作offset就像是query的頁數
  • fields
    設定回傳的項目,如果沒有設定則為全部回傳,下面截圖是可以被接受的參數們。
    https://ithelp.ithome.com.tw/upload/images/20201010/20104531GFqYV25ig9.jpg
  • count
    回傳term count,如果設定成trule,則他的優先權會大於fields
  • name
    可以指定條件名稱為該變數的篩選器。
  • slug
    可以指定條件slug為該變數的篩選器。
  • term_taxonomy_id
    可以指定條件term_taxonomy_id為該變數的篩選器。
  • hierarchical
    可以決定是否取回非空相的子項目,不過昨日試了取母項目並且要要回子項目,但是沒作用,得再研究。
  • search
    SQL語法的支援。
  • name__like
    name like就是sql like的用法。
  • description__like
    description的sql like用法來做篩選條件。
  • pad_counts
    回傳child的count,與count的使用很相似
  • get
    這就像是SQL 的select依樣,可以挑取回的項目。
  • child_of
    這個是取child的terms_id。
  • parent
    設定parent來取得底下的所有child,但是不知道兩層是否可以
  • childless
    來限制是否有child的回傳。

wp_tax_query

而他不只是單純只有這個,因為extends的關係,他也支援transform_query,而在裡頭可以對taxonomy的陣列做關聯,如果你在第一層回傳的有超過一個的話,而下面的圖面是她所提供的欄位來做條件,也可以看下方的程式碼是如何設定從post中,再將所屬目錄66的文章抓回。

https://ithelp.ithome.com.tw/upload/images/20201010/20104531BcHfkG0RiJ.jpg

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => '66',
        ),
    ),
);
$query = new WP_Query( $args );

處理昨日問題 - 媽媽去哪了?

昨天母親需要靠著get_term回傳的原始物件,再來說unshift,老實說這並不是很靠譜,也不是很好看有違典雅寫法的規則,所以今日試著將整個query重新製作來處理。

不過時間所限沒有製作出一個好的結果,不過寫了一個util來當處理這個問題,我試過了include,parent與childof但仍然無法將他的媽媽與女兒串再一起,我只能使用非常粗暴的拉取法了XD這個方式有個問題是,抓取的方式不確切,但是現在不是想要對funtion做深度確認是否為子目錄,因為我猜測應該還是有辦法在一個option之中抓回所有的子目錄。

    $term 			= get_queried_object();
    $parent_id 		= empty( $term->term_id ) ? 0 : $term->term_id;
    
    $option =  array(
        'taxonomy' => 'product_cat',
        'hide_empty' => false,
        'orderby' => 'term_id'
    );

    $cats = get_categories($option);

    $relationship_list = array($parent_id);
    foreach($cats as $index => $cat){
        if(true === in_array($cat->parent,$relationship_list,true) && false === in_array($cat->term_id,$relationship_list,true)) {
            array_push($relationship_list,$cat->term_id);
        }
    }

    foreach($cats as $index => $cat){
        if(false === in_array($cat->term_id,$relationship_list,true)){
            unset($cats[$index]);
        }
    }

    var_dump($cats);

WP_Term_Query
get_terms
get_categories() only returns categories in use
WP_Tax_Query
List all subcategories from category
WP_QUERY


上一篇
「Wordpress 外掛開發」商品巢狀表完結篇
下一篇
「Wordpress 外掛開發」製作多重role的外掛,讓你的商業邏輯的可能性具現化
系列文
Wordpress 外掛開發30

尚未有邦友留言

立即登入留言