WordPress のアーカイブページで複数のタグ指定時にアーカイブタイトルが単数になる問題を解決

WordPress にはタグやカテゴリー、月ごとに記事一覧を表示してくれるアーカイブページがある。パーマリンクの設定がデフォルトの場合、タグだと http://{サイトURL}/?tag={タグスラッグ} 、投稿名の場合、 http://{サイトURL}/tag/{タグスラッグ}/ といった感じのURLになる。でタグやカテゴリーは + オペレーターを使用して複数のワードを指定できる。例えば、wordpressgcp 両方のタグを持つ記事を列挙したい場合、http://{サイトURL}/tag/wordpress+gcp としてやれば良い。しかし、この時に、アーカイブのタイトルが最初のワードのみになってしまうという問題がある。これを解決する方法を見つけたので記しておく。

複数タグを指定してるのにタイトルは単数

実際このサイトのトップメニューは

  • WordPress -> 初級
  • WordPress -> 中級
  • WordPress -> 上級

というサブメニューを作っているが、これも、http://{サイトURL}/tag/wordpress+初級 といった具合にアーカイブページにリンクさせてある。で、その時にページタイトルがいつも “WordPress” だけなので、これを “WordPress + 初級” にしたい。なんとかならないのかなあ、と思い修正方法を調べた。

あいにく、Web 検索では解決方法が見つからず、自分でコードを書くことになった。

get_the_archive_title フィルターフック

このアーカイブページの表示を扱うのは、テンプレートファイルだと archive.php に該当する。そして、the_archive_title() が使用されている。この関数を調べると、get_the_archive_title というフィルターフックがあるのが分かる。これを使って出力結果を変更してやれば良い。

コード

以下のコードをテーマの funcitons.php に挿入する。

ざっくり何をしてるのかというと、$GLOBALS[ 'wp_query' ]->tax_query->queried_terms の中にDBクエリに使われたタクソノミーのターム(キーワード)が入っているので、それが複数の場合、それらからタームの名称を抜き出して、「分類名: ターム」 から 「分類名:ターム1 + ターム2」という表記に置換するというもの。

結果

これで、複数のタグを指定した時にきちんとその複数のタグが表示される。

理論上、タグ (post_tag) 以外のカスタムタクソノミーにも対応してるはずだけど、きちんと検証はしてない。ちなみに、ビルトインのカテゴリー category タクソノミーは、複数のタームでクエリがかけられていても前述の $GLOBALS[ 'wp_query' ]->tax_query->queried_terms には最初のターム以外は切り捨てて一つだけしか格納してくれないみたい。これはバグっぽいけど意図されてるかもしれないし深くは掘って見てない。

Leave a Reply

Your email address will not be published. Required fields are marked *