WordPress日本語版 日付表示が、設定どおりに動作しない問題に対処する

wordpress3-6-date-issue

設定どおりに動作しないとは、

日本語フォーラムで、何気なく回答したことから、WordPressの日本語版の日付の表示設定が、指定どおりに動作していない事を知りました。

twenty elevenの投稿日時を英語&数字表記にカスタマイズしたい

WordPressは、設定・一般・日付フォーマットから自由に日付のフォーマットを指定することができるようになっていますが、英語表示などにした場合に、日本語に翻訳されてしまったりといったことがおきます。

この現象は、テンプレート関数 get_the_date()や、the_date()などに、引数を設定した場合でも、同様です。

原因は、各種日付関数内で利用されるmysql2date関数のtranslate引数が、trueになっている場合に、起きるようです。標準的な日付関数は、translate引数(日付のローカライズ機能)がtrueになっているため、英語表記のフォーマット指定をした場合、日付のカスタム機能を指定したり、関数の引数にフォーマットを指定しても、指定どおりに、動作しなくなるといった事が発生します。

このため、日付を英語表記にしたい場合には、テンプレート関数をローカライズ機能が無効になっている関数に置き換えないとうまく動作しないという事になります。

WEBサイトを構築する上で、日付表示は日本語で行いたい場合も、英語で表記したい場合もあり、うまく思い通りに表示するために、どのような方法があるのかについて、メモを残したいと思います。

思い起こせば、以前、パンくずリストプラグインの設置を行った時に、ドタバタ 日付階層に年や日が表示されないという問題が発生したのですが、この問題は、もしかすると、日本語WordPressの翻訳機能に関連する問題だったのではないかと、思い当たりました。

地味な事柄のようにも思いますが、意外と私たちは影響を受けていて、対症療法に追われているのかもしれません

日付フォーマットが保存される場所

設定画面での日付フォーマットの指定は、データベースに保存されます。
その値は、

日付フォーマット

get_option( 'date_format' )

時刻フォーマット

get_option( 'time_format' );

によって取得する事が出来ます。

翻訳ファイル

WordPressは、英語で作られているため、日本語環境で使うために、翻訳ファイルを持っています。翻訳ファイルは、テーマ、プラグイン等が、独自に持っている場合もあります。

翻訳ファイルは、日本語の場合、ja.poというテキストファイルから、ja.moというバイナリファイルを作り出して、翻訳を行います。

翻訳ファイルは、管理画面用の翻訳ファイルや、マルチサイト用翻訳ファイル等複数のファイルが存在します。

ここでは、WEBサイトのビジュアルに関連するja.po ja.moについてだけ取り扱います。

wp-content/languages/ja.poに、日付などの表示にかかわる設定があります。

以下の表に、翻訳ファイルの日付に関する項目を拾ってみました

l, F jS, Y など、date()関数で使用する、英語の、日付のフォーマットは、日本語の日付に変更されています。

このような事から、関数の引数、管理パネルに設定したカスタムフォーマット等が、意図したとおりに動作しないといった事が発生します。

翻訳前 翻訳後
F, Y Y年n月
l, F jS, Y Y年n月j日 l
F j, Y Y年n月j日
F j, Y g:i a Y年n月j日 g:i A
j F, Y @ G:i:s Y年n月j日 G:i:s
j F, Y @ G:i Y年n月j日 @ G:i
Feb_February_abbreviation 2月_February_abbreviation
Mar_March_abbreviation 3月_March_abbreviation
Apr_April_abbreviation 4月_April_abbreviation
May_May_abbreviation 5月_May_abbreviation
Jun_June_abbreviation 6月_June_abbreviation
Jul_July_abbreviation 7月_July_abbreviation
Aug_August_abbreviation 8月_August_abbreviation
Sep_September_abbreviation 9月_September_abbreviation
Oct_October_abbreviation 10月_October_abbreviation
Nov_November_abbreviation 11月_November_abbreviation
Dec_December_abbreviation 12月_December_abbreviation
Sunday 日曜日
Monday 月曜日
Tuesday 火曜日
Wednesday 水曜日
Thursday 木曜日
Friday 金曜日
Saturday 土曜日
Sun
Mon
Tue
Wed
Thu
Fri
Sat
S_Sunday_initial 日_Sunday_initial
M_Monday_initial 月_Monday_initial
T_Tuesday_initial 火_Tuesday_initial
W_Wednesday_initial 水_Wednesday_initial
T_Thursday_initial 木_Thursday_initial
F_Friday_initial 金_Friday_initial
S_Saturday_initial 土_Saturday_initial
am am
pm pm
AM AM
PM PM
%s week %s週
%s month %sか月
%s year %s年

