WooCommerce-自动从导航栏中隐藏空类别和子类别

时间:2020-10-02 14:45:32

标签: php wordpress woocommerce menu navbar

我有以下代码块,可让所有空类别或子类别的存档页面从导航栏中隐藏起来,但它有两个明显的问题,需要我帮忙解决。

  1. 该代码隐藏了前端和后端的空白存档页面,这使得后端的编辑菜单变得困难,因为需要手动删除代码,然后在更改菜单后重新添加代码。
  2. 类别和子类别不会自动添加到网站的菜单部分。我无法激活“自动向此菜单添加新的顶层页面”部分,因为这是全局性的,并不仅仅适用于产品类别/子类别。

我当前使用的代码如下:

/* HIDE EMPTY CATEGORIES AND SUBCATEGORIES FROM NAVBAR - TO CORRECTLY EDIT THE MENU AT THE BACK-END, MAKE SURE YOU REMOVE THIS CODE */

function hide_empty_navbar_items ( $items, $menu, $args ) {
        global $wpdb;
        $empty = $wpdb->get_col( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE count = 0" );
        foreach ( $items as $key => $item ) {
                if ( ( 'taxonomy' == $item->type ) && ( in_array( $item->object_id, $empty ) ) ) {
                        unset( $items[$key] );
                }
        }
        return $items;
}
add_filter( 'wp_get_nav_menu_items', 'hide_empty_navbar_items', 10, 3 );

2 个答案:

答案 0 :(得分:1)

我设法找到了以下代码,该代码使您可以隐藏网站前端导航栏中的空类别和子类别级别,同时还允许以管理员身份登录的任何人仍可以在界面上看到完整的菜单结构后端。

此代码从本质上解决了最初问题中剩下的代码问题,并提供了更为实用的解决方案。

view

答案 1 :(得分:0)

我做了这个,也是为了照顾物品库存。如果类别仅包含缺货商品,则不会显示菜单:

/**
Hide empty categories from menu
**/
if(!is_admin()) {
    add_filter( 'wp_get_nav_menu_items', 'nav_remove_empty_category_menu_item', 10, 3 );
}
function nav_remove_empty_category_menu_item ( $items, $menu, $args ) {
    global $wpdb;
    $nopost = $wpdb->get_col( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE count = 0" );
    foreach ( $items as $key => $item ) {
        if ( ( 'taxonomy' == $item->type )   ) {
            $object = get_term($item->object_id, $item->object);
            $args = array(
                'posts_per_page' => -1,
                'product_cat' => $object->slug,
                'post_type' => 'product',
                'orderby' => 'title',
                'meta_query' => array(
                    array(
                        'key' => '_stock_status',
                        'value' => 'instock'
                    )
                )
            );
            $the_query = new WP_Query( $args );
            
            if($the_query->post_count <= 0){
                unset( $items[$key] );
            }
        }
    }
    return $items;
}