在 Wordpress 菜单中按名称 ASC 对 WooCommerce 产品类别子菜单项进行排序 [英] Sort WooCommerce product category sub menu items by name ASC in Wordpress menu

查看:21
本文介绍了在 Wordpress 菜单中按名称 ASC 对 WooCommerce 产品类别子菜单项进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am adding in my main WordPress menu to WooCommerce product category menu items, the children subcategory terms as submenu items with the following code and it works.

代码:

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

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

But I would like to sort that submenu items alphabetically in Ascending order and I didn't find a way to do it yet. How can I sort that submenu items by name (alphabetically) in Ascending order?

推荐答案

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

An additional foreach loop is required, to sort category sub menu items by name. Also there was some little oversights in your code (to avoid some errors). To finish you should always name your hooked functions for many different reasons.

重新访问的代码:

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 文件中.经测试有效.

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

这篇关于在 Wordpress 菜单中按名称 ASC 对 WooCommerce 产品类别子菜单项进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