更新日期:2022-06-25
在後台佈景的選單設定中,我們通常會把某一單元的分類通通拉出來,放在該單元選單下當成子選單,不過有時候分類裡面尚未有相關文章,所以當網友點進去的時候,內容空空的也很奇怪,這時候就想先把該分類自動藏起來。
在找相關作法時,找到的都是已經生成 html 的 hook,例如 wp_nav_menu_items,這不是我們想要處理的部份,應該找更上一層的 object 來處理,洋蔥一層一層剝一定會找到核心,所以終於看到程式碼裡面有一個 wp_nav_menu_objects 可以 hook。
程式範例
function sig_hide_no_post_submenu($sorted_menu_items,$args){
if( $args->theme_location === 'menu-1'){
foreach($sorted_menu_items as $index => $item){
if( $item->menu_item_parent > 0 and $item->type === 'taxonomy' and $item->object === 'product_cat' ){
$object = get_term($item->object_id, $item->object);
if( $object->count <= 0 ) unset($sorted_menu_items[$index]);
}
}
}
return $sorted_menu_items;
}
add_filter( 'wp_nav_menu_objects', 'sig_hide_no_post_submenu', 10, 2 );
參數說明
$args->theme_location === 'menu-1'
這裡要放你想處理的選單的 id,如果不要判別而想處理網頁裡面所有選單,就可以不用加上去。( id 通常在 register_nav_menus 裡面會找的到)。
$item->menu_item_parent > 0
檢查 parent id,不為 0 表示他是子選單。
$item->type === 'taxonomy'
檢查 post type,限定為「分類」才處理。
$item->object === 'product_cat'
這裡是我只想對「商品」的分類處理,所加上去的判別而已,如果不限定處理某一單元時,就可以不用加上去。