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

Sort WooCommerce product category sub menu items by name ASC in Wordpress menu

我在我的 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); 

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

需要一个额外的 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 文件。已测试并有效。