WordPressは非常に柔軟なCMSで、カスタムメニューに対してさまざまなカスタマイズを行うことが可能です。その一つが独自のWalkerクラスを設定し、メニュー項目に「タイトル属性」や「説明」を反映させる方法、そして任意のクラスを反映させるカスタマイズです。これを実現するためには、以下のようなステップが必要となります。

ステップ1: 独自のWalkerクラスを設定する

まず、functions.phpファイルに独自のWalkerクラスを作成します。このWalkerクラスは、メニュー項目に対して任意のクラスを反映させ、さらに「タイトル属性」や「説明」を反映させる機能を持つように設計されています。


/* メニューに独自のWalkerクラスを設定する */
class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {
  function start_el(&$output, $item, $depth=0, $args=array(), $id = 0) {
    $classes = empty($item->classes) ? array() : (array) $item->classes;
    $classes[] = 'menu-item-' . $item->ID;
    if(isset($args->item_class)) {
      $classes[] = $args->item_class;
    }

    $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));

    !empty ($class_names)
    and $class_names = ' class="' . esc_attr($class_names) . '"';

    $output .= "<li id='menu-item-$item->ID' $class_names>";

    //タイトル属性が設定されている項目に対してのみ、タイトル属性を反映させる
    $attributes  = ! empty($item->attr_title) ? ' title="'  . esc_attr($item->attr_title) .'"' : '';
    $attributes .= ! empty($item->target)     ? ' target="' . esc_attr($item->target    ) .'"' : '';
    $attributes .= ! empty($item->xfn)        ? ' rel="'    . esc_attr($item->xfn       ) .'"' : '';
    $attributes .= ! empty($item->url)        ? ' href="'   . esc_attr($item->url       ) .'"' : '';
    //カスタムメニューに任意のクラスを反映させる
    $attributes .= isset($args->link_class)   ? ' class="'  . esc_attr($args->link_class) .'"' : '';

    //説明を<a>タグの内部に表示されるようにする
    $description = !empty($item->description) ? '<span class="menu-description">'.esc_attr($item->description).'</span>' : '';

    $item_output = $args->before
    . "<a $attributes>"
    . $args->link_before
    . apply_filters('the_title', $item->title, $item->ID)
    . $description // Add the description here
    . $args->link_after
    . '</a> '
    . $args->after;

    $output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
  }
}

ここでは、WordPressの内蔵関数Walker_Nav_Menuを継承したカスタムクラスCustom_Walker_Nav_Menuを作成しています。

ステップ2: カスタムメニューに任意のクラスを反映させる

次に、カスタムメニューに任意のクラスを反映させるためのコードを追加します。


// (既存のコードは省略)

$attributes .= isset($args->link_class)   ? ' class="'  . esc_attr($args->link_class) .'"' : '';

// (既存のコードは省略)

このコードは、メニュー項目に任意のクラスを反映させるためのものです。

ステップ3: カスタムメニューをショートコードで表示する

最後に、ショートコードを使用してカスタムメニューを表示するためのコードを追加します。


/* カスタムメニューをショートコードで表示出来る様にする */
/* [cmenu menu="メニュー名" container_class="nav-headmenu1" menu_class="menu-headmenu1" item_class="item-headmenu1" link_class="link-headmenu1"] */
function custom_menu_nav($atts, $content = null) {
  extract(shortcode_atts(
    array(
      'menu'            => '',
      'container'       => 'nav',
      'container_class' => '',
      'container_id'    => '',
      'menu_class'      => 'menu',
      'menu_id'         => '',
      'echo'            => true,
      'fallback_cb'     => 'wp_page_menu',
      'before'          => '',
      'after'           => '',
      'link_before'     => '',
      'link_after'      => '',
      'depth'           => 0,
      'item_class'      => '', //追加
      'link_class'      => '', //追加
      'walker'          => new Custom_Walker_Nav_Menu(),
      'theme_location'  => ''
    ),
    $atts
  ));
  return wp_nav_menu(array(
    'menu'            => $menu,
    'container'       => $container,
    'container_class' => $container_class,
    'container_id'    => $container_id,
    'menu_class'      => $menu_class,
    'menu_id'         => $menu_id,
    'echo'            => false,
    'fallback_cb'     => $fallback_cb,
    'before'          => $before,
    'after'           => $after,
    'link_before'     => $link_before,
    'link_after'      => $link_after,
    'depth'           => $depth,
    'item_class'      => $item_class, //追加
    'link_class'      => $link_class, //追加
    'walker'          => $walker,
    'theme_location'  => $theme_location
  ));
}
add_shortcode("cmenu", "custom_menu_nav");

