更新日期: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'

這裡是我只想對「商品」的分類處理,所加上去的判別而已,如果不限定處理某一單元時,就可以不用加上去。