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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

2回答

7523閲覧

wordpressで複数のタクソノミーを組み合わせて出力したい

misato_3310

総合スコア14

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/04/02 04:06

編集2018/04/02 16:48

前提・実現したいこと

現在、WPで「都道府県」「市区町村」「町名・大字」「丁目・字」の4つの
カスタムタクソノミーを作成しました(親子関係ではありません)。

archive-カスタム投稿名.phpに
例)
東京都(10)
L新宿区(5)――北新宿1丁目(5)
L中野区(5)――野方2丁目(5)

のような表示でそれぞれに該当ページへのリンクをつけたいと思っています。

例でいうと
「東京都」というターム名を表示し、「東京都」に属する記事が持つ「新宿区」というターム名を表示し、
「東京都」と「新宿区」に属する記事が持つ「北新宿」というターム名を表示し、
「東京都」と「新宿区」と「北新宿」に属する記事が持つ「1丁目」というターム名を表示したい、ということなのです。

上記の場合、北新宿と野方は「町名・大字」、1丁目と2丁目は「丁目・字」と
別々のタクソノミーとして登録されています。

また、投稿者がWPやパソコンに疎いクライアントのため、
タームの登録時に親カテゴリーを選んだりするのは難しい、という判断で
すべてバラバラに作り、足りなければ投稿画面から追加してもらう、という形をとっています。

なので、親子関係で登録するのは難しく、
またこちらで親子関係で作っておくのも難しいという状況です。

発生している問題

リンクのURL自体は親子関係でない為、パラメーターを渡し表示する。というのは分かっているのですが、
そもそもの組み合わせての表示がうまくいきません。

実装の雰囲気としてはこのページ(複数タクソノミーで絞り込めるアーカイブページを作成する。)が
一番近いのですが、このままやると、それぞれのタクソノミーがばらばらで表示されてしまい、
たとえば1丁目を押すと、全ての市区町村の1丁目の一覧になってしまい、
目的通りのアーカイブができないのです。

該当のソースコード

php

1<div class="shozaichi"> 2 3<table> 4<?php 5 $this_url = get_post_type_archive_link( 'assessment' ); 6 $tax1 = 'address01'; 7 $tax2 = 'address02'; 8 $tax3 = 'address03'; 9 $tax4 = 'address04'; 10 if ( isset( $_GET[$tax1] ) ) $tax1_get = $_GET[$tax1]; else $tax1_get = ''; //URLパラメータを取得 11 if ( isset( $_GET[$tax2] ) ) $tax2_get = $_GET[$tax2]; else $tax2_get = ''; //URLパラメータを取得 12 if ( isset( $_GET[$tax3] ) ) $tax3_get = $_GET[$tax3]; else $tax3_get = ''; //URLパラメータを取得 13 if ( isset( $_GET[$tax4] ) ) $tax4_get = $_GET[$tax4]; else $tax4_get = ''; //URLパラメータを取得 14 15 $tax1_terms = get_terms( $tax1, '&hide_empty=true' ); 16 if ( $tax1_terms ){ 17 $current = ''; 18 if ( $tax1_get == '' ) $current = 'current'; 19 20 foreach( $tax1_terms as $tax1_term ){ 21 $current = ''; 22 if ( $tax1_get == $tax1_term->slug ) $current = 'current'; 23 $tax1_term_items .= '<p><a href="'.$this_url.'?'.$tax1.'='.$tax1_term->slug.'" class="'.$current.'">' .esc_html( $tax1_term->name ). '</a></p>'; 24 } 25 } 26 $tax1_term_items = '<td id="tax1">' . $tax1_term_items. '</td>'; 27 echo $tax1_term_items; 28 29 30 $tax2_terms = get_terms( $tax2, '&hide_empty=true' ); 31 if ( $tax2_terms ){ 32 $current = ''; 33 34 if ( $tax2_get == '' ) $current = 'current'; 35 36 foreach( $tax2_terms as $tax2_term ){ 37 $current = ''; 38 if ( $tax2_get == $tax2_term->slug ) $current = 'current'; 39 $tax2_term_items .= '<p><a href="'.$this_url.'?'.$tax1.'='.$tax1_get.'&'.$tax2.'='.$tax2_term->slug.'" class="'.$current.'">' .esc_html( $tax2_term->name ). '</a></p>'; 40 } 41 } 42 $tax2_term_items = '<td id="tax2">' . $tax2_term_items. '</td>' ; 43 echo $tax2_term_items; 44 45 46 $tax3_terms = get_terms( $tax3, '&hide_empty=true' ); 47 if ( $tax3_terms ){ 48 $current = ''; 49 50 if ( $tax3_get == '' ) $current = 'current'; 51 52 foreach( $tax3_terms as $tax3_term ){ 53 $current = ''; 54 if ( $tax3_get == $tax3_term->slug ) $current = 'current'; 55 $tax3_term_items .= '<p><a href="'.$this_url.'?'.$tax1.'='.$tax1_get.'&'.$tax2.'='.$tax2_get.'&'.$tax3.'='.$tax3_term->slug.'" class="'.$current.'">' .esc_html( $tax3_term->name ). '</a></p>'; 56 } 57 } 58 $tax3_term_items = '<td id="tax3">' . $tax3_term_items. '</td>' ; 59 echo $tax3_term_items; 60 61 62 $tax4_terms = get_terms( $tax4, '&hide_empty=true' ); 63 if ( $tax4_terms ){ 64 $current = ''; 65 66 if ( $tax4_get == '' ) $current = 'current'; 67 68 foreach( $tax4_terms as $tax4_term ){ 69 $current = ''; 70 if ( $tax4_get == $tax4_term->slug ) $current = 'current'; 71 $tax4_term_items .= '<p><a href="'.$this_url.'?'.$tax1.'='.$tax1_get.'&'.$tax2.'='.$tax2_get.'&'.$tax3.'='.$tax3_get.'&'.$tax4.'='.$tax4_term->slug.'" class="'.$current.'">' .esc_html( $tax4_term->name ). '</a></p>'; 72 } 73 } 74 $tax4_term_items = '<td id="tax4">' . $tax4_term_items. '</td>' ; 75 echo $tax4_term_items; 76 77?> 78</table> 79</div> 80

