質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

937閲覧

複数タグ(及び複数クエリー・パラメーター)で絞り込みした際のタグ・アーカイブ・ページのURLをパーマリンク(/tag/)に統一し、タイトル表示(パン屑リスト含む)でもタグ複数の併記に変更したい。

M.Y.

総合スコア29

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/02/24 06:43

編集2019/03/04 22:20

前提・実現したいこと

 ワードプレスでは、タグ・アーカイブのページのデフォルト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_redirectwp_redirectにしたりしても、駄目です。

複合条件での絞り込みでうまくゆかなくなるのは、「Wordpress検索結果のURLを変えたい」と類似です。そこでのコメントで質問者が「キーワードのみの検索」でなく「キーワード以外にパラメータを指定して検索をかける」と述べた箇所……。
または、「get_queried_objectがだめになるケース」で「タクソノミーアーカイブを、複数のタームでフィルターすると・・・、クエリーは動作するのですが、get_queired_objectは複数のタームが指定される事は考慮されていないので、おかしな値を返してきます」とあるのに、似るのかも……?

さて、どこを直せばうまくゆくのか。
或いは、別の解法があるのか($wp_rewriteを使った方法……?)。
御教示戴けると有り難く存じます。

補足情報(FW/ツールのバージョンなど)

Wordpress5.1–jaでtwentysixteenの子テーマを使用中です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問