月別アーカイブは正常なのに、一部の年別アーカイブだけは表示されない。その原因は、名前の「競合」にありました。
ひさびさにわけのわからないやつが来ました。WordPressのアーカイブページで、月別(例:2021年5月)はふつうに月別アーカイブとして表示されるのに、年別(例:2021年)は表示されずに404エラーになるという、もはや怪現象ともいえる事態が発生してしまったのです。
さらに、この現象のなぞに拍車をかけたのは、それ(2021年)以前は、両方とも正常に表示されるというもので、ようするに、当ブログを開設してからの2017~2020年までは年別・月別ともに表示されるのに、2021年の年別アーカイブ「だけ」はなぜか表示されないのです。
呪われた2021年……。この問題を解決するのは、あまりにも意味がわからなすぎて、不可能なのではないかと思われました。
しかし、いちど着手したからには解決させなければ気がすまない私は、懸命な調査によって、ついにこの問題の解決方法にたどりつくことに成功! 無事にエラーを解除することができたので、今回は「一部の年別アーカイブのページだけがない」という問題の解決策についてお話しします。
年別アーカイブの一部だけが表示されない問題
たいへん失礼もいいところです。じつは以前からもこの問題が発生していたのには気づいていたのですが、もしかすると2022年になれば、なにごともなかったかのようにもどるかもしれない、などと安易に考え、これまでは「年別アーカイブ問題」を放置していました。
ところが、Googleのサーチコンソールで、この404エラー(Not Found)となっている2021年の年別アーカイブが「未登録扱い」となっていたことを知り、やはり問題の芽は早期につんでおかなければならないと感じた私は、この怪現象の調査を開始したのです。
原因の特定は、難航をきわめました。
3時間ほどネットでしらべていても、この問題の解決策をしめしたものは見あたらず、手がかりのようなものもあったことはあったものの、問題解決につながるものや、急所にせまるようなクリティカルなものまでは発見することができません。
やっぱり放置でもいいのでは……?
ほかにもやらなければならないことが山積みだった私にとっては、いってしまえば、こんなやってもやらなくてもいいようなことに、心血をそそいでいる時間はありませんでした。
なぜなら、これを見てくれる方はあまりいないだろうと思われるのはまだいいとしても、アーカイブは月別でこまかく見れるのがデフォルトとなっていて、しかもそのさきの年別アーカイブは、直接URLに年数を打ち込むなどしなければ見れないという、いわば「裏コマンド」的な方法をとらなければ、そこにたどりつくことはできなくなっているからです。
この3重の包囲網をかいくぐる猛者が、はたしてどれほどいるでしょうか? そう、私がやっているのは、ほんとうにどうでもいいような作業だったのです!
しかし、そうはいっても、ここでやめてしまえば、その3時間はなんだったのかという話にもなりますし、目の前で発生している不具合に対して、見て見ぬふりをすることもできません。
そこで私は、これまでいちども使ったことがなかった、契約しているレンタルサーバーの、サポートサービスを利用してみることにしたのです。
データ自体はデータベースに保管されているらしい
私は自力で問題を解決することをつねとしていますが、ときには、人の力を直接借りたっていいというものでしょう。
それにこの問題は、サーバーのことを聞かなければわからない部分もあるような気がしたので、私はレンタルサーバーの会社にコール!
残念ですが、WordPress自体の技術的な(複雑な)話になると……
サポートの担当者がいっしょにサイトを確認してくれたりもしたものの、やはりこの怪現象は一筋縄ではいきません。
年別のアーカイブがどこに保存されているのかを見られれば、なにかのヒントになるのではないかとも思ったのですが(いちおう「データベース」にあるらしい)、どうもそう簡単に見れるようなものでもなさそう。
問題は、振り出しにもどってしまいました。
WordPressのヘルプ(フォーラム)を見れば、なにかわかるかもしれません
なるほど、その手がまだ残されていたか。
サポートの指示にしたがい、この問題を解決すべく、私はWordPressのフォーラムサイトを目指しました。
まったく同じ症状で困っている人を発見
WordPressのフォーラムサイトは、利用者が問題の症状などを相談し、くわしい人がその疑問に答えてくれたりするサイトで、ここを見れば、問題解決の糸口がつかめることもあります。
電話を切ってからすぐにこれを確認していると、なんと、発見してしまいました。まったく同じ症状で困っている方が、2年前にもいたのです。
その方の症状は、2019年の年別アーカイブだけが表示されないというもので、やはり私と同じく、同年の月別アーカイブ(例:2019年5月)などは表示されるのに、年別となると表示されなくなってしまうと。
しかし、それに対する回答もクリティカルなものはなく、問題は未解決のまま該当のトピックは閉鎖。
「詰んだ」感がただよってくるのを、私は感じていました。
投稿のアーカイブを有効化すればいけるか?
ネットでさがしてもだめ、人に聞いてもだめ、フォーラムもだめ。しかし私はここにきて、ある重要なことに気づかされます。そもそもの話、思考が停止していたのではないか? ということです。
思えば、この問題が発生してからというもの、問題の解決策についてはひたすらしらべていたとはいえ、こちら(当ブログ)側に原因がある可能性については、徹底的な調査はおこなっていませんでした。
それだけしらべても解決策が出てこないということは、WordPressやテーマといった外的な要因ではなく、内的な要因、すなわち、私がなにかわけのわからないことをしたことによるものの可能性が、高くなってくるとも考えられます。
問題が発生したらまずは自分を疑え。
あせるあまり、きっと私は基本を忘れてしまっていたのでしょう。そこで、多少は確認してはいたのですが、問題の原因を特定するため、あらためて私は、徹底的な原因の究明に乗り出しました。
調査したものとその結果は、以下のとおりです。
- テーマを親テーマに変更(×)
- テーマ自体をべつのものに変更(×)
- プラグイン全停止(×)
- PHPを変更(×)
- WordPressをダウングレード(×)
- WordPressのパーマリンク設定を変更(△)
テーマの変更でだめなのであれば、2019~2020年のあいだにおこなわれたWordPressの更新によるものかと思いましたが、ダウングレードしてみると、原因はそれでもなく、なぞは深まるばかり。
しかし、そうなってくると、やはり当ブログの設定がおかしいのではないかとしぼりこめてくるわけで、パーマリンク(URL)設定をいじってみると、それらしきページが出現することを確認。
これにより、私は、パーマリンク設定で年別アーカイブが出力されていないのであれば、そのパーマリンク(https://〇〇〇.com/△△の△△部分が数字4桁で「2021」)を強制的に表示させれば問題が解決するのではないかという考えにいたり、以下のコードを「functions.php」に追加。
//アーカイブ2021表示
function post_has_archive( $args, $post_type ) {
if ( 'post' == $post_type ) {
$args['rewrite'] = true;
$args['has_archive'] = '2021'; //任意のスラッグ名
}
return $args;
}
add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );
WordPressは初期状態では、「投稿」のアーカイブは表示されないようになっているようだったので、末尾が「2021」というパーマリンクに、無効化された投稿を表示させることができれば、それは年別アーカイブになるのではないかと。
なお、それをしないと変更が反映されないとのことだったので、パーマリンク設定を空更新(なにもいじらずにそのまま変更を保存)してみます。
すると!
みごと404エラーが出ていたページにアーカイブが出現! これによってこの問題は、無事解決を迎えたかのように思われました。
パーマリンク(URL)の競合に原因が?
さて、問題も解決したことだし、ことの顛末をまとめておこうか。私はうきうきしながらこの怪現象を解決へとみちびいた記事を作成することにし、くだんのページを再度確認します。
……が、よく見てみると、アーカイブはアーカイブだけれども、それは「投稿」アーカイブであって「年別」アーカイブではなく、しかも投稿のアーカイブだったので、そこには全記事が表示されていたのです。
もうこれでいいですか? いちおう2021年の記事が表示されているわけだし……。
あまえた考えが頭をよぎりますが、やはり、そんな中途半端な記事を書くわけにはいきません。私はまた原因の特定作業をせざるをえなくなり、この問題の調査は、苦悶の2日目に突入します。
ところが、最初からネットをふくめた調査をやり直していると、どうやらWordPressは、パーマリンク(URL)のスラッグ部分(末尾)がほかのものと競合する、つまり数字4桁の同じものがほかにもあると、年別アーカイブだけ表示されなくなってしまうケースがあるらしく、ここにこそ原因があるのではないかと思われました。
2021、2021、2021……あれか……。
じつは、本来は検索結果に残らないような記事は書かないことにしているのですが、たまにはいいかということで、自身のおきてをやぶって書いた記事があったのです。そう、「新年あけましておめでとうございます2021」の記事です。
その記事のURLは「https://〇〇〇.com/△△△-2021」。この末尾こそが、「競合」を引き起こしていたということなのでしょうか!?
さっそく私はこの記事をいちどゴミ箱にぶち込み、年別アーカイブを確認! ただ、冷静に考えて、「△△△-2021」と、そのままの「2021」が競合するはずもなく、この案もあえなく撃沈。
さらにいうと、もうひとつ「△△△-2020」という、これもわりとどうでもいい記事があったので、問題はこれではないことが確定してしまいました。
真の原因はメディアファイル(画像)の名前にあった
あとすこし、あとほんの数センチで答えに手が届きそうな気がする。けれど、その数センチがあまりにも遠い……。
私は救いを求めてふたたびWordPressのフォーラムへ。と、そこで、スラッグに関する問題の解決策で、年別アーカイブを完全に除去することができるという、以下のコードが紹介されていました。
function remove_year_rewrite_rules( $date_rewrite ) {
if ( $date_rewrite ) {
foreach ( $date_rewrite as $key => $query ) {
if ( ! strpos( $query, '&monthnum=' ) ) {
unset( $date_rewrite[$key] );
}
}
}
return $date_rewrite;
}
add_filter( 'date_rewrite_rules', 'remove_year_rewrite_rules' );
これでいちどすべての年別アーカイブを非表示にし、再度表示させてみれば、もしかすると直ったりするなんてことは……。
…………!? なんだこれは?
2020年の年別アーカイブは非表示となっていましたが、つづけて2021年の年別アーカイブを表示させると、例の記事のサムネイル画像として設定していたメディアファイルが出現。
まさか、そんなばかな、こいつが、こいつこそが……
私はその場でおたけびをあげました。
原因は、「2021」という名前の画像ファイルにあり、これが存在していたことで、「2021」が末尾の年別アーカイブだけが表示されず、「2021/05」といった月別アーカイブは正常に表示され、かつ、その他の年別アーカイブも正常に表示されるという現象が起きていたのです。
私が今後、あけましておめでとうございます記事を書くことは、もしかするともうないかもしれません。
(参考:WP(ワードプレス)の投稿アーカイブを任意のURLで出力する/WordPress カスタム投稿タイプの年別アーカイブが404になる/WordPress.org‐記事が見つかりませんでした)
今回のまとめ
・競合の原因はメディアファイルの名前にあり
・数字4桁の名前はすべてにおいて避けたほうがよさそう
今回の問題は翌年まで待っていても直らないものだったので、かなりきびしい作業となりましたが、さきに始末しておいてよかったように思います。
まさかの同名の画像ファイルです。通常であればそのような記事も、画像の名前のつけ方もしない、つまりこれは、本来はありえないことだったので、やはり2021年は呪われているといえるのかもしれません。
同じようなことでお困りの方は、まずは名前の競合を疑ってみると、解決する場合もあるように思われます。名前のつけ方にも注意しましょう。
コメント(確認後に反映/少々お時間をいただきます)