从 WordPress 菜单中隐藏 WooCommerce 空产品类别
Hide WooCommerce empty product categories from WordPress menu
根据我上一个问题的 答案代码,我能够在我的 WordPress 导航菜单中自动将子类别显示为某些产品类别的菜单子项。
我的问题是:是否可以隐藏空的子类别(子菜单项)?
如果可能的话,也许隐藏仅包含一种已售罄产品的类别。
可以使用get_terms(),这里可以指定更多选项,所以
get_term_children( $post->object_id, $taxonomy );
会变成
get_terms(array(
'taxonomy' => $taxonomy,
'parent' => $post->object_id,
'hide_empty' => true,
));
这还有一个 'order_by' 参数,默认为术语的名称
您还可以使用带有以下参数的 get_terms()
:
'include'
以包含来自 get_term_children()
的所有子术语,作为逗号分隔的术语 ID 字符串。
'orderby'
具有 'name'
属性以按名称对术语进行排序,
'order'
具有 'ASC' 属性以对术语进行升序排序,
'hide_empty'
with true
属性不包含空术语。
所以排序将直接进行而不需要 foreach 循环,你也将直接得到一个 WP_Term 对象的数组。
重访代码:
add_filter( 'wp_get_nav_menu_items', 'custom_submenu_product_categories', 10, 3 );
function custom_submenu_product_categories( $items, $menu, $args ) {
// don't add child categories in administration of menus
if (is_admin()) {
return $items;
}
$taxonomy = 'product_cat';
foreach ($items as $index => $post) {
if ( $taxonomy !== $post->object ) {
continue;
}
$children_terms_ids = get_term_children( $post->object_id, $taxonomy );
if( ! empty($children_terms_ids) ) {
$sorted_terms = get_terms(array(
'taxonomy' => $taxonomy,
'include' => implode(',', $children_terms_ids),
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => true,
));
// Loop through sorted child terms to set them as sorted sub menu items
foreach ( $sorted_terms as $index2 => $child_term ) {
$item = new \stdClass();
$item->title = $child_term->name;
$item->url = get_term_link( $child_term, $taxonomy );
$item->menu_order = 500 * ($index + 1) + $index2;
$item->post_type = 'nav_menu_item';
$item->post_status = 'published';
$item->post_parent = $post->ID;
$item->menu_item_parent = $post->ID;
$item->type = 'custom';
$item->object = 'custom';
$item->description = '';
$item->object_id = 0;
$item->db_id = 0;
$item->ID = 0;
$item->position = 0;
$item->classes = array();
$item->target = ''; // <= Missing - Mandatory to avoid an error
$item->xfn = ''; // <= Missing - Mandatory to avoid an error
$items[] = $item;
}
}
}
return $items;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
Now is not really possible to hide subcategories that contains only one product that are Sold Out, sorry.
根据我上一个问题的
我的问题是:是否可以隐藏空的子类别(子菜单项)?
如果可能的话,也许隐藏仅包含一种已售罄产品的类别。
可以使用get_terms(),这里可以指定更多选项,所以
get_term_children( $post->object_id, $taxonomy );
会变成
get_terms(array(
'taxonomy' => $taxonomy,
'parent' => $post->object_id,
'hide_empty' => true,
));
这还有一个 'order_by' 参数,默认为术语的名称
您还可以使用带有以下参数的 get_terms()
:
'include'
以包含来自get_term_children()
的所有子术语,作为逗号分隔的术语 ID 字符串。'orderby'
具有'name'
属性以按名称对术语进行排序,'order'
具有 'ASC' 属性以对术语进行升序排序,'hide_empty'
withtrue
属性不包含空术语。
所以排序将直接进行而不需要 foreach 循环,你也将直接得到一个 WP_Term 对象的数组。
重访代码:
add_filter( 'wp_get_nav_menu_items', 'custom_submenu_product_categories', 10, 3 );
function custom_submenu_product_categories( $items, $menu, $args ) {
// don't add child categories in administration of menus
if (is_admin()) {
return $items;
}
$taxonomy = 'product_cat';
foreach ($items as $index => $post) {
if ( $taxonomy !== $post->object ) {
continue;
}
$children_terms_ids = get_term_children( $post->object_id, $taxonomy );
if( ! empty($children_terms_ids) ) {
$sorted_terms = get_terms(array(
'taxonomy' => $taxonomy,
'include' => implode(',', $children_terms_ids),
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => true,
));
// Loop through sorted child terms to set them as sorted sub menu items
foreach ( $sorted_terms as $index2 => $child_term ) {
$item = new \stdClass();
$item->title = $child_term->name;
$item->url = get_term_link( $child_term, $taxonomy );
$item->menu_order = 500 * ($index + 1) + $index2;
$item->post_type = 'nav_menu_item';
$item->post_status = 'published';
$item->post_parent = $post->ID;
$item->menu_item_parent = $post->ID;
$item->type = 'custom';
$item->object = 'custom';
$item->description = '';
$item->object_id = 0;
$item->db_id = 0;
$item->ID = 0;
$item->position = 0;
$item->classes = array();
$item->target = ''; // <= Missing - Mandatory to avoid an error
$item->xfn = ''; // <= Missing - Mandatory to avoid an error
$items[] = $item;
}
}
}
return $items;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
Now is not really possible to hide subcategories that contains only one product that are Sold Out, sorry.