在 Wordpress 菜单中按名称 ASC 对 WooCommerce 产品类别子菜单项进行排序

问题描述

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

enter image description here

代码

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); 

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

解决方法

需要额外的 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 文件中。经测试有效。