年月日パーマリンクを投稿として表示する話

WordPressのパーマリンクに年月日が含まれているとarchive扱いとされる。
気付いた時に応急処置として実施したのはarchive.phpの先頭にこのように追加した。

<?php
	$count = 0 < get_query_var('posts_per_page') ? $wp_query->found_posts : $wp_query->post_count; 
	if($count == 1) : 
		get_template_part('single');
	else:
		get_header();
?>

省略したけど、archive.phpの最終行にちゃんとend if;を書くんやで。

これは何がいけないかというと、この方法で表示した記事が「投稿」ではなく「アーカイブ」のままになることだ。
投稿したのに「投稿」ではないとはこれいかに。

「投稿」ではなく「アーカイブ」となることで、Wordpressで扱える関数が変わる。
is_singleで扱うことはできず、is_archiveで扱うことになる。
これでは1件の投稿を指定したいのか何らかのアーカイブを指定したいのかと区別がつかなくなってしまう。
(…色々こねくり回せば区別はつくが…スマートじゃないよねって話)

というわけで、archive.phpは元に戻してfunction.phpへ以下のように追加した。

/** パーマリンクにyyyymmddhhmmが含まれた場合は投稿ページ扱いにする */
function hm_permalink($wp_query) {
	$q = (object)$wp_query->query_vars;
	// 年月日+時分まで含まれているパーマリンク
	if(!empty($q->year) && !empty($q->monthnum) && !empty($q->day) && !empty($q->hour)&& !empty($q->minute)) {
		// アーカイブから投稿へ変更する
		$wp_query->is_single = true;
		$wp_query->is_singular = true;
		$wp_query->is_archive = false;
	}
}
add_action('parse_query', 'hm_permalink');

前提として投稿とはそのパーマリンクで1件に絞られるべきである。
でなければ、1件の記事として区別ができないからだ。
そのためにWordpressは投稿IDを設定しろとかなんとか言ってくる。
「年」「月」「日」だけでは同じ日に2件以上投稿すると区別がつかないので、今回は「時」「分」までをパーマリンクに設定した場合とした。

	if(!empty($q->year) &&
	   !empty($q->monthnum) &&
	   !empty($q->day) &&
	   !empty($q->hour) &&
	   !empty($q->minute)) {

ここまでパーマリンクに設定した時だけ「投稿」と設定することにした。

アーカイブから投稿へ変更するのは簡単。

		$wp_query->is_single = true;
		$wp_query->is_singular = true;
		$wp_query->is_archive = false;

wp_queryの中のis_singleをtrueに、is_archiveをfalseに設定する。
「投稿であってアーカイブでない」という状態をWordpress的に認識するのはここだ。
is_singularもtrueに変更しているが、これは通常「投稿または固定ページ」の場合にtrueを示す。「何かしら記事の時」にis_singleとis_postがtrueと書かずともis_singularがtrueだと指定するだけでよい。
っていうか、これOGP設定するのに使ってるからOGP設定ずっと狂っとんのよ。

最後にこれをフックする。

add_action('parse_query', 'hm_permalink');

フックする場所はparse_query。is_XXXを設定している箇所となる。
以下の記事によると、parse_queryですべてのis_変数を設定して「このページが何なのか」を特定している…とのこと。

え。ごめん、CODEXちょっと何言ってんのか分からなかったんだけど…と思ったら2020年の記事だった。CODEXって日本語版なくなってから読む気失せたんよね。
どうして2020年の私はこんな応急処置をしたのか(仕事中だからだよ。逆に仕事中に何してんだよ)。

ともあれ、これで健全に「投稿のつもり」が「投稿である」とWordpressに認識されることとなった。
Wordpress側としては「投稿に日付付けてんじゃねぇよ」ということなのだろうが…日記だからつけるやろがい。というのはもしかして日本人特有の何かなのかもしれない。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です