WordPress Twenty Seventeen のメニューをカスタマイズ

前回、WordPress のメニュー項目をアイコン表示させる方法を紹介した。今回はもう少し複雑なことをする。メニューでサイトホームにリンクさせるためにカスタムリンクを使用すると、サイトを引っ越した時に、再設定しなくてはならなくなる。また、アイコンとテキスト両方表示させた方が良い。これらを解決できる方法を編み出した。

初期状態

今回使用するテーマは Twenty Seventeen。Twenty Seventeen ではトップメニューとソーシャルリンクメニューの2種類作れる。で、次の画像のような感じで、その2種類のメニューを作成した状態を想定している。

この初期状態では、トップメニュー項目がテキストで、フッターのソーシャルリンクのアイコンがリンクアイコンになっている。

これを、トップメニューをアイコン + テキスト or アイコンのみ に変更し、ソーシャルリンクメニューのアイコンも指定できるようにし、ここでは RSS アイコンに変更する。

メニューの追加の方法は以前の記事を参考。今回のカスタマイズで、前回の PHP コード、CSS ルールは不要になるので、追加している場合は取り除いておく。

メニューの URL の文字列によってアイコンを指定

まず、タグやカテゴリー、静的ページをメニューに追加している場合、その URL の一部、例えば /about/ とか /contact/ が含まれる場合に、予め指定しておいたアイコンを使うようにさせる。

PHP コード

クラスを書いた。以下の PHP コードを functions.php に追加。

CSS ルール

次の CSS を style.css に追加。テーマによって各々独自の修正が必要になる。ここでは Twenty Seventeen 用。

PHP クラスの使い方

クラスの使い方は、インスタンス化時に配列で URL にどの文字列が入っていたらどのアイコンを使うかを指定してあげる。

この場合、/wordpress/ という文字列がメニューの URL に入っていたら、wordpress の Dashicon を使ってね、ということ。Dashicon の一覧はこちらから参照。リンクしたページでアイコンを選択して、Copy HTMLを押すと、次のような文字列がコピーされる。

この、dashicons-welcome-learn-moredashicons- を取り除いた、welcome-learn-more が SVG ファイルに登録されているアイコン ID になっているため、これを指定する。上の '/note/' => 'welcome-write-blog',/note/ という文字列がメニューのリンクの URL に入っている場合は、 welcome-write-blog のアイコンを使ってね、としている。

うまくいくとこんな感じで、メニューのラベルの前にアイコンが挿入される。

このコードではアイコンのみの設定は無いが、以下の

$sItemTitle を抜いてあげて、このように変更すればよい。

関数を指定して動的 URL を適用する

次に、ホーム URL やフィードURLといったサイトを引っ越しすると再設定しなくてはならないような URL を引越し後も再設定不要にする。どういうことかというと、入力する URL にカスタムのクエリパラメータを入れて、そこから URL 生成の関数を指定する。更に、同様の方法でアイコンの指定、ラベルの表示の有無も制御する。

PHP コード

以下を functions.php に追加。

CSS ルール

CSS ルールは上のを使いまわせばよい。テーマによって CSSは違うので、Twenty Seventeen 以外のテーマでは独自に書く必要がある。

PHP クラスの使い方

  1. インスタンス化時に、配列で、このカスタマイズを適用させる theme_location プロパティを指定する。このプロパティの値はテーマによって違うので自分で調べるしか無い。Twenty Seventeen の場合は topsocial の2種類だった。
  2. 次のアーギュメントをメニュー追加時の URL クエリパラメーターで渡してやる。
    • func : URL を生成させるPHP 関数
    • params : 上の func で指定した関数に渡す引数。&params[]=foo&prams[]=bar のようにして配列で渡すことが可能。
    • icon : Dashicon の SVG ファイルで定義付けされている ID。クラスが dashicons-welcome-learn-more なら welcome-learn-more の部分。
    • show_title : ラベルを表示するかどうか
    • attr : <a> タグの属性。例: &attr[target]=_blank

カスタマイザーからメニューの編集

上の PHPコードが追加できたら、カスタマイザーからメニューの URL を編集する。

例として、サイトのホーム URL を取得するには get_home_url() という WordPress の関数が使える。これをメニューの URL のクエリパラメータに指定する。http://{サイトのホームアドレス}?func=get_home_url で、PHP 側でメニューがレンダリングされる時に、get_home_url() が呼び出され、その値がリンクの href に適用される。

そして、アイコンも指定したい。ホームアイコンには Dashicon の admin-home がよさげ。なので、さっきの続きで、 http://{サイトのホームアドレス}?func=get_home_url&icon=admin-home としてやる。

うまく行けば、カスタマイザーはリアルタイムでメニューをアップデートしてくれ、Home のラベルの前にアイコンを挿入してくれる。

同様に、次は RSS フィードのメニュー。URL の最後に ?func=get_feed_link&icon=rss&show_title=0&attr[target]=blank を追加。get_feed_link() はサイトのフィード URL を取得してくれる。show_title に 0 を渡して、ラベルを非表示にしている。

最後に、ソーシャルリンクメニューの RSS の URL の最後も同様に ?func=get_feed_link&icon=rss&show_title=0&attr[target]=blank を追加してやる。すると、リンクアイコンがフィードアイコンに変化する。

結果

全てうまくいくとこんな感じになる。

今回は Twenty Seventeen で行った。他のテーマでは試してないけど、PHP のコード自体は動くはず。ただ、CSS はテーマごとに調節する必要がある。

おまけ

ちょっと CSS を追加で調節したいなと思い、以下を追加した。

Leave a Reply

Your email address will not be published. Required fields are marked *