在 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 文件。已测试并有效。
我在我的 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 文件。已测试并有效。