/* [ulmenu menu="メニュー名" menu_class="menu-headmenu1" item_class="item-headmenu1" link_class="link-headmenu1"](※コンテナ= false) */
function custom_menu_list($atts, $content = null) {
  extract(shortcode_atts(
    array(
      'menu'            => '',
      'container'       => false,
      'container_class' => '',
      'container_id'    => '',
      'menu_class'      => 'menu',
      'menu_id'         => '',
      'echo'            => true,
      'fallback_cb'     => 'wp_page_menu',
      'before'          => '',
      'after'           => '',
      'link_before'     => '',
      'link_after'      => '',
      'depth'           => 0,
      'item_class'      => '', //追加
      'link_class'      => '', //追加
      'walker'          => new Custom_Walker_Nav_Menu(),
      'theme_location'  => ''
    ),
    $atts
  ));
  return wp_nav_menu(array(
    'menu'            => $menu,
    'container'       => $container,
    'container_class' => $container_class,
    'container_id'    => $container_id,
    'menu_class'      => $menu_class,
    'menu_id'         => $menu_id,
    'echo'            => false,
    'fallback_cb'     => $fallback_cb,
    'before'          => $before,
    'after'           => $after,
    'link_before'     => $link_before,
    'link_after'      => $link_after,
    'depth'           => $depth,
    'item_class'      => $item_class, //追加
    'link_class'      => $link_class, //追加
    'walker'          => $walker,
    'theme_location'  => $theme_location
  ));
}
add_shortcode("ulmenu", "custom_menu_list");

/* [limenu menu="メニュー名" item_class="item-headmenu1" link_class="link-headmenu1"](※コンテナ= false、ul削除) */
function custom_menu_list_item($atts, $content = null) {
  extract(shortcode_atts(
    array(
      'menu'            => '',
      'container'       => false,
      'container_class' => '',
      'container_id'    => '',
      'menu_class'      => 'menu',
      'menu_id'         => '',
      'echo'            => true,
      'fallback_cb'     => 'wp_page_menu',
      'before'          => '',
      'after'           => '',
      'link_before'     => '',
      'link_after'      => '',
      'items_wrap'      => '%3$s',
      'depth'           => 0,
      'item_class'      => $item_class, //追加
      'link_class'      => $link_class, //追加
      'walker'          => new Custom_Walker_Nav_Menu(),
      'theme_location'  => ''
    ),
    $atts
  ));
  return wp_nav_menu(array(
    'menu'            => $menu,
    'container'       => $container,
    'container_class' => $container_class,
    'container_id'    => $container_id,
    'menu_class'      => $menu_class,
    'menu_id'         => $menu_id,
    'echo'            => false,
    'fallback_cb'     => $fallback_cb,
    'before'          => $before,
    'after'           => $after,
    'link_before'     => $link_before,
    'link_after'      => $link_after,
    'items_wrap'      => $items_wrap,
    'depth'           => $depth,
    'item_class'      => $item_class, //追加
    'link_class'      => $link_class, //追加
    'walker'          => $walker,
    'theme_location'  => $theme_location
  ));
}
add_shortcode("limenu", "custom_menu_list_item");

ここでは、「cmenu」「ulmenu」「limenu」というショートコードを作成しています。このショートコードは、カスタムメニューを表示します。

まとめ

以上のように、WordPressのカスタムメニューは非常に柔軟なカスタマイズが可能です。この機能を活用して、ユーザーエクスペリエンスを向上させることが可能です。自分だけのオリジナルなカスタムメニューを作成してみてはいかがでしょうか。