Рано или поздно в проекте возникает необходимость добавить иконки к пунктам меню — например, чтобы визуально разделить навигацию или сделать её более понятной.
Для такой задачи не обязательно подключать отдельный плагин: если нужен полный контроль и минимум лишнего кода, это легко реализуется на уровне темы.
Я покажу вариант на Dashicons (это встроенный набор иконок WordPress). Идея такая:
- Регистрируем меню в теме.
- Подключаем Dashicons на фронте.
- Добавляем поле “Dashicons Class” в админке меню.
- Сохраняем значение в postmeta пункта меню.
- На фронтенде добавляем
<i class="dashicons ...">перед названием пункта.
В итоге мы получим следующий результат.
1) Регистрируем меню в теме
Добавь это в functions.php:
1function slug_setup_theme() {
2 register_nav_menus( [
3 'sidebar-menu' => __( 'Sidebar Menu', 'your-textdomain' ),
4 ] );
5}
6add_action( 'after_setup_theme', 'slug_setup_theme' );
2) Вывод меню в шаблоне
Добавь этот код в нужный шаблон темы (например, sidebar.php или header.php):
1<?php wp_nav_menu( [
2 'theme_location' => 'sidebar-menu',
3 'container' => false,
4 'menu_class' => 'side-nav',
5 'depth' => 1,
6 'fallback_cb' => false,
7] ); ?>
3) Подключаем Dashicons на фронтенде
Добавь это в functions.php:
1function slug_enqueue_scripts() {
2 wp_enqueue_style( 'dashicons' );
3}
4add_action( 'wp_enqueue_scripts', 'slug_enqueue_scripts' );
4) Добавляем поле “Dashicons Class” для пункта меню
Это
поле
будет отображаться в админке для каждого пункта меню.
Добавь это в functions.php:
1function slug_menu_item_dashicons( $item_id ) {
2 $value = get_post_meta( $item_id, '_menu_item_dashicon', true ); ?>
3 <p class="description description-thin">
4 <label for="menu-item-dashicon-<?php echo $item_id; ?>">
5 <?php esc_html_e( 'Dashicons Class', 'your-textdomain' ); ?><br>
6 </label>
7 <input
8 type="text"
9 id="menu-item-dashicon-<?php echo $item_id; ?>"
10 class="widefat"
11 name="menu_item_dashicon[<?php echo $item_id; ?>]"
12 value="<?php echo esc_attr( $value ); ?>"
13 placeholder="dashicons-admin-home"
14 />
15 </p>
16<?php }
17add_action( 'wp_nav_menu_item_custom_fields', 'slug_menu_item_dashicons' );
5) Сохраняем поле в postmeta
Добавь это в functions.php:
1function slug_update_menu_item_dashicons( $menu_id, $menu_item_db_id ) {
2 $dashicon = $_POST['menu_item_dashicon'][ $menu_item_db_id ] ?? '';
3 $dashicon = sanitize_text_field( $dashicon );
4
5 if ( empty( $dashicon ) ) {
6 delete_post_meta( $menu_item_db_id, '_menu_item_dashicon' );
7 return;
8 }
9
10 update_post_meta( $menu_item_db_id, '_menu_item_dashicon', $dashicon );
11}
12add_action( 'wp_update_nav_menu_item', 'slug_update_menu_item_dashicons', 10, 2 );
6) Добавляем иконку в HTML меню на фронтенде
Добавь это в functions.php:
1function slug_nav_menu_start_el( $item_output, $item, $depth, $args ) {
2 if ( empty( $args->theme_location ) || $args->theme_location !== 'sidebar-menu' ) {
3 return $item_output;
4 }
5
6 $dashicon = get_post_meta( $item->ID, '_menu_item_dashicon', true );
7 if ( !$dashicon ) {
8 return $item_output;
9 }
10
11 $icon_html = '<i class="dashicons ' . esc_attr( $dashicon ) . '" aria-hidden="true"></i>';
12
13 return preg_replace( '~(<a\b[^>]*>)~i', '$1' . $icon_html, $item_output, 1 );
14}
15add_action( 'walker_nav_menu_start_el', 'slug_nav_menu_start_el', 10, 4 );
Как использовать
- Зайди во Внешний вид → Меню
- Открой нужный пункт меню
- В поле Dashicons Class напиши класс иконки, например:
dashicons-admin-homedashicons-editor-codedashicons-tag