ナビゲーションメニューの「ホーム」の文字を置き換える3つの方法

先日開催したJellyイベントで質問を受けたのでまとめました。「『Twenty Eleven』は便利なんだけど『ホーム』ってのがなー」という方に。

1. カスタムメニューを新規作成する

「外観」→「メニュー」にて『マイメニュー』というような名前(名前は任意)でカスタムメニューを新規作成。サイトホームのURLを埋め込んだ「カスタムリンク」を作ります。ナビゲーションラベルに好きな文字列を入れればオッケイ。

《欠点》
URL欄にサイトホームのアドレスを直接書くので、ドメインを変えたときなどに再設定する必要があります。

2. 固定ページでなんとかする

「設定」→「パーマリンク設定」にてページスラッグを使えるよう設定したなら、この方法もあり。たとえば、ナビゲーションメニューの「ホーム」を『HOME』にしたい場合。

まずは『HOME』という名の固定ページを作ります。ページスラッグは home にしておきましょうか。次に「設定」→「表示設定」の「フロントページの表示」にて、フロントページを『HOME』に設定。

あとは 1. のカスタムメニューの手順とほぼ同じ。「外観」→「メニュー」の「固定ページ」欄に

こんな感じで現れるので、チェックを入れてメニューに追加するだけです。

《欠点》
HOMEへのリンクは「設定」→「サイトアドレス (URL)」の設定に基づくので、ドメイン変更時も 1. のよう書き換えはおそらくないはず。ただ、設定のステップが多いのと、サイトホーム表示時に呼び出されるテンプレートが page.php という理由により「ワシゃあ index.php を呼び出したいんじゃ」というような場合には適してないでしょう。
(もちろんテンプレート階層を活用したカスタマイズは可能ですが)

3. プラグインAPIを使う

今まで「『ホーム』の文字置き換えたい問題」には 1. や 2. で対処してきたのですが、プラグインAPIを使ってもうちょっとシャキッとならんかいな?と調べたところ、こんな方法がありました。

『Twenty Eleven』をカスタマイズするなら、たいてい子テーマを作ることになるでしょうから、子テーマの functions.php にこんなスクリプトを書きます。

function my_setup_child_theme() {
	if ( !is_admin() ) {
		function my_replace_home_title( $args ) {
			$args['show_home'] = 'foobar'; // foobar の箇所に「ホーム」と置換したい文字列を書きます
			return $args;
		}
		add_filter( 'wp_page_menu_args', 'my_replace_home_title' );
	}
}
add_action( 'after_setup_theme', 'my_setup_child_theme' );

プラグインAPIに対して二重にフックをかけているのには理由があります(以降、バージョン3.3.1で説明)。

グローバルメニューの「ホーム」の文字列は /wp-content/themes/twentyeleven/functions.php の358~362行

function twentyeleven_page_menu_args( $args ) {
	$args['show_home'] = true;
	return $args;
}
add_filter( 'wp_page_menu_args', 'twentyeleven_page_menu_args' );

が /wp-includes/post-template.php の887~898行

	$args = apply_filters( 'wp_page_menu_args', $args );

	$menu = '';

	$list_args = $args;

	// Show Home in the menu
	if ( ! empty($args['show_home']) ) {
		if ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] )
			$text = __('Home');
		else
			$text = $args['show_home'];

にフックするかたちで生成されます。

以上の記述により、親テーマの functions.php で書かれている $args[‘show_home’] = true が有効となり post-template.php にて $text = __(‘Home’) つまり、日本語環境では「ホーム」がリンク文字列として設定されます。

これを上書きするために、$args[‘show_home’] を再設定しているのが子テーマの functions.php 2~8行目です。

しかし、通常は子テーマの functions.php が親テーマより先に読み込まれるため、読み込み順を入れ替える必要があります。それが 1行目・9~10行目の記述になります。

まとめ

1. とか 2. で欠点を書いたので「これって使い物にならない方法?」と思われるかもしれません。でも、固定ページやカスタムリンク、投稿のカテゴリーが混在したナビゲーションメニューを作れるのがカスタムメニューのいいところなので、サイトの設計に応じてうまく使い分けてはどうでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です