问题描述
我正在将我的主 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 文件中。经测试有效。