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

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

ただいまの
回答率

87.37%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,017

score 29

前提・実現したいこと

ワードプレスでは、タグ・アーカイブのページのデフォルト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要素)は、下記の通りになります。

<title>タグ名A - サイト名</title>
……
<h1 class="page-title">タグ: タグ名A</h1>


これは「+」で附け足したタグ名Bが無視されてしまって単数タグの場合と変りがなく、紛れやすい。混同を防ぐには、複合したフィルタリングであることを明示すべきですから、

<title>タグ: タグ名A+タグ名B - サイト名</title>
……
<h1 class="page-title">タグ: タグ名A+タグ名B</h1>


と、指定したタグ複数を併記する表示に改める仕組みにしたい。
アーカイブ・ページのタイトルを変更する方法を検索しても、single_tag_title()関数で接頭辞(prefix)の「タグ:」を削除する例ばかり出てきて、複数のタグ・スラッグを取得するやり方が見つけられません。
e.g.get_the_archive_title()で呼び出したタイトルから”アーカイブ:”、”カテゴリー:”、”タグ:”、”作者:”を消す方法
2019-02-28追記
既に消滅したサイトながらInternet Archiveに残存する「[覚書] 複数タグのアーカイブで、タグ情報一式を取得」を真似て、タイトル表示の問題は解決できました。下記コードをテーマのfunctions.phpに追加。

function multiple_tags() {
//複数タグのアーカイブでURLからスラッグを拾ってID・タグ名を取得。
$tagVar = get_query_var('tag');
if ( !empty($tagVar) ) {
    if ( strpos($tagVar, '+') || strpos($tagVar, ' ') )
        $separator = " + ";
    else if ( strpos($tagVar, ',') )
        $separator = " , ";
    $tagSlugs = $currentTerms = array();
    $tagSlugs = preg_split('(\+|,| )', $tagVar);
    foreach ($tagSlugs as $tagSlug)
        $currentTerms[] = get_term_by('slug', $tagSlug, 'post_tag');
}
//出力
if ( !empty($currentTerms) ) {
    $tagCount = count($currentTerms);
    $i = 2;
    foreach ($currentTerms as $currentTerm) {
        $currentTagName .= $currentTerm->name;
        if ( $i < $tagCount )
            $currentTagName .= ', ';
        else if ( $i == $tagCount )
            $currentTagName .= $separator;
        $i++;
    }
}
return $currentTagName;
}

// titleタグ変更 Cf. https://teratail.com/questions/168613
function change_document_title_parts( $title ) {
if ( is_tag() ) {
    $title['title'] = 'タグ: '.multiple_tags();
    }
    return $title;
}

// アーカイブ・ページのタイトル(h1要素)変更
add_filter( 'get_the_archive_title', function ($title) {
    if ( is_tag() ) {
        $title = sprintf( esc_html( 'タグ: %s' ), multiple_tags() );
    }
    return $title;
});


ただし、パン屑リストでの表示に猶も問題は残る。現在、プラグインBreadcrumb NavXTを使用(プラグインに用意されたアクション・フックを利用する改造法で、何とかできないか……?)。

試したこと

WordPressでサイト内検索結果のURLを変更する方法」を参考にして、テーマのfunctions.phpに以下のコードを追記しました。

function tag_url_customize() {
    if ( is_tag() && ! empty( $_GET['tag'] ) ) {
        wp_safe_redirect( home_url( '/tag/' ) . urlencode( get_query_var( 'tag' ) ) );
        exit();
    }
}
add_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()を使用せずに

wp_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の子テーマを使用中です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

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