WordPressで使われる主な時刻関数

  • http://codex.wordpress.org/Function_Reference/get_comment_date(b:get_comment_date) x
  • http://codex.wordpress.org/Function_Reference/date_i18n(b:date_i18n) x
  • http://codex.wordpress.org/Function_Reference/the_date_xml(b:the_date_xml) o
  • http://codex.wordpress.org/Function_Reference/the_date(b:the_date) x
  • http://codex.wordpress.org/Function_Reference/get_the_date(b:get_the_date) X
  • http://codex.wordpress.org/Function_Reference/the_modified_date(b:the_modified_date)
    • http://codex.wordpress.org/Function_Reference/get_the_modified_date(b:get_the_modified_date)
      • http://codex.wordpress.org/Function_Reference/get_post_modified_time(b:get_post_modified_time)
  • http://codex.wordpress.org/Function_Reference/the_weekday_date(b:the_weekday_date) o
  • http://codex.wordpress.org/Function_Reference/get_lastpostdate(b:get_lastpostdate)
    • _get_last_post_time()
  • http://codex.wordpress.org/Function_Reference/get_date_permastruct(b:get_date_permastruct)
  • http://codex.wordpress.org/Function_Reference/get_comment_time(b:get_comment_time) x 引数による
  • http://codex.wordpress.org/Function_Reference/comment_time(b:comment_time) x
  • http://codex.wordpress.org/Function_Reference/human_time_diff(b:human_time_diff)
  • http://codex.wordpress.org/Function_Reference/current_time(b:current_time)
  • http://codex.wordpress.org/Function_Reference/wp_timezone_override_offset(b:wp_timezone_override_offset)
  • http://codex.wordpress.org/Function_Reference/wp_timezone_supported(b:wp_timezone_supported)
  • http://codex.wordpress.org/Function_Reference/wp_timezone_choice(b:wp_timezone_choice)
  • http://codex.wordpress.org/Function_Reference/the_time(b:the_time)
  • http://codex.wordpress.org/Function_Reference/get_the_time(b:get_the_time) x
  • http://codex.wordpress.org/Function_Reference/get_post_time(b:get_post_time) o
  • http://codex.wordpress.org/Function_Reference/the_modified_time(b:the_modified_time)
    • get_the_modified_time
      • get_post_modified_time o
  • http://codex.wordpress.org/Function_Reference/timer_start(b:timer_start)
  • http://codex.wordpress.org/Function_Reference/timer_stop(b:timer_stop)
  • http://codex.wordpress.org/Function_Reference/_get_last_post_time(b:_get_last_post_time)

日付ローカライズにかかわる重要な関数

  • http://codex.wordpress.org/Function_Reference/mysql2date(b:mysql2date)
  • http://codex.wordpress.org/Function_Reference/date_i18n(b:datei18n)

自由に、フォーマットを行うための方法

自由にフォーマットを行いたい場合に、どのような方法があるのかを、まとめます

翻訳ファイルの修正

翻訳ファイルを、http://www.poedit.net/download.php(b:Poedit)などのツールを使って、書き換える

gettext フィルタで表示を修正する

翻訳された文字列から、元に戻すのは、通常の文字列なら可能だけれど、フォーマットを元に戻すのは、困難

また、WordPressの新しいバージョンにアップグレードした場合には、翻訳ファイルは、上書きされるという問題も発生しそうです。

フィルタによる修正

日付フォーマットは mysql2dateによって、日付がtranslateされローカライズされます。
mysqldateは、日付関数の内部で使用されており、4番目の引数 translateがtrueにセットされた状態で動作する関数と、そうでないもので、日付の表示が異なっています。

date_i18nフィルタ

ローカライズされた日付を、ローカライズ前の値で置き換えるために、date_i18nフィルタを使う例です。

テーマファイル等で使う場合には、get_option( ‘date_format’ )で、日付フォーマットの設定を取得して、英文表記のフォーマットが使われている場合に、以下のフィルタが動作する設定を行うなどの工夫が出来るのではないかと思います。

テーマのfunctions.phpに追加

add_filter( 'date_i18n', 'ja_date_i18n', 10, 4 );
 
function ja_date_i18n( $date , $req_format, $i, $gmt){
	if( defined('WPLANG') and WPLANG== 'ja' ) {
	//WPLANG を使うべきか global $localeを使うべきか ?

	/* format が cの場合 +00:00を+09:00に修正 */
	
	$format= sprintf( '%1$02d:00', get_option( 'gmt_offset' ) );
	$date = str_replace( '+00:00', '+'.$format, $date );

	/* 日本語環境で、フォーマットに英語表記 */

				
		if ( preg_match( '![SlDFM]!', $req_format ) ) {
	 
			return apply_filters( 'ja_date_i18n', date( $req_format, $i ) );
		}
	}
	
	return apply_filters( 'ja_date_i18n', $date );
}

関数の置き換えによる修正

get_the_date() the_date() などの関数を、translate機能がデフォルトで働かない

get_post_time(),get_post_modified_time()に置き換える

課題

投稿日については、何とか動作するようになりましたが、feed関連は、別途に対応が必要そうです。

rss2の場合

<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>

translateは、falseに設定されてますが、直書きされていたりします。

  • http://codex.wordpress.org/Customizing_Feeds

参考

  • https://github.com/WordPress/WordPress/blob/master/wp-includes/locale.php(b:wp-includes/locale.php)
    • ローカライズ機能と、翻訳ファイルの橋渡しを行うclass
  • global $locale
    • 日本語環境だと’ja’が返ります

[emulsion_relate_posts]