wordpressでカスタムタクソノミーのajaxドリルダウンを搭載しようと下記URLサイトを参考にしました。
https://kurubusi.net/expertise/webblog/drilldown/
前提・実現したいこと
各タームを選択する度に
<select>のoptionの中身がajaxで自動生成されるようにしたいです。
下記は例としてのターム構造です。
カスタムタクソノミー:estate-cat └ りんご ├ 赤 └ 青 └ ぶどう ├ 白 └ 紫 ├ 山梨産 └ 長野産
だとした場合、ぶどうを選んだら、次の<select>タグで白・紫のoptionが生成される。
発生している問題
ぶどう→紫を選んでも三番目の<select>タグのoptionが更新されません。
どうやらタームが子→孫間のデータの受け渡しができてないように感じます。
初めてのajaxなので分からない事ばかりです…。
お手柔らかにご教示いただければと存じます。
該当のソースコード
functions.php
1//functions.php 2 3//メーカーのセレクトボックスを作る 4function get_maker_select() 5{ 6 global $wp_query; 7 8 $actives = array(); 9 foreach ($wp_query->tax_query->queries as $val) { //現在選択されているメーカーを取得 10 $actives = array_merge($actives, $val['terms']); 11 } 12 13 $terms = get_terms('estate-cat', array('hide_empty' => 0, 'parent' => 0)); //estate-catから親タームのみ取得 14 if (!empty($terms) && !is_wp_error($terms)) { //空じゃなかったらselectを作成していく 15 echo '<select name="maker" id="maker">'; 16 echo '<option value="" date-tag_id="" ' . $selected . '>選択なし</option>'; 17 foreach ($terms as $term) { //各opution作成ループ 18 if (in_array($term->slug, $actives)) { //選択中だったらselectedをつける 19 $selected = 'selected'; 20 } else { 21 $selected = ''; 22 } 23 echo '<option value="' . $term->slug . '" date-tag_id="' . $term->term_id . '" ' . $selected . '>' . $term->name . '</option>'; //メーカーopution作成 24 } 25 echo '</select>'; 26 } 27} 28 29 30//WPでajaxをするための準備 31function include_drilldown() 32{ 33 global $post; 34 wp_enqueue_script('drilldown', get_template_directory_uri() . '/js/drilldown.js', array('jquery')); //wp_head()でdrilldown.jsを読み込む 35 wp_localize_script( 36 'drilldown', 37 'drilldown_vars', 38 array( 39 'ajaxurl' => admin_url('admin-ajax.php'), 40 ) 41 ); //WPでAjaxをするための準備 42} 43add_action('wp_enqueue_scripts', 'include_drilldown'); //スクリプトをインクルードするアクションフック 44 45 46//子タームをjsに返す 47function kThePost() 48{ 49 if (!empty($_POST['maker'])) { 50 51 $maker_id = $_POST['maker']; //フォームからメーカーIDを取得 52 53 $termchildren = get_terms('estate-cat', array('hide_empty' => false, 'parent' => $maker_id)); //メーカーIDから子ターム(車種)のIDの配列を取得 54 55 $result = array(); 56 foreach ($termchildren as $child) { //車種のID配列を回す 57 $putarray = $child; //車種IDからオブジェクトを取得 58 array_push($result, $putarray); //子ターム(車種)配列を作っていく 59 } 60 header('Content-Type: application/json; charset=utf-8'); //お約束 61 echo json_encode($result); //jsに子ターム(車種)オブジェクトを渡す 62 die(); //お約束 63 } 64} 65add_action('wp_ajax_kthepost', 'kThePost'); //wp_ajax_アクション名でAjaxリクエストハンドラを行うために実行 66add_action('wp_ajax_nopriv_kthepost', 'kThePost'); //wp_ajax_nopriv_アクション名でAjaxリクエストハンドラを行うために実行 67 68 69//孫タームをjsに返す 70function kThePost2() 71{ 72 if (!empty($_POST['vehicle'])) { 73 $maker_id2 = $_POST['vehicle']; //フォームからメーカーIDを取得 74 75 $termgrand = get_term_children($maker_id2, 'estate-cat'); //メーカーIDから子ターム(車種)のIDの配列を取得 76 77 $result2 = array(); 78 foreach ($termgrand as $grand) { //車種のID配列を回す 79 $putarray = get_term_by('id', $grand, 'estate-cat'); //車種IDからオブジェクトを取得 80 array_push($result2, $putarray); //子ターム(車種)配列を作っていく 81 } 82 header('Content-Type: application/json; charset=utf-8'); //お約束 83 echo json_encode($result2); //jsに子ターム(車種)オブジェクトを渡す 84 die(); //お約束 85 } 86} 87add_action('wp_ajax_kthepost2', 'kThePost2'); //wp_ajax_アクション名でAjaxリクエストハンドラを行うために実行 88add_action('wp_ajax_nopriv_kthepost2', 'kThePost2'); //wp_ajax_nopriv_アクション名でAjaxリクエストハンドラを行うために実行 89
drilldown.js
1//drilldown.js 2 3jQuery(function () { 4 5 $(window).ready(function () { 6 selectRvent(); 7 selectRvent2(); 8 }); 9 $("select#maker").on("load change", function () { 10 selectRvent(); 11 }); 12 $("select#vehicle").on("load change", function () { 13 selectRvent2(); 14 }); 15 16 function selectRvent() { 17 $('#vehicle > option').remove(); 18 var maker = $('[name=maker] option:selected').attr("date-tag_id"); 19 $.ajax({ 20 type: 'POST', 21 url: drilldown_vars['ajaxurl'], //PHPから取得したadmin-ajax.phpまでのURL 22 dataType: 'json', 23 data: { 24 'action': 'kthepost', //Ajaxアクション名 25 'maker': maker 26 }, 27 success: function (response) { //PHPからメーカーオブジェクトを取得 28 $('#vehicle').append($('<option>').html('選択なし').val('')); 29 $.each(response, function (index, elem) { 30 $('#vehicle').append($('<option>').html(elem.name).val(elem.slug)); //optionを作成していく 31 if (decodeURI(elem.slug) == elem.vehicle) { 32 $('#vehicle').val(elem.slug); 33 } 34 }); 35 36 } 37 }); 38 } 39 40 function selectRvent2() { 41 $('#vehicle2 > option').remove(); 42 var vehicle2 = $('[name=vehicle] option:selected').attr("date-tag_id"); 43 $.ajax({ 44 type: 'POST', 45 url: drilldown_vars['ajaxurl'], //PHPから取得したadmin-ajax.phpまでのURL 46 dataType: 'json', 47 data: { 48 'action': 'kthepost2', //Ajaxアクション名 49 'maker': vehicle2 50 }, 51 success: function (date) { //PHPからメーカーオブジェクトを取得 52 //console.log(date); 53 $('#vehicle2').append($('<option>').html('選択なし').val('')); 54 $.each(date, function (index, elem) { 55 $('#vehicle2').append($('<option>').html(elem.name).val(elem.slug)); //optionを作成していく 56 if (decodeURI(elem.slug) == elem.vehicle2) { 57 $('#vehicle2').val(elem.slug); 58 } 59 }); 60 61 } 62 }); 63 } 64 65}); 66
drilldown.js
1//archive.php 2 3<form method="post" id="searchform" action="<?php home_url('/') ?>"> 4 <input type="hidden" name="s" id="s" value=""> 5 <dl> 6 <dt>種類</dt> 7 <dd><?php get_maker_select() ?></dd> 8 </dl> 9 <dl> 10 <dt>種別</dt> 11 <dd> 12 <select name="vehicle" id="vehicle"></select> 13 </dd> 14 </dl> 15 <dl> 16 <dt>産地</dt> 17 <dd> 18 <select name="vehicle2" id="vehicle2"></select> 19 </dd> 20 </dl> 21 <input type="submit" class="searchsubmit" value="絞り込む"> 22 </form>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/18 03:32 編集
2021/11/18 05:34