PHP (WordPress) で英語表記の月日表示を置換する
WordPress をイジっていて、英語表記で「December 2021」とか「November 18, 2021」といった文字列の表記を YYYY-MM
や YYYY-MM-DD
表記に変換したいと思った。
調べたところ、preg_replace()
関数は pattern
と replacement
に配列を取れることが分かった。
- 参考 : PHP: preg_replace - Manual
- 参考 : How can I change the way dates shown in the archive widget? - WordPress Development Stack Exchange
そこで、以下のような関数を作ってみた。
// 「December 2021」といった表記を「2021-12」といった表記に変換する
function replace_month($before) {
$patterns = array(
'/January (\d+)/', '/February (\d+)/', '/March (\d+)/', '/April (\d+)/', '/May (\d+)/', '/June (\d+)/',
'/July (\d+)/', '/August (\d+)/', '/September (\d+)/', '/October (\d+)/', '/November (\d+)/', '/December (\d+)/'
);
$replacements = array(
'${1}-01', '${1}-02', '${1}-03', '${1}-04', '${1}-05', '${1}-06',
'${1}-07', '${1}-08', '${1}-09', '${1}-10', '${1}-11', '${1}-12'
);
$after = preg_replace($patterns, $replacements, $before);
return $after;
}
// 「December 18, 2021」といった表記を「2021-12-18」といった表記に変換する
function replace_month_date($before) {
$patterns = array(
'/January (\d+), (\d+)/', '/February (\d+), (\d+)/', '/March (\d+), (\d+)/', '/April (\d+), (\d+)/', '/May (\d+), (\d+)/', '/June (\d+), (\d+)/',
'/July (\d+), (\d+)/', '/August (\d+), (\d+)/', '/September (\d+), (\d+)/', '/October (\d+), (\d+)/', '/November (\d+), (\d+)/', '/December (\d+), (\d+)/'
);
$replacements = array(
'${2}-01-${1}', '${2}-02-${1}', '${2}-03-${1}', '${2}-04-${1}', '${2}-05-${1}', '${2}-06-${1}',
'${2}-07-${1}', '${2}-08-${1}', '${2}-09-${1}', '${2}-10-${1}', '${2}-11-${1}', '${2}-12-${1}'
);
$after = preg_replace($patterns, $replacements, $before);
return $after;
}
コレで良い感じ。
コレを WordPress の年月表記がある部分に挟み込んでやる。WordPress 管理画面 → 外観 → テーマエディター と進み、「テーマのための関数 (functions.php
)」を開いたら、ファイルの末尾に以下のようにして add_filter()
関数を突っ込んでやる。
// 関数定義をして、その関数をフィルタとして追加する書き方
function replace_month($html) { ... } // 前述の関数を定義
add_filter('get_archives_link', 'replace_month'); // 第2引数で関数名を指定する
// 第2引数に直接関数を書く書き方
add_filter('get_archives_link', function($html) { ... });
↑ get_archives_link
にフィルタを追加することで、サイドメニューの「月ごとのアーカイブリンク」の表記を変換できる。
add_filter('get_the_archive_title', function($html) {
if(strpos($html, 'Day:') === 0) {
return replace_month_date($html);
}
if(strpos($html, 'Month:') === 0) {
return replace_month($html);
}
return $html;
}
↑ コチラは「当日・当月・当年の記事一覧ページのタイトル」を変換するための関数定義。
add_filter()
関数で、ある関数の処理の後に独自の処理を追加でき、コレによってタイトルやメニュー項目の表記を変換できるというワケ。どこでどの関数が使われているかはテンプレート内を愚直に調べていって、手探りで実装している。コレをやってみると、WordPress 製のサイトの運用が苦しくなる理由が分かるわ…。綺麗に保つ方法を考え続けないといけないね。
とりあえず今回はやりたいことが出来たのでコレでおけ。