久しぶりの更新となってしまいました今回は、中古車屋さん等の絞り込み検索に使われている様なドリルダウンを、WordPressのタームと子タームで実現する方法をご紹介してみたいと思います。
ドリルダウンとは何なのかわからない人は、あれですあれ、中古車屋さんとかの絞り込み検索で、メーカーのセレクトボックスで「トヨタ」とか選ぶと、その下の車種のセレクトボックスが「クラウン」とか「カローラ」とかに自動的に変化するあれですあれ。
あれを今回はメーカーを親タームとし、車種を子タームとしてAjaxでドリルダウンを作ってみようという方法をご紹介しています。
簡単なものですが、使い勝手はあると思います。ひとつの参考として見てみて下さい。
流れとしては下記の様な感じで進めていきます。
carカスタム投稿を作成
cartypeタクソノミーを作成
メーカータームと車種子タームを作成
パーマリンクの変更
carカスタム投稿にそれぞれの中古車を登録
archive.phpに絞り込み検索の土台となるformを設置
function.phpにPHP側の処理を作成
drilldown.jsを作成して、Javascript側の処理を作成
では、そんな感じで進めていきましょう!
carカスタム投稿を作成
カスタム投稿名はなんでもいいんですが、今回は「car」という名前にしてみました。
カスタム投稿タイプの作成には、ご存知【Custom Post Type UI】プラグインを使うのがいいと思います。
だって面倒くさくないし、簡単だし、【Custom Post Type UI】でのカスタム投稿タイプの作成に関しては、非常に丁寧に説明してくれているサイトが大量にあるので、ググってみてね(丸投げっ汗)。
で、とりあえず「car」というカスタム投稿タイプを作成して下さい。
cartypeタクソノミーを作成
カスタム投稿同様に【Custom Post Type UI】で、「cartype」タクソノミーを作成して下さい。
コレもわからなければググって下さいねー。
親タームメーカー、子ターム車種になるようにタームを作成
そのままなんですが、今作った「cartype」タクソノミーに、親タームメーカー、子ターム車種になるようにタームになる様にメーカーと車種を作っていって下さい。
実際は車種等はユーザーが随時追加していくことが予想されますので、今回はスラッグも日本語でやっています。
パーマリンクの変更
設定のパーマリンクの変更から、共通設定を「投稿名」にチェックを入れて保存して下さい。
carカスタム投稿にそれぞれの中古車を登録
上記の設定でcarカスタム投稿から中古車を登録して、メーカーと車種のタクソノミーを設定できるようになりましたので、とりあえずサンプルを登録していって下さい。
このとき「cartype」タクソノミーはメーカーも車種も両方チェックするようにして下さい。
archive.phpに絞り込み検索の土台となるformを設置
今回はサンプル作成に「Twenty Sixteen」のテーマを使いました。
とりあえず今回は、archive.phpのループの上くらいに下記のフォームを記入して下さい。
<form method=
"post"
id=
"searchform"
action=
"<?php home_url( '/' ) ?>"
>
<input type=
"hidden"
name=
"s"
id=
"s"
value=
""
>
<dd><?php get_maker_select() ?></dd>
<select name=
"vehicle"
id=
"vehicle"
></select>
<input type=
"submit"
class
=
"searchsubmit"
value=
"絞り込む"
>
メーカーのセレクトボックスを作る部分はの部分で、後ほどfunction.phpで作っていきます。
車種のセレクトボックスはその下のselectの部分で、後ほどdrilldown.jsとfunction.phpでAjaxで出力するようになります。
function.phpにPHP側の処理を作成
まず、デフォルトのjqueryを読み込まないようにwp_enqueue_scripts
フックにちょっと追加しましょう。
「Twenty Sixteen」では、add_action( 'wp_enqueue_scripts', 'twentysixteen_scripts' );
という関数が既にフックされていますので、そのtwentysixteen_scripts関数の先頭に下記を追加して下さい。
wp_deregister_script(
'jquery'
);
wp_enqueue_script(
'jquery'
,
'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'
,
array
(),
'1.7.1'
);
ここまでの作業を終了していれば、下記はコピペでOKです。function.phpの下の方にでも書いておいて下さい。
何をしているかは簡単にソース内に記述しています。
function
get_maker_select () {
foreach
(
$wp_query
->tax_query->queries
as
$val
) {
$actives
=
array_merge
(
$actives
,
$val
[
'terms'
] );
$terms
= get_terms(
'cartype'
,
array
(
'hide_empty'
=>0,
'parent'
=>0) );
if
( !
empty
(
$terms
) && !is_wp_error(
$terms
) ){
echo
'<select name="maker" id="maker">'
;
echo
'<option value="" date-tag_id="" '
.
$selected
.
'>選択なし</option>'
;
foreach
(
$terms
as
$term
) {
if
( in_array(
$term
->slug,
$actives
) ) {
echo
'<option value="'
.
$term
->slug .
'" date-tag_id="'
.
$term
->term_id .
'" '
.
$selected
.
'>'
.
$term
->name .
'</option>'
;
function
include_drilldown(){
wp_enqueue_script(
'drilldown'
, get_template_directory_uri().
'/js/drilldown.js'
,
array
(
'jquery'
));
wp_localize_script(
'drilldown'
,
'drilldown_vars'
,
array
(
'ajaxurl'
=> admin_url(
'admin-ajax.php'
),
add_action(
'wp_enqueue_scripts'
,
'include_drilldown'
);
$maker_id
=
$_POST
[
'maker'
];
$termchildren
= get_term_children(
$maker_id
,
'cartype'
);
foreach
(
$termchildren
as
$child
) {
$putarray
= get_term_by(
'id'
,
$child
,
'cartype'
);
array_push
(
$result
,
$putarray
);
header(
'Content-Type: application/json; charset=utf-8'
);
echo
json_encode(
$result
);
add_action(
'wp_ajax_kthepost'
,
'kThePost'
);
add_action(
'wp_ajax_nopriv_kthepost'
,
'kThePost'
);
if
( isset(
$_POST
[
's'
] ) ) {
if
( !
empty
(
$_POST
[
'vehicle'
] ) && !
empty
(
$_POST
[
'maker'
] ) ) {
if
( mb_detect_encoding(
$_POST
[
'vehicle'
] ) !==
'ASCII'
) {
$_POST
[
'vehicle'
] = urlencode(
$_POST
[
'vehicle'
] );
$url
=
'/cartype/'
.
$_POST
[
'vehicle'
] .
'/'
;
wp_redirect( home_url(
$url
) );
}
else
if
( !
empty
(
$_POST
[
'maker'
] ) ) {
if
( mb_detect_encoding(
$_POST
[
'maker'
] ) !==
'ASCII'
) {
$_POST
[
'maker'
] = urlencode(
$_POST
[
'maker'
] );
$url
=
'/cartype/'
.
$_POST
[
'maker'
] .
'/'
;
wp_redirect( home_url(
$url
) );
add_filter(
'request'
,
'showQ'
);
function
lig_wp_category_terms_checklist_no_top(
$args
,
$post_id
= null ) {
$args
[
'checked_ontop'
] = false;
add_action(
'wp_terms_checklist_args'
,
'lig_wp_category_terms_checklist_no_top'
);
drilldown.jsを作成して、Javascript側の処理を作成
次はjs側の処理です。
drilldown.jsというファイルを作成し、下記をコピペしてjsフォルダに保存して下さい。
$(window).ready(
function
() {
$(
"select#maker"
).on(
"load change"
,
function
() {
$(
'#vehicle > option'
).remove();
var
maker = $(
'[name=maker] option:selected'
).attr(
"date-tag_id"
);
url: drilldown_vars[
'ajaxurl'
],
success:
function
( response ){
$(
'#vehicle'
).append($(
'<option>'
).html(
'選択なし'
).val(
''
));
$.each( response,
function
(index, elem) {
$(
'#vehicle'
).append($(
'<option>'
).html(elem.name).val(elem.slug));
if
(decodeURI(elem.slug) == elem.vehicle) {
$(
'#vehicle'
).val(elem.slug);
まとめ
実用するにはもうちょっと作り込む必要がありますが、これでとりあえずターム子タームを使ったAjaxのドリルダウンが実現できるはずです。
更に実際に絞り込み検索に使うのであれば、走行距離とか色とか色々な選択が出来るように作らなくてはなりません。
まぁとりあえず今回はWordPressのターム子タームでAjaxのドリルダウンをする時の参考として、今回は中古車屋さんの絞り込み検索を例としてやってみました。