我有一个很长的类别列表,包括子类别和子类别的子类别。在WordPress的菜单部分逐一选择并重新排列类别及其子类别的层次结构需要很长时间。
我搜索了相关信息,但没有找到任何有用的内容。所以我想知道是否有任何函数或插件可以自动添加这些类别到菜单中。
谢谢。
我搜索了相关信息,但没有找到任何有用的内容。所以我想知道是否有任何函数或插件可以自动添加这些类别到菜单中。
谢谢。
有一个插件:https://wordpress.org/plugins/jc-submenu/
虽然有些老了,但在一些主题中仍可使用。
我使用了 JC Submenu 插件,并通过在主题 functions.php 中添加过滤器来使其正常工作。非常完美。我使用了 Astra 主题。
//Enable compatibility with theme custom menu walkers
add_filter('jcs/enable_public_walker', 'jc_disable_public_walker');
function jc_disable_public_walker($default){
return false;
}
wp_nav_menu
walker
实现了这个可行版本。class AWP_Menu_Walker extends Walker_Nav_Menu {
function start_el(&$output, $item, $depth=0, $args=[], $id=0) {
$open = '';
$current = '';
$sub_menu = '';
$menuItemFont = 'font-sans text-sm font-light ';
$subMenuItemFont = 'text-sm font-sans font-light ';
$current_element_array = array( 'current-menu-item' );
$current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );
$current_class = array_intersect( $current_element_markers, $item->classes );
$current_element = array_intersect( $current_element_array, $item->classes );
if ($item->object == 'category') {
$category_slug = get_category($item->object_id);
$args = array(
'tag' => get_queried_object()->slug,
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $category_slug->slug, // here I get the slug of indexed category
),
)
);
$posts = get_posts( $args );
$current_url = get_permalink();
foreach ($posts as $post) :
$post_url = get_permalink($post->ID);
if ($post_url == $current_url) {
$current = 'text-red-500 ';
}
$sub_menu .= '<li class="select-none my-2 truncate- leading-tight ' . $current . $subMenuItemFont . ' px-4 pl-6"><a title="' . esc_html($post->post_title) . '" href="' . $post_url . '">' . esc_html($post->post_title) . '</a></li>';
endforeach;
}
// conditional styles for menu items
if (!empty($current_element)) {
$menuItemFont .= 'text-red-500 ';
$subMenuItemFont .= 'text-red-500 ';
} else {
$menuItemFont .= 'text-zinc-800 ';
$subMenuItemFont .= 'text-zinc-600 ';
}
// This set the <details> open if current item is whitin
if (!empty($current_class)) {
$open = 'open';
}
if (!$args->walker->has_children) {
if ($item->menu_item_parent == 0){
if ($item->object == 'category') {
$output .= '<details ' . $open . ' class="' . $menuItemFont . ' pl-4">';
$output .= '<summary class="select-none cursor-pointer truncate- ' . $menuItemFont . $color . $current . '"><span class="pl-4">' . esc_html($item->title) . '</span></summary>';
$output .= $sub_menu;
} else {
$output .= '<li class="select-none truncate- ' . $current . $menuItemFont . $color . ' pl-8 pr-2"><a title="' . esc_html($item->title) . '" href="' . esc_url($item->url) . '">' . esc_html($item->title) . '</a></li>';
}
}
} else {
$output .= '<details ' . $open . ' class="' . $menuItemFont . ' pl-4">';
$output .= '<summary class="select-none cursor-pointer truncate- ' . $menuItemFont . $color . $current . '"><span class="pl-4">' . esc_html($item->title) . '</span></summary>';
}
}
function end_el(&$output, $item, $depth = 0, $args = Array()){ // closing li a span
if ($item->menu_item_parent == 0){
$output .= '</details>';
}
if ($args->walker->has_children) {
$output .= '</details>';
}
}
}
/* Walker nav menu */
wp_nav_menu(
array(
'theme_location' => 'menu-1',
'menu_id' => 'primary-menu',
'items_wrap' => '<ul id="%1$s" class="%2$s font-display flex flex-col gap-1" aria-label="submenu">%3$s</ul>',
'walker' => new AWP_Menu_Walker(),
)
);