WordPress

カスタム投稿タイプのアーカイブテンプレ(archive-$posttype.php)が当たらない場合

過去のトピックス一覧を専用のアーカイブページで表示したい、という簡単そうな問題で苦戦しました。企業HP制作とかで以前に何回もやっているような気がするのですが、今回なぜかうまくいきませんでした。

すでに解決はしましたが原因は不明です。なので明確な答えというより問題自体がだれかの参考になればという記事です。

カスタム投稿のアーカイブテンプレートが当たらない

カスタム投稿タイプのアーカイブページ(テンプレートはarchive-hoge.php)を呼び出そうとしても通常のアーカイブページ(archive.php)が選択されてしまうという問題です。

試しにarchive-hoge.phpを残してarchive.phpファイルを消すと、トップページ(front-page.phpもhome.phpもまだ置いていなかったのでindex.php)になってしまいます。これは階層上当然です。でもとにかくカスタム投稿用のアーカイブテンプレートを置いているのに適用されないという状態。

以下index.php(トップページ)でトピックス一覧を取得しようとしていた部分。

<div><a href="<?php echo get_post_type_archive_link( 'topics' ); ?>">>過去のトピックス一覧</a></div>

get_post_type_archive_linkでカスタム投稿タイプを指定していますが、archive-topics.phpが選ばれない。

<?php $post_url = get_post_type_archive_link('topics'); ?>
     <div><a href="<?php echo $post_url; ?>">>過去のトピックス一覧</a></div>

などもだめ。

この時点でfunctions.phpの当該カスタム投稿のhas_archiveはtrue。

'has_archive' => 'true',

 

パーマリンクの設定が問題だった?

一瞬解決した方法は、単に管理画面の設定>パーマリンクで「変更を保存」をクリック(いったん「基本」にしたあと)。いろいろ書き方を変えてみたり、迷走したりした後思い出しました。

このパーマリンクの「変更を保存」ボタンを押すで解決した問題は以前何度もあったにも関わらずまた思い出せなくて悔しい。

なにはともあれ無事解決!と思いきやパーマリンクを「基本」から「カスタム構造」に戻したり他のものを選ぶとやはりarchive-hoge.phpが効かなくなるという問題が発生。全然解決していなかった…

パーマリンクは「基本」でないと効かないのか?…それは困る。

でさらにいろいろ調べたりしていて結局リファレンスを読み直したら…

has_archiveを勘違いしていた?

has_archiveについて

has_archive真偽値|文字列) (オプション) この投稿タイプのアーカイブを有効にする。デフォルトでは、アーカイブのスラッグとして $post_type が使われる。初期値: false

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type

この説明の前半しか意識していなくて、trueにしないとそのカスタム投稿のアーカイブ機能がすべて使えないという風に理解してしまい、今回trueをわざわざ書いていました。

ただ後半の「デフォルトでは、アーカイブのスラッグとして $post_type が使われる。」

ん?あーfalseでもアーカイブ使えるってことか(完全に勘違いしてた)、そしてむしろデフォルトでいいのかー? trueの意味はアーカイブ(archive.php)に含めるっていう意味だったのか?

そんなこんなでhas_archiveをfalseにしたら解決しました。ちゃんとどのパーマリンクでもarchive-hoge.phpが当たります。

反省点としてやっぱりリファレンスにしっかり当たったほうがいい。あと以前やっていたときに難なくできていたのは単にhas_archiveを書いていなかったからでした。今回以前試作していた未完成テーマのコードからコピペしていてなにも考えていませんでした。これも反省、ちゃんと理解してやろう。

で無事原因もわかってすっきり…と思っていたら…

設定を変えてさらに混乱。仮の結論

ただ翌日まだ釈然としなくて、また’has_archive’ => ‘true’に戻したりしていてさらに混乱しました。trueでもちゃんとarchive-$posttypeが当たる。

逆にfalseにしてもパーマリンクが基本じゃないと当たらない。もうよくわかりません。

で、一応の結論として最終的にfunctions.phpの書き換えと管理画面パーマリンクの変更の保存の両方がかみ合っていない(自分の認識と内部で持っている情報が違う)タイミングでブラウザを更新していたのではないか、という風になりました。あるいはいったんfalseにしてtrueに書き換えることでプロパティを再認識させる必要があるとか。

今後の解決法してはhas_archiveと変更を保存ボタンの両方をチマチマいじることにします。

現状最終的にはパーマリンクは投稿名(つまり基本以外)で’has_archive’ => ‘true’で機能しています。

アーカイブ用の固定ページを作る方法もある

そういえばアーカイブ用の固定ページを作る方法もあります。自分でページを用意してしまえばいかようにも設定を作りこめるので、こちらを検討したほうがはやい場合も多いです。

https://qiita.com/ryujisanagi/items/cd29b52fb9b45c1dadec

https://ja.wordpress.org/support/topic/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7%E3%81%ABpage-%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B0-php%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%81%84/

 

なお固定ページをアーカイブにする場合もやはり

‘has_archive’ => ‘false’,

にしないとスラッグのバッティングになるようです。

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type

まとめ

カスタム投稿タイプのアーカイブテンプレ(archive-$posttype)が選択されない問題。

解決の選択肢

  1. ‘has_archive’ => ‘true’,だったらfalseにしてみたり戻したりする(変更を保存)
  2. has_archiveはどちらでも、パーマリンク設定>基本にすれば効く
  3. アーカイブ用の固定ページを作る

COMMENT

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