【WordPress】Bogoの言語スイッチをトグル表示し、対応のページがない場合は言語トップにする

WordPressの多言語対応プラグインBogoを使用している場合、以下のコードで言語の切替スイッチを表示できる。

<?php echo do_shortcode( '[bogo]' ); ?>

表示される言語スイッチは以下の通り。

Bogoのデフォルト言語スイッチャー

ただ、サイトのデザインによっては、カスタマイズしたいところ。
今回は試しに、以下の条件でカスタマイズしてみる。

  • 切替先の言語のみを表示
  • 切替先の言語ページが存在しない場合は切替先の言語のトップページへ移動する

サンプルコード

functions.php
/** Bogo 言語スイッチオーバーライド */
function my_language_switcher( $args = '' ) {
	$args   = wp_parse_args(
		$args,
		array(
			'echo' => false,
		)
	);
	$output = '';

	// 言語セット取得.
	$links = bogo_language_switcher_links( $args );

	foreach ( $links as $link ) {
		if ( get_locale() === $link['locale'] ) {
			// 表示中の言語は表示しない.
			continue;
		}

		$label = $link['native_name'] ? $link['native_name'] : $link['title'];
		$title = $link['title'];

		// 切替先の言語ページが存在しない?
		if ( empty( $link['href'] ) ) {
			// 切替先の言語のトップページへ移動する.
			$url = home_url();
			if ( 'en_US' === $link['locale'] ) {
				$url = path_combine( array( $url, '/en/' ) );
			}
			$output = sprintf(
				'<a href="%1$s" title="%2$s">%3$s</a>',
				$url,
				esc_attr( $title ),
				esc_html( str_replace( ' (United States)', '', $label ) )
			);
		} else {
			$output = sprintf(
				'<a rel="alternate" hreflang="%1$s" href="%2$s" title="%3$s">%4$s</a>',
				$link['lang'],
				esc_url( $link['href'] ),
				esc_attr( $title ),
				esc_html( str_replace( ' (United States)', '', $label ) )
			);
		}

		break;
	}

	$output = apply_filters( 'bogo_language_switcher', $output, $args );

	if ( $args['echo'] ) {
		echo $output;
	} else {
		return $output;
	}
}
remove_shortcode( 'bogo', 'bogo_language_switcher' );
add_shortcode( 'bogo', 'my_language_switcher' );

/** 内部関数:パス結合 */
function path_combine( $path_arry ) {
	$ret_path = ''; // 結果の格納用変数.
	$trim_str = DIRECTORY_SEPARATOR; // ディレクトリの区切り文字.

	foreach ( $path_arry as $value ) {
		if ( empty( $ret_path ) ) {
			$ret_path = $value;
		} else {
			// 末尾と先頭(結合部分の区切り文字)をトリム.
			$ret_path = rtrim( $ret_path, $trim_str );
			$value    = ltrim( $value, $trim_str );
			// 改めて結合部分に区切り文字を入れる.
			$ret_path = $ret_path . $trim_str . $value;
		}
	}
	return $ret_path;
}

解説

上記コードを、テーマのfunctions.phpに記載したうえで、言語スイッチャーの表示コードを呼び出す。

すると、「日本語」⇔「English」と切替先の言語スイッチャーのみが表示されるようになる。

また、内部関数はURLの結合用に使っているだけなので、無理に使う必要はない。

今回は2言語のみで英語のみのケースで書いたが、3言語以上に対応する場合は、トップページリンクの作成箇所を修正すればOK。

投稿者: Output48

中学生の時に初めてHTMLに触れてからホームページ制作を独学で始める。 ベンチャー企業の営業、大手企業のPG・SEを経て、独立。 現在はとある企業のCTOと、変な名前の会社の社長をしてる。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください