前提・実現したいこと
ワードプレスでは、タグ・アーカイブのページのデフォルトURLは、下記の通り。
[サイトURL]/tag/「タグのスラッグ」
即ち、URLにhttp://example.com/wp/?tag=タグ名
とクエリのパラメーターを附け足すと、強制的にhttp://example.com/wp/tag/タグ名
へと自動遷移されます。
ところで、記事にタグは複数附けられ、指定した複数のタグを併せ持つ記事をAND検索みたいに絞り込み表示できます。
Cf.WordPressで複数のタグが付けられた記事の一覧を表示する方法ってある?
この場合、URLにhttp://example.com/wp/?tag=タグ名A+タグ名B
と入力しても、自動的にはhttp://example.com/wp/tag/タグ名A+タグ名B
へとリダイレクトしてくれません。
しかしどちらも結果表示は同じものなのですから、URLも同じものに統一したい。これは、正規化URL(canonical URL)の問題に含まれるのかもしれません。
猶、できることならば、タグで絞り込んだ中から更にキーワード検索で絞り込みする場合のURLhttp://example.com/wp/?tag=タグ名A&s=キーワードB
乃至http://example.com/wp/tag/タグ名A?s=キーワードB
等も、パーマリンクに則ってhttp://example.com/wp/tag/タグ名A/search/キーワードB
へと遷移されることが、望ましい。
Cf.WordPressのサイト上で簡単に並び替え&絞り込みする方法
発生している問題
また、このタグ複数のクエリータグ名A+タグ名B
での絞り込み結果の表示では、ウェブページのタイトル(ブラウザーのタブに表示される題名)とページの表示タイトル(見出し、h1要素)は、下記の通りになります。
HTML
1<title>タグ名A - サイト名</title> 2…… 3<h1 class="page-title">タグ: タグ名A</h1>
これは「+」で附け足したタグ名Bが無視されてしまって単数タグの場合と変りがなく、紛れやすい。混同を防ぐには、複合したフィルタリングであることを明示すべきですから、
HTML
1<title>タグ: タグ名A+タグ名B - サイト名</title> 2…… 3<h1 class="page-title">タグ: タグ名A+タグ名B</h1>
と、指定したタグ複数を併記する表示に改める仕組みにしたい。
アーカイブ・ページのタイトルを変更する方法を検索しても、single_tag_title()
関数で接頭辞(prefix)の「タグ:」を削除する例ばかり出てきて、複数のタグ・スラッグを取得するやり方が見つけられません。
e.g.get_the_archive_title()で呼び出したタイトルから”アーカイブ:”、”カテゴリー:”、”タグ:”、”作者:”を消す方法
2019-02-28追記
既に消滅したサイトながらInternet Archiveに残存する「[覚書] 複数タグのアーカイブで、タグ情報一式を取得」を真似て、タイトル表示の問題は解決できました。下記コードをテーマのfunctions.phpに追加。
PHP
1function multiple_tags() { 2//複数タグのアーカイブでURLからスラッグを拾ってID・タグ名を取得。 3$tagVar = get_query_var('tag'); 4if ( !empty($tagVar) ) { 5 if ( strpos($tagVar, '+') || strpos($tagVar, ' ') ) 6 $separator = " + "; 7 else if ( strpos($tagVar, ',') ) 8 $separator = " , "; 9 $tagSlugs = $currentTerms = array(); 10 $tagSlugs = preg_split('(+|,| )', $tagVar); 11 foreach ($tagSlugs as $tagSlug) 12 $currentTerms[] = get_term_by('slug', $tagSlug, 'post_tag'); 13} 14//出力 15if ( !empty($currentTerms) ) { 16 $tagCount = count($currentTerms); 17 $i = 2; 18 foreach ($currentTerms as $currentTerm) { 19 $currentTagName .= $currentTerm->name; 20 if ( $i < $tagCount ) 21 $currentTagName .= ', '; 22 else if ( $i == $tagCount ) 23 $currentTagName .= $separator; 24 $i++; 25 } 26} 27return $currentTagName; 28} 29 30// titleタグ変更 Cf. https://teratail.com/questions/168613 31function change_document_title_parts( $title ) { 32if ( is_tag() ) { 33 $title['title'] = 'タグ: '.multiple_tags(); 34 } 35 return $title; 36} 37 38// アーカイブ・ページのタイトル(h1要素)変更 39add_filter( 'get_the_archive_title', function ($title) { 40 if ( is_tag() ) { 41 $title = sprintf( esc_html( 'タグ: %s' ), multiple_tags() ); 42 } 43 return $title; 44});
ただし、パン屑リストでの表示に猶も問題は残る。現在、プラグインBreadcrumb NavXTを使用(プラグインに用意されたアクション・フックを利用する改造法で、何とかできないか……?)。
試したこと
「WordPressでサイト内検索結果のURLを変更する方法」を参考にして、テーマのfunctions.phpに以下のコードを追記しました。
php
1function tag_url_customize() { 2 if ( is_tag() && ! empty( $_GET['tag'] ) ) { 3 wp_safe_redirect( home_url( '/tag/' ) . urlencode( get_query_var( 'tag' ) ) ); 4 exit(); 5 } 6} 7add_action( 'template_redirect', 'tag_url_customize' );
しかし、これでhttp://example.com/wp/?tag=タグ名A+タグ名B
とクエリーを入力すると、リダイレクト結果のURLはhttp://example.com/wp/tag/タグ名A%2Bタグ名B
となってしまって、「お探しのページが見つかりません。」と出ます。URL文字列で「+」が「%2B」にエンコードされた所為か、複数タグでのフィルタリングが無効になります。
また、タグで絞り込みした一覧を更にキーワード検索で絞り込んだ場合のURLhttp://example.com/wp/?tag=タグ名A&s=キーワードB
でも、結果は「ページが見つかりませんでした」になります。遷移後のURLからはなぜか&s=キーワードB
が脱落し、しかも、「タグ名A」を仮に日本語で"あ"とするとエンコードは"%E3%81%82"ですが、このエンコードした文字列中の「%」がさらに「%25」にエンコードされて"%25e3%2581%2582"となる始末。これがhttp://example.com/wp/tag/タグ名A?s=キーワードB
だったらまともに動作するので、どうも「tag」以外のパラメーターが&で附加されてゆくといけないみたいです。
エンコードが原因ならば、と上記コード三行目でurlencode()
を使用せずに
PHP
1wp_safe_redirect( home_url( '/tag/' ) . get_query_var( 'tag' ) );
とするのも試してみましたが、URLパラメーターが?tag=タグ名A+タグ名B
だと/tag/タグ名A+タグ名B
へのリダイレクトに成功するものの、タグだけでなくキイワード検索と組み合わせた?tag=タグ名A&s=キーワードB
では/tag/タグ名A
へと遷移してしまってやはり「&」以下のクエリー&s=キーワードB
が脱け落ちます。同様にhttp://example.com/wp/search/キーワードB?tag=タグ名A
でもリダイレクト先はhttp://example.com/wp/tag/タグ名A
となってしまって/search/キーワードB
が除去されるので、折角の複数パラメーターでのフィルタリング機能が空しくなります。
コード中のwp_safe_redirect
をwp_redirect
にしたりしても、駄目です。
複合条件での絞り込みでうまくゆかなくなるのは、「Wordpress検索結果のURLを変えたい」と類似です。そこでのコメントで質問者が「キーワードのみの検索」でなく「キーワード以外にパラメータを指定して検索をかける」と述べた箇所……。
または、「get_queried_objectがだめになるケース」で「タクソノミーアーカイブを、複数のタームでフィルターすると・・・、クエリーは動作するのですが、get_queired_objectは複数のタームが指定される事は考慮されていないので、おかしな値を返してきます」とあるのに、似るのかも……?
さて、どこを直せばうまくゆくのか。
或いは、別の解法があるのか($wp_rewriteを使った方法……?)。
御教示戴けると有り難く存じます。
補足情報(FW/ツールのバージョンなど)
Wordpress5.1–jaでtwentysixteenの子テーマを使用中です。
あなたの回答
tips
プレビュー