お願いしたいこと

参考になりそうなサイトをしている方、記述の仕方が分かる方などいましたら
ご提案いただけるとうれしいです。

追記

いろいろと調べて、実装したい形はこちらの質問(WordPressのカスタム投稿で親カテゴリとサブカテゴリのリストを表示させたい)に一番近いと思います。
なので自分なりに実装できないか試してみたのですが、都道府県カテゴリしか表示されませんでした。

php

1<?php 2// カスタム分類名 3$tax01 = 'address01'; 4$tax02 = 'address02'; 5 6// パラメータ 7$args = array( 8 // 親タームのみ取得 9 'parent' => 0, 10 11 // 子タームの投稿数を親タームに含める 12 'pad_counts' => true, 13 14 // 投稿記事がないタームも取得 15 'hide_empty' => false 16); 17 18// カスタム分類のタームのリストを取得 19$terms = get_terms( $tax01 , $args ); 20 21if ( count( $terms ) != 0 ) { 22 echo '<div>'; 23 24 // 親タームのリスト $terms を $term に格納してループ 25 foreach ( $terms as $term ) { 26 27 // 親タームのURLを取得 28 $term = sanitize_term( $term, $tax01 ); 29 $term_link = get_term_link( $term, $tax01 ); 30 if ( is_wp_error( $term_link ) ) { 31 continue; 32 } 33 34 // 親タームのURLと名称とカウントを出力 35 echo '<h3><a href="' . esc_url( $term_link ) . '">' . $term->name . '</a>(' . $term->count . ')</h3>'; 36 37 // 子タームのIDのリストを取得 38 $term_children = get_term_children( $term->term_id, $tax02 ); 39 40 if( count( $term_children ) != 0 ) { 41 echo '<ul>'; 42 // 子タームのIDのリスト $term_children を $term_idに格納してループ 43 foreach ( $term_children as $term_id ) { 44 45 // 子タームのIDを元に子タームの情報を取得 46 $term_child = get_term_by( 'id', $term_id, $tax02 ); 47 48 // 子タームのURLを取得 49 $term_child = sanitize_term( $term_child, $tax02 ); 50 $term_child_link = get_term_link( $term_child, $tax02 ); 51 if ( is_wp_error( $term_child_link ) ) { 52 continue; 53 } 54 55 // 子タームのURLと名称とカウントを出力 56 echo '<li><a href="' . esc_url( $term_child_link ) . '">' . $term_child->name . '</a>(' . $term_child->count . ')</li>'; 57 } 58 echo '</ul>'; 59 } 60 } 61 62 echo '</div>'; 63} 64?>

引き続き助言等いただけると幸いです。

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

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

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

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

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

kei344

2018/04/02 13:54

