PHP (WordPress) で英語表記の月日表示を置換する

WordPress をイジっていて、英語表記で「December 2021」とか「November 18, 2021」といった文字列の表記を YYYY-MMYYYY-MM-DD 表記に変換したいと思った。

調べたところ、preg_replace() 関数は patternreplacement に配列を取れることが分かった。

そこで、以下のような関数を作ってみた。

// 「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 製のサイトの運用が苦しくなる理由が分かるわ…。綺麗に保つ方法を考え続けないといけないね。

とりあえず今回はやりたいことが出来たのでコレでおけ。