まず始めに事前知識として条件分岐タグをついて説明
WordPressには条件分岐タグという仕組みがあり。それによって自分が今どの種類のページにいるかを調べることが出来ます。条件分岐タグには以下のようなものがあります。
- is_home() … TOPページにいる場合
- is_tag() … タグページにいる場合
- is_category() … カテゴリページにいる場合
- is_archive() … アーカイブページにいる場合
- is_single() … 個別記事ページにいる場合
WordPresssはこれらの判定を元にページを表示させる為に必要なテンプレート(phpファイル)を選んでいるわけです。
MovableTypeからWordPressへ移行、移行後も同じパーマリンクを使えるようカスタムパーマリンクを設定することに
私はWordPressに移行する前までMovableTypeを使用していたのですが、以下のようなパーマリンク形式で運用していました。
https://wordpress.ks-product.com/2013/11/30/201311301230.html
WordPressでカスタムパーマリンクを設定するのは難なく出来たのですが問題が・・・。
※カスタムパーマリンクには任意の文字列の他に構造タグも利用することが出来ます。
カスタムパーマリンクで日付を使った形式にすると条件分岐タグに誤作動が起こる!?
上記までの工程で通常は移行完了するのですが問題が発生!
リンク切れこそないものの、なにやらテンプレート表示がおかしい。
色々と調べてみると個別記事ページがアーカイブページとして認識されていました。
is_single(); //true is_archive(); //false
と表示されるべきところが
is_single(); //false is_archive(); //true
と表示されていました。
一体何故!?MovableTypeでは正常に動作していたのに!?
原因はWordPressの親切設計にありました。
先日、パーマリンクを日付形式から日本語形式に変更(SEOに強い説あり)したので、今更のタイミングでの原因判明となりましたが、先述の
https://wordpress.ks-product.com/年/月/日/年月日時分.html
では「分」までの記述なので、1分間に複数回投稿された場合パーマリンクが重複する可能性がある為、アーカイブとして認識されていたようです。
個別記事ページとして認識させるには
https://wordpress.ks-product.com/年/月/日/年月日時分秒.html
と「秒」まで記述することで解決します。
1秒に複数回投稿されたらどうなるんだって疑問はありますが、そのへんはWordPressが上手くやってくれるんでしょう。
「分」までの記述で、個別記事として認識させる方法
不具合の原因は分かりましたが、MovableTypeで使用していたパーマリンクをWordPressでもそのまま使えるようにするというのが目的でしたので、解決になっていません。
コア部分の問題なので改変するのも無謀なので、functions.phpに下記のような簡単な判定関数を記述しました。
function ex_is_single(){ global $posts; return strstr($_SERVER['REQUEST_URI'],".html") && count($posts); }
以前、MovableTypeで運用していた時は個別記事以外は拡張子無しでアクセス可能な形式だった為、「.html」がURIに含まれているかどうかで個別記事かどうかを判定しています。
今回のように拡張子に明確な違いがあれば良いですが、もし無い場合は数字の桁数とスラッシュの位置なんかで判定すれば問題ないかと思います(規模が大きいサイトだと危険かもしれませんが)。
また、プラグインでis_single()を使っている場合は当然動作しないので、is_single()の箇所に上記のような独自判定の関数を追記してOR条件で判断させれば上手くいくかと思います。
今回のように別のシステムから移行するでもない限り、カスタムパーマリンクは使用せずあらかじめ用意されたものを使ったほうが良いというのが個人的な意見です。
コメント