Intereting Posts
Сделать одну страницу недоступной для поисковых роботов Мне нужен совет о том, как структурировать категории в соответствии с макетом, который у меня есть Объединение пользовательских типов сообщений и категории сообщений Удаление плагина: удалить все параметры с определенным префиксом ERR_CONTENT_DECODING_FAILED: Как полностью удалить плагины сжатия gzip? WordPress застрял в удалении пользователя MySQL: получить элементы post_tag, которые являются тегами (а не ключевыми словами SEO) Разное количество сообщений на первой странице изменять размер изображений без урожая Невозможно получить любой контент с загруженной Ajax страницы API для фильтрации новой регистрации пользователя $ POST-данных? Как искать сообщения, заданные post_content AND post_excerpt, используя WP_Query? Как вызвать WordPress Первое сообщение об изображении или другое прикрепленное изображение или по умолчанию Как установить минимальную длину для имени пользователя в Woocommerce? Помощь с MySQL в WPDB Query Conversion

Как настроить меню навигации?

Я новичок в WordPress, и я пробовал функцию wp_nav_menu . Если я правильно понимаю, это стандартный способ показать вам меню навигации, созданное с помощью Менеджера меню.

Меня беспокоит тот факт, что он внутренне создает кучу классов CSS, которые мне, вероятно, не нужны. У меня есть контроль над контейнером div (удалить его, изменить его класс и т. Д.) И сам элемент ul , а также добавить дополнительные элементы до и после элемента привязки. Я не мог узнать, как удалить те классы bizillion, которые связаны с элементами списка ( li ).

Есть ли способ достичь этого? И еще один вопрос: может он навредить? Я заметил, что есть несколько классов, которые могут использоваться другими встроенными функциями WordPress. Если есть способ удалить те, которые обязательно должны остаться?

Использование wp_nav_menu () и Walker – отличная вещь, и я очень ценю другие ответы с этим решением, но я думаю, что это очень трудный путь для простого меню. Поэтому я довольно часто делал это через wp_get_nav_menu_items ()

Итак, давайте сосредоточимся на идее: я просто получаю все пункты меню из одного из навигационных меню WordPress, чтобы полностью перестроить меню самостоятельно.

То, что я получаю, является обнаженным меню, как мы это видели, когда мы изучали HTML. Результат будет выглядеть так:

 <ul> <li></li> <li></li> <li></li> (...) </ul> 

Прежде всего, нам нужно имя меню, зарегистрированного в менеджере меню. Вероятно, вы найдете это в своих functions.php . Это, например, то, как это выглядит в Twenty Thirteen-Theme:

 register_nav_menu( 'primary', __( 'Navigation Menu', 'twentythirteen' ) ); 

Кроме того, нам не нужно будет вставлять больше информации вручную, потому что мы сможем получить информацию (например, местоположение, идентификатор, …) зарегистрированного меню:

 <?php $menu_name = 'primary'; // this is the registered menu name if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) : $menu = wp_get_nav_menu_object( $locations[ $menu_name ] ); $menu_items = wp_get_nav_menu_items($menu->term_id); echo '<ul>'; foreach ( (array) $menu_items as $key => $menu_item ) : $title = $menu_item->title; echo '<li>' . $title . '</li>'; endforeach; echo '</ul>'; else : echo '<p>Menu "' . $menu_name . '" not defined.</p>'; endif; ?> 

Таким образом, это полностью исключает структуру меню без классов и с элементами меню формирует ваш менеджер меню навигации; или он не пройдет гладко, если имя или местоположение меню (пока) не определено.

Помня об этом, вам не составит труда добавить свою собственную сортировку или что-то еще … просто взгляните на параметры wp_get_nav_menu_items () по умолчанию (как указано в Codex):

 <?php $args = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item', 'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true, 'update_post_term_cache' => false ); ?> 

ОБНОВЛЕНИЕ. Подводя итог моему ответу и сосредоточив внимание на последней части вашего вопроса: это не повредит вам (это касается только стиля), но также не будет предоставлять никаких дополнительных функций (например, дополнительные классы для текущих страниц или вещей как это). Вам придется самостоятельно строить все дополнительные функции.

Таким образом, вы будете хорошо использовать wp_nav_menu () ; просто игнорируйте все эти имена id и классов в исходном коде своей страницы, если они вам не нужны, но они будут там, если вам понадобятся в будущем 🙂

Существуют различные способы настройки меню навигации в WordPress, даже если вы можете полностью переопределить вывод.

Во-первых, wp_nav_menu() принимает некоторые аргументы для настройки возле каждого элемента меню. Есть больше аргументов, но те, которые необходимы для настройки вывода, таковы: (пожалуйста, перейдите к документу wp_nav_menu () для описания каждого из них):

  wp_nav_menu(array( 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>', )); 

Если выше, этого недостаточно. Есть некоторые фильтры, которые вы также можете применить, например nav_menu_css_class . И если вам нужно еще больше контролировать, вы полностью переопределяете вывод меню по умолчанию в параметре walker функции wp_nav_menu() . Значение walker должно быть установлено на новый PHPClass, который расширяет класс WordPress Walker_Nav_Menu :

  wp_nav_menu(array( 'walker' => new MyCustomNavWalker, )); 

И здесь класс MyCustomNavWalker (просто скопировал отказ), который вы можете полностью настроить:

 class MyCustomNavWalker extends Walker_Nav_Menu { /** * @see Walker::$tree_type * @since 3.0.0 * @var string */ var $tree_type = array( 'post_type', 'taxonomy', 'custom' ); /** * @see Walker::$db_fields * @since 3.0.0 * @todo Decouple this. * @var array */ var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' ); /** * @see Walker::start_lvl() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param int $depth Depth of page. Used for padding. */ function start_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat("\t", $depth); $output .= "\n$indent<ul class=\"sub-menu\">\n"; } /** * @see Walker::end_lvl() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param int $depth Depth of page. Used for padding. */ function end_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat("\t", $depth); $output .= "$indent</ul>\n"; } /** * @see Walker::start_el() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param int $current_page Menu item ID. * @param object $args */ function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args ); $id = $id ? ' id="' . esc_attr( $id ) . '"' : ''; $output .= $indent . '<li' . $id . $value . $class_names .'>'; $atts = array(); $atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : ''; $atts['target'] = ! empty( $item->target ) ? $item->target : ''; $atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : ''; $atts['href'] = ! empty( $item->url ) ? $item->url : ''; $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args ); $attributes = ''; foreach ( $atts as $attr => $value ) { if ( ! empty( $value ) ) { $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); $attributes .= ' ' . $attr . '="' . $value . '"'; } } $item_output = $args->before; $item_output .= '<a'. $attributes .'>'; $item_output .= $args->link_before; // HERE are your <span> tags $item_output .= '<span data-hover="'.esc_attr($item->title).'">'; $item_output .= apply_filters( 'the_title', $item->title, $item->ID ); $item_output .= '</span>'; $item_output .= $args->link_after; $item_output .= '</a>'; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } /** * @see Walker::end_el() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Page data object. Not used. * @param int $depth Depth of page. Not Used. */ function end_el( &$output, $item, $depth = 0, $args = array() ) { $output .= "</li>\n"; } } 

Да, это возможно.
Вы должны написать свой собственный nav Walker для этого. Вот тот, который делает именно то, что вы хотите: https://snipt.net/huskie/wordpress-custom-walker-class-to-remove-unnecessary-classes-and-ids-from-menu-items/ . Я надеюсь, что это помогает. И не будет никакого вреда, если вы удалите эти автоматически сгенерированные классы.