WordPress での日本語スラッグについて

WordPress でパーマリンク構造に %postname% を含めた場合、%postname% が投稿スラッグで置き換えられる。
投稿スラッグを指定しないと、日本語タイトルを urlencode したものが %postname% として使用される。
 例: https://dogmap.jp/2008/03/25/%e6%b7%b1%e6%b3%a5%e4%b8%98%e5%a5%87%e8%ab%87/

%e6などのように特定の文字を "%" と 16 進数字 2 つを用いて変換する処理の事をパーセントエンコーディングと言い、URI の一般的構文を定めた RFC3986 にも記されている
以下、RFC3986 邦訳の抜粋。

パーセントエンコーディング{percent-encoding} メカニズムは、オクテットの対応する文字が認められた文字の範囲外にある、あるいは構成要素の中で区切り氏として使用されている場合に使用される。パーセントエンコードされたオクテットは、パーセント文字 "%" と、そのオクテットの数値を表している二桁の 16 進数字から成る三重語としてエンコードされる。例えば、"%20" は 2 進オクテット "00100000" (ABNF: %x20) についてのパーセントエンコーディングであり、US-ASCII のスペース文字 (SP) に対応している。 Section 2.4 は、パーセントエンコーディングとデコーディングが適応される時について記述している。
pct-encoded = "%" HEXDIG HEXDIG
大文字の 16 進数字 'A' から 'F' は、小文字の 'a' から 'f' とそれぞれ等価である。二つの URI のパーセントエンコードされたオクテット内で使用される 16 進数字の大文字・小文字のみが異なる場合、それらは等価である。整合性を持たせるため、URI の生成を行うもの{producers} や正規化を行うもの{normalizers} は全てのパーセントエンコーディングについて大文字の 16 進数字を使用すべきである。

このパーセントエンコーディングされた URI だが、WordPress ではすべて英小文字になっている。

確かに RFC3986 には "二つの URI のパーセントエンコードされたオクテット内で使用される 16 進数字の大文字・小文字のみが異なる場合、それらは等価である。" とあるので、どちらでも良いとは思うのだが
"整合性を持たせるため、URI の生成を行うもの{producers} や正規化を行うもの{normalizers} は全てのパーセントエンコーディングについて大文字の 16 進数字を使用すべきである。" ともあるので、すべて大文字にしたほうが良いような気がする。

そんなわけで、この問題に対応するために以下のような記述をテーマの functions.php に追加しました。

<?php
function percent_encode_capital_letter($uri) {
 $uri = preg_replace_callback('/(%&#91;0-9a-f&#93;{2}?)+/', create_function('$matches','return strtoupper($matches&#91;0&#93;);'), $uri);
 return $uri;
}

add_filter('post_link', 'percent_encode_capital_letter');
add_filter('page_link', 'percent_encode_capital_letter');
add_filter('tag_link', 'percent_encode_capital_letter');
add_filter('category_link', 'percent_encode_capital_letter');
add_filter('preview_post_link', 'percent_encode_capital_letter');
add_filter('get_the_guid', 'percent_encode_capital_letter');
?>

プラグイン化するほどでもないようなちょっとした機能を追加したいとき、functions.php は便利がいいですね。

2 thoughts on “WordPress での日本語スラッグについて

  1. ピンバック: Wordpressの日本語URLエンコードの修正 | 住 太陽のブログ

  2. ピンバック: WordPressの日本語スラッグ対応 - 我が道を逝く〜 EG6*K-7 Limited Silver Life.

コメントを残す

メールアドレスが公開されることはありません。

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