【问题标题】:Sort WooCommerce product category sub menu items by name ASC in Wordpress menu在 Wordpress 菜单中按名称 ASC 对 WooCommerce 产品类别子菜单项进行排序
【发布时间】:2021-01-12 01:59:22
【问题描述】:

我正在将我的主 WordPress 菜单添加到 WooCommerce 产品类别菜单项中,子类别术语作为具有以下代码的子菜单项,它可以工作。

代码:

add_filter("wp_get_nav_menu_items", function ($items, $menu, $args) {

    // don't add child categories in administration of menus
    if (is_admin()) {
        return $items;
    }
    foreach ($items as $index => $i) {

        if ("product_cat" !== $i->object) {
            continue;
        }
        $term_children = get_term_children($i->object_id, "product_cat");
        // add child categories
        foreach ($term_children as $index2 => $child_id) {
            $child = get_term($child_id);
            $url = get_term_link($child);
            $e = new \stdClass();
            $e->title = $child->name;
            $e->url = $url;
            $e->menu_order = 500 * ($index + 1) + $index2;
            $e->post_type = "nav_menu_item";
            $e->post_status = "published";
            $e->post_parent = $i->ID;
            $e->menu_item_parent = $i->ID;
            $e->type = "custom";
            $e->object = "custom";
            $e->description = "";
            $e->object_id = 0;
            $e->db_id = 0;
            $e->ID = 0;
            $e->position = 0;
            $e->classes = array();
            $items[] = $e;
        }
    }

    return $items;

}, 10, 3); 

但我想按字母顺序按升序对子菜单项进行排序,但我还没有找到方法。如何按名称(按字母顺序)按升序对子菜单项进行排序?

【问题讨论】:

    标签: php wordpress woocommerce submenu taxonomy-terms


    【解决方案1】:

    需要一个额外的 foreach 循环,以按名称对类别子菜单项进行排序。您的代码中也有一些小疏忽(以避免一些错误)。最后,出于许多不同的原因,您应该始终命名您的挂钩函数。

    重温的代码:

    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 );
            $unsorted_terms     = array(); // Initializing
    
            // Loop through children terms to prepare them to be sorted by name
            foreach ( $children_terms_ids as $child_id ) {
                $child_term = get_term( $child_id, $taxonomy );
    
                $unsorted_terms[$child_term->name] = $child_term; // Set each term in an array for sorting
            }
    
            ksort($unsorted_terms); // Sort menu sub-items by term name ASC
    
            $index2 = 0; // Initializing
    
            // Loop through sorted child terms to set them as sorted sub menu items
            foreach ( $unsorted_terms as $child_term_name => $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;
                $index2++;
            }
        }
        return $items;
    }
    

    代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    【讨论】:

    • 谢谢!这就是我需要的。有没有办法在同一代码中隐藏空类别?
    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多