アイコン付きで視覚的にも分かりやすい「ボックスメニュー」を表示させるショートコードを実装する方法です。
WordPressの「メニュー」画面でメニューを作成できるので、ほぼほぼコードを書く必要がない方法です。
目次
完成形
「ボックスメニュー」を本文中で利用すると、以下のように4列で表示されます(スマホでは2列表示)。
サイドバーエリアのようなウィジェットでは、2列表示になります。
画像を用意すれば、以下のようなアイコンメニューも作成できます。
サイドバーウィジェットでの表示。
アイコン FLAT ICON DESIGN
主な手順
ボックスメニューショートコードの実装に必要なカスタマイズ手順はこちら。
- functions.phpにPHPコードをコピペ
- style.cssにCSSをコピペ
- メニューを作成する
- 利用箇所でショートコードを貼り付ける
実装するだけなら、コピペだけでできます。コピペ後は、好みに合わせて色や余白を調節すればOK。
コードのカスタマイズが終わった後はWordPressのメニュー画面からメニューを作成するだけです。
Seventeenで動作確認をしています。なので大抵のテーマには利用できると思います。ただ、テーマによっては特別な設定が必要になるかもしれません。
functions.phpにPHPコードをコピペ
まずはテーマ(子テーマ)のfunctions.phpに以下のPHPコードを追記する形でコピペします。
/** * ボックスメニューのカスタマイズ * @author: わいひら * @link: https://nelog.jp/box-menu * @license: http://www.gnu.org/licenses/gpl-2.0.html GPL v2 or later */ //テキストウィジェットでショートコードの実行 add_filter( 'widget_text', 'do_shortcode' ); //ボックスメニューショートコード add_shortcode('box_menu', 'get_box_menu_tag'); if ( !function_exists( 'get_box_menu_tag' ) ): function get_box_menu_tag($atts){ extract(shortcode_atts(array( 'name' => '', // メニュー名 'class' => null, ), $atts, 'box_menu')); //デフォルトアイコンフォント(Font Awesome4) $def_icon_classes = 'fa fa-star'; //Font Awesome5を利用する場合は変更する if (is_admin()) { return; } $tag = null; $menu_items = wp_get_nav_menu_items($name); // name: カスタムメニューの名前 if (!$menu_items) { return; } foreach ($menu_items as $menu): $url = $menu->url; $title = $menu->title; $title_tag = '<div class="box-menu-label">'.$title.'</div>'; $description_tag = '<div class="box-menu-description">'.$menu->description.'</div>'; $attr_title = $menu->attr_title; $classes = implode(' ', $menu->classes); $icon_tag = '<div class="'.esc_attr($def_icon_classes).'" aria-hidden="true"></div>'; //画像URLの場合 if (preg_match('/(https?)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\.(jpg|jpeg|gif|png)/', $attr_title)) { $img_url = $attr_title; $icon_tag = '<img src="'.esc_url($img_url).'" alt="'.esc_attr($title).'" />'; } //アイコンフォントの場合 elseif (preg_match('/fa.? fa-[a-z\-]+/', $classes)) { $icon_tag = '<div class="'.esc_attr($classes).'" aria-hidden="true"></div>'; } $icon_tag = '<div class="box-menu-icon">'.$icon_tag.'</div>'; $tag .= '<a class="box-menu" href="'.esc_url($url).'">'. $icon_tag. $title_tag. $description_tag. '</a>'; endforeach; $add_class = null; if ($class) { $add_class = ' '.$class; } //ラッパーで囲む $tag = '<div class="box-menus'.$add_class.'">'.$tag.'</div>'; return apply_filters('get_box_menu_tag', $tag); } endif;
コードの冒頭で、テキストウィジェットでもショートコードが使えるように処理を追加しています。
上記コードは、あくまで「Font Awesome4でカスタマイズする際の例」になります。
Font Awesome5で利用するには、以下の部分を
//デフォルトアイコンフォント(Font Awesome4) $def_icon_classes = 'fa fa-star'; //Font Awesome5を利用する場合は変更する
以下のように変更する必要があるかと思います。
//デフォルトアイコンフォント $def_icon_classes = 'fas fa-star'; //Font Awesome5を利用する場合は変更する
style.cssにCSSをコピペ
次にテーマ(子テーマ)のstyle.cssに以下を追記する形でコピペします。
/** * ボックスメニューのカスタマイズ * @author: わいひら * @link: https://nelog.jp/box-menu * @license: http://www.gnu.org/licenses/gpl-2.0.html GPL v2 or later * @reference: https://ponhiro.com/box-nav/ @ponhiroo */ .box-menus { display: flex; justify-content: center; flex-wrap: wrap; margin: 18px 0; } .box-menus * { line-height: 1.6; margin: 0; } .box-menus .box-menu { display: block; padding: 0.5em 1em; text-decoration: none; width: 100%; text-align: center; min-height: 100px; cursor: pointer; background: #fff; width: calc(100%/4); color: #777; box-shadow: inset 1px 1px 0 0 #eee, 1px 1px 0 0 #eee, 1px 0 0 0 #eee; transition: none; } .box-menus .box-menu:last-child { margin-right: auto; } .box-menus .box-menu:hover { box-shadow: inset 2px 2px 0 0 #f4b3c2, 2px 2px 0 0 #f4b3c2, 2px 0 0 0 #f4b3c2, 0 2px 0 0 #f4b3c2; color: #777; z-index: 2; } .box-menus .box-menu-icon { color: #f4b3c2; font-size: 40px; display: flex; justify-content: center; align-items: center; } .box-menus .box-menu-icon * { margin: 10px 0; max-width: 60px; max-height: 60px; height: auto; display: inline-block; } .box-menus .box-menu-icon img { font-size: 16px; border: none; box-shadow: none; filter: drop-shadow(0px 0px 3px rgba(0, 0, 0, 0.2)); } .box-menus .box-menu-label { font-size: 14px; font-weight: 600; } .box-menus .box-menu-description { font-size: 10px; opacity: 0.8; } /* ウィジェットに入っている場合(テーマによってCSSセレクタの変更が必要かも) */ .widget .box-menus .box-menu { width: calc(100%/2); } /* スマホ用 */ @media screen and (max-width: 599px){ .box-menus .box-menu{ width: calc(100%/2); } }
使用されている色や余白に関しては、好みで変更してください。
また、テーマによっては「CSSセレクタの優先度を変更する必要があるケース」もあるかもしれません。全てのテーマで動作保証はできないのでご了承ください。
Font Awesome4が読み込まれていない場合
Font Awesome4を利用する場合で、Font Awesome4のCSSファイルが読み込まれていないテーマの場合は、<head></head>内に以下を挿入してください。
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
Font Awesome5が読み込まれていない場合
Font Awesome5を利用する場合で、Font Awesome5のCSSファイルが読み込まれていないテーマの場合は、<head></head>内に以下を挿入してください。
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">
参考
今回の「ボックスメニュー」のCSSは、ぽんひろさんの以下の記事を参考にさせていただきました。
WPメニュー機能を利用しないで、HTMLを細かく調整して設置したい場合は、上記手法のほうが向いていると思います。
メニューを作成する
あとは、WordPress管理画面の「外観 → メニュー」から「ボックスメニュー」用のメニューの作成を行います。
メニューの作成方法は、こちらと同じです。
利用箇所でショートコードを貼り付ける
最後にショートコードでボックスメニューを呼び出します。
ショートコードの呼び出しの基本形はこちら。
nameオプションに対して単に「作成したメニュー名」を入力すればOKです。
テキストウィジェットで利用する場合はこんな感じ。
動作確認
ショートコードを、本文中や、サイドバーのウィジェットに入れて動作させた例がこちら。
スマホ画面だとこんな感じになります。
まとめ
今回は、「大抵のテーマでボックスメニューを手軽に作って利用できるように」とカスタマイズ方法を書きました。
というか、自分がまだ使っているSimplicityでも、使えるように実装方法をまとめたものを、残しておきたかっただけというか。
Cocoonには既に同じ機能があるので、カスタマイズは不要です。
ボックスメニューは、ヒートマップツールで見てみてもクリック率は上がる傾向にあるので、サイト回遊率を高めたい人向けの施策になり得るかと思います。
スマホだと、ボックスメニューのタップ率はより顕著に上がる傾向があるので、モバイルサイト向けに設置するというのもありかと思います。