日付ベースのパーマリンクで秒を含めない場合のカスタマイズあれこれ

query.phpはWP4.7からclass-wp-query.phpに変更になりました。
編集箇所は803行目付近874行目辺り(WP6.3)です。
修正コードの変更は今の所ありません。


2023/08/13:超今更だけど、いつの間にかfunctions.phpの修正は要らなくなってたっぽい…

MT時代のFOX通信の記事URLである日付ベースのYYYY/MM/dd-hhmm.php を、 WordPressでも踏襲させるための覚書。 WordPressのデフォルトだと日付ベースにしたい場合2点困った事があり。

  1. YYYY/MM/dd-hhmmss.php のように秒まで含まないと個別記事として認識されない
  2. 個別記事として認識されないので、single.phpが適用されず、wp_title()での記事タイトル取得ができない

一番単純な対処法はURLに秒まで含める事なんだけど、困ったことにMT時代にFOX通信の記事同士であれこれリンク貼ってるので、本文内に書かれたURLをいちいち秒アリに変更するのがひたすら面倒だったり…orz ということでアレコレ調べた結果、functions.php及びwp_includes/query.phpを修正することで、上記2点を解消するに至りました。

以下、query.phpのコード以外は不要となりました。
尚、現在実際に編集するのはclass-wp-query.phpです。

まずfunctions.phpのカスタマイズ。 適当なところに以下のコードを加えます。

// 日付ベースのURLを使えるようにする
add_action('parse_query', 'date_base_permalink');
function date_base_permalink($wp_query)
{
$qv = $wp_query->query_vars;
// 年・月・日・時・分がURLに含まれていたら
if (!empty($qv['year']) && !empty($qv['monthnum']) && !empty($qv['day']) && !empty($qv['minute']) || !empty($qv['hour'])) {
// シングルページを有効にして
$wp_query->is_single = true;
// アーカイブページを無効にする
$wp_query->is_archive = false;

参考にしたのはこちら。

WordPressのパーマリンクを日付ベースにする方法 – Rewish.
WordPressのパーマリンクを/YYYY/MM/DD/hhmmの様な日付ベースにしようとすると、日付アーカイブになってしまい記事単体のページとして認識されません。 秒まで設定(/YYYY/MM/DD/hhmmssなど)すれば記事単体のページとして認識されますが、微妙に長くなってしまうので見た目もちょっと・・・ですよね。 と言う訳で今回は、半ば強引にパーマリンクを日付ベースにしてみたいと思います。

但し、FOX通信で使うにあたって、上記サイトのコードから若干変更。 具体的には8行目で、hourをand条件ではなくor条件にしています。

元サイトのコード

&& !empty($qv['minute']) && !empty($qv['hour'])) {

FOX通信のコード

&& !empty($qv['minute']) || !empty($qv['hour'])) {

何故にor条件にしたかというと、0時台のエントリで問題が発生したから。

https://iranatilark.com/archives/2013/01/05-0015.php

みたいにhour部分が00になってるヤツがhour=empty扱いになって、
月別アーカイブとして認識されちゃったという、、、
結構過去エントリでも0時台の更新やってるし、これは非常に困るので、
ものは試しにhour部分をor条件にしたら無事動いたので、当面これで様子見。

これでパーマリンクは動作してくれたんだけど、
このままでは個別記事用のテンプレートsingle.phpが適用されてくれないのが、
テンプレートが細分化されてるWPの厄介なところ。。。

何で気がついたかって言うと、タイトルバーに記事タイトルが出なかったから。
header.php見ても特に変なところがなかったから「wp_title 日付ベース」で検索したら、
こんなのをWPのフォーラムで発見。

WordPress › フォーラム » 個別ページで、titleが「日付+ブログタイトル」になる.
パーマリンクを日付と日時ベースにする場合、%year%, %monthnum%, %day%, %hour%, %minute%, %second% の *すべて* が含まれない限り、単体記事としてみなされません (is_single() が true にならない)。 したがって、このパーマリンク設定では、単体記事を表示させても WordPress 自体は単体記事として扱わない (is_single() が false になる) ため、日時アーカイブと判断され、そういうテンプレートが適用されます。

こちらには対処法もありました。

 WordPress › フォーラム » 個別ページで、titleが「日付+ブログタイトル」になる.
「秒だけが異なる記事が存在する可能性がゼロ」ならば、wp-includes/query.php の 545 行付近を以下のように修正してみてください (second のチェックを外す)。

ということで具体的なコードはこちら。

変更前ソース

} elseif ( ('' !== $qv['hour']) && ('' !== $qv['minute']) && ('' !== $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day']) ) {

変更後ソース

} elseif ( ( '' !== $qv['hour'] ) && ( '' !== $qv['minute'] ) && ( '' != $qv['year'] ) && ( '' != $qv['monthnum'] ) && ( '' != $qv['day'] ) ) {

このカスタマイズの最大の問題点は、
query.phpがWordPressのコアファイルだってーこと(^^;)
本当はなるべくやりたくなかったんだけど、これやらないと個別投稿の記事タイトルをwp_titleが拾ってくれないからさぁ…orz

コアファイルのカスタマイズはバージョンアップの時に上書きされちゃうから、
バックアップ取って書き戻すか、バージョンアップ後のquery.phpのコードを修正するか、
どっちにせよまた同じ事やらないといけないからめんどっちいんだよねぇ。。。

時々MTに戻りたくなるけど、プラグインとかの自由度が高い(そんでもってほぼ無料で行ける)のがWPの魅力なのも確か。
MT、すっかり商売に走ってるんだもん。。。
#バージョン3.2位の頃は良かったなぁ…(遠い目)

ということで、もう少しWordPress、精進しますです(^^;)

関連記事