提示のコードは記事ではなくタームを表示するコードのように思いますが、コードをお間違いではありませんか?
misato_3310

2018/04/02 14:00

記事があるタームのリンクを作成したいので、タームを表示するコードを使っているのですが、そもそもそこから間違ってるのでしょうか? 記事のループを回して、そこから所属するタームを抽出するべきなんでしょうか…?
kei344

2018/04/02 14:13

「複数タクソノミーで絞り込めるアーカイブページ」は記事を絞り込むための物なのでは?
misato_3310

2018/04/02 14:17

記事を絞りこむための物なのですが、複数のタクソノミーのパラメーターを付与するやり方で一番近かったものがこれなので実装してみたのですがうまくいかなかったので、一旦そのうまくいかなかったコードを提示させていただいた形になります…。ほかはアーカイブでpost_queryの中にタクソノミーを入れて表示するものしか出てこず、やりたいこととは違ったので…。
guest

回答2

0

提示されているコードは2軸だから成り立つコードなので、4軸には対応できません。
ラジオボタンとかにしてフォームで送った方がよいのでは?


追記:

適当に変数名を付けたのでかなりわかりにくいと思いますが。

PHP

1// 未検証 2$this_url = get_post_type_archive_link( 'assessment' ); 3$ttx = [ 4 'address01' 5 , 'address02' 6 , 'address03' 7 , 'address04' 8]; 9$ttg = [ 10 isset( $_GET[ $ttx[ 0 ] ] ) ? $_GET[ $ttx[ 0 ] ] : '' 11 , isset( $_GET[ $ttx[ 1 ] ] ) ? $_GET[ $ttx[ 1 ] ] : '' 12 , isset( $_GET[ $ttx[ 2 ] ] ) ? $_GET[ $ttx[ 2 ] ] : '' 13 , isset( $_GET[ $ttx[ 3 ] ] ) ? $_GET[ $ttx[ 3 ] ] : '' 14]; 15foreach( $ttx as $key => $val ) { 16 $tmp_terms = get_terms( $val, '&hide_empty=true' ); 17 if ( !$tmp_terms ) continue; 18 $tmp_term_items = ''; 19 $tmp_url_same = ''; 20 foreach( $ttg as $key2 => $val2 ) { 21 if ( $key === $key2 ) continue; 22 $tmp_url_same .= '&'.$ttx[ $key2 ].'='.$ttg[ $key2 ]; 23 } 24 foreach( $tmp_terms as $tmp_term ) { 25 $current = ( $ttg[ $key ] === $tmp_term->slug ) ? 'current' : ''; 26 $tmp_url = $this_url.'?'.$ttx[ $key ].'='.$tmp_term->slug.$tmp_url_same; 27 $tmp_term_items .= '<p><a href="'.esc_url( $tmp_url ).'" class="'.$current.'">' .esc_html( $tmp_term->name ). '</a></p>'; 28 } 29 echo '<td id="tax1">' . $tmp_term_items. '</td>'; 30}

追記:

質問内容にも書きましたが、親子カテゴリにするのはクライアントにはできず、またこちらの作業量が膨大になってしまうので、厳しいのです。

何を想定して作業量と考えているかがわかりませんが、住所は郵便局の公開データがあるし、API(Yahoo!)もありますよ。
管理画面からそれを使って親子関係を持ったカテゴリを登録するようにするとかで処理できそうですが・・・。

【[API/マッシュアップ]都道府県→市町村のドリルダウン検索 | Wood-Roots:blog】
http://wood-roots.com/web/api/495

上記ドリルダウンの値をカスタムフィールドで持って、それをフックで階層化されたタームに置き換え(タームを階層化して登録&記事をそのタームに紐付ける)る。

【[WordPress]カスタムフィールドの値を置換するフィルターフック | Wood-Roots:blog】
http://wood-roots.com/web/wordpress/1357

か、記事に設定されたタームの組み合わせをDBのどこかに保存し、それを使ってURLを構築するとか。(管理画面を作ったりメンテがたいへん)

投稿2018/04/02 14:29

編集2018/04/03 17:07
kei344

総合スコア69407

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

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

misato_3310

2018/04/02 14:34 編集

私の説明不足なのだと思うのですが、絞り込んでいく検索機能をつける、というよりは通常の投稿の時のカテゴリー表示のようにアーカイブへのリンクを表示させたいのです。 それに関してパラメータの渡し方を上記サイトを参考に行ったということなのです。 なので、フォームで送るというのは実装したいことと違う気がするのですが…。 厚手がましいようで申し訳ありません。
kei344

2018/04/02 14:45 編集

フォームのGETで送る物はパラメータになるのを知っていますか? 「アーカイブへのリンク」って、4軸の住所片を全通り組み合わせるつもりですか?23区にそれぞれ10町目まであるだけでも230ものリンクが必要になりますが・・・。 (追記) あー、参考元を読み違えていました。できなくは無いですね。
misato_3310

2018/04/02 16:23

上記のコードをだとエラーが出たので、修正して試させていただいたのですが、パラメータの順番が入れ替わるのみで元のコードでの出力とあまり変わりませんでした…。 アーカイブへのリンクの数の件ですが、クライアントからの強い要望のため、こちらでは何とも…。
kei344

2018/04/02 16:48

エラーはエラー文を提示してください。 また、希望のURLと出力されたURL(HTMLとして出力された物)も提示してください。
misato_3310

2018/04/02 17:00

$ttx = [ 'address01' , 'address02' , 'address03' , 'address04' ]; $ttg = [ isset( $_GET[ $ttx[ 0 ] ] ) ? $_GET[ $ttx[ 0 ] ] : '' , isset( $_GET[ $ttx[ 1 ] ] ) ? $_GET[ $ttx[ 1 ] ] : '' , isset( $_GET[ $ttx[ 2 ] ] ) ? $_GET[ $ttx[ 2 ] ] : '' , isset( $_GET[ $ttx[ 3 ] ] ) ? $_GET[ $ttx[ 3 ] ] : '' ]; の部分でシンタックスエラーが出たため、 $ttx[] = 'address01'; $ttx[] = 'address02'; $ttx[] = 'address03'; $ttx[] = 'address04'; $ttg[] = isset( $_GET[ $ttx[ 0 ] ] ) ? $_GET[ $ttx[ 0 ] ] : ''; $ttg[] = isset( $_GET[ $ttx[ 1 ] ] ) ? $_GET[ $ttx[ 1 ] ] : ''; $ttg[] = isset( $_GET[ $ttx[ 2 ] ] ) ? $_GET[ $ttx[ 2 ] ] : ''; $ttg[] = isset( $_GET[ $ttx[ 3 ] ] ) ? $_GET[ $ttx[ 3 ] ] : ''; と修正しました。 希望のURLは <a href="http://example.co.jp/assessment?address01=東京都">東京都</a> <a href="http://example.co.jp/assessment?address01=東京都&address02=新宿区">新宿区</a> <a href="http://example.co.jp/assessment?address01=東京都&address02=新宿区&address03=北新宿&address04=1丁目">北新宿1丁目</a> なのですが、出力は <a href="http://example.co.jp/assessment?address01=東京都&address02=&address03=&address04=" class="">東京都</a> <a href="http://example.co.jp/assessment?address02=新宿区&address01=&address03=&address04=" class="">新宿区</a> <a href="http://example.co.jp/assessment?address03=北新宿&address01=&address02=&address04=" class="">北新宿</a> <a href="http://example.co.jp/assessment?address04=1丁目&address01=&address02=&address03=" class="">1丁目</a> でした。
kei344

2018/04/02 17:09

> シンタックスエラー PHP5.3以前をお使いであればエラーが出ますね。 > 希望のURL 東京都と新宿区をつなげる物が無いとそのURLにはできませんよ。「東京都青葉区」とか無い住所を量産することになります。 記事を元に生成するとすれば住所が増えるたびにとてつもない計算量が必要になります。 親子カテゴリにして自動選択する方がよいと思います。(同一名称タームは別階層でも許容されないので処理方法を考える必要はありますが) 【wordpress 親カテゴリ 自動選択 - Google 検索】 https://www.google.co.jp/search?num=100&safe=off&q=wordpress+%E8%A6%AA%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA+%E8%87%AA%E5%8B%95%E9%81%B8%E6%8A%9E
misato_3310

2018/04/02 18:24

記事を元に生成すること自体は可能なのですね。 質問内容にも書きましたが、親子カテゴリにするのはクライアントにはできず、またこちらの作業量が膨大になってしまうので、厳しいのです。 もし可能であれば、記事を元に生成する方法のヒントでも教えていただけたらと思います。
guest

0

自己解決

アーカイブへのリンクは断念し、現在のカテゴリの登録方法のまま、
検索フォームを設置することになりました。

閲覧、回答ありがとうございました。

投稿2018/04/03 20:40

misato_3310

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問