从 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.