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

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

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

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

2005閲覧

wordpressでカスタムタクソノミーのajaxドリルダウンを搭載したい

maruku_1_27

総合スコア4

WordPress

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2021/11/18 02:09

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>

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

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

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

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

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

guest

回答1

0

ベストアンサー

毎回Ajax通信をするより最初に全ターム情報をJSONデータで取得してその値をjQueryで抽出したほうが
楽な気はしますが、現在の問題点としては

Javascirpt

1 data: { 2 'action': 'kthepost2', //Ajaxアクション名 3 'maker': vehicle2 4 },

ここでvehicle2の値をmakerとしてPOSTしているのに対して

PHP

1function kThePost2() 2{ 3 if (!empty($_POST['vehicle'])) { 4 $maker_id2 = $_POST['vehicle']; //フォームからメーカーIDを取得

ここで判定に$_POST['maker']ではなく$_POST['vehicle']を使用しているせいではないかと思います。

子要素の値をdate-tag_idから取得しようとしていますが、新しく追加されたオプション部分にdate-tag_idが追加されていません。
selectRvent関数の該当箇所を

Javascirpt

1$('#vehicle').append($('<option>').html(elem.name).val(elem.slug).attr("date-tag_id",elem.term_id));

に変更してください。

投稿2021/11/18 02:56

編集2021/11/18 05:07
gogoweb_ikeda

総合スコア1426

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

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

maruku_1_27

2021/11/18 03:32 編集

gogoweb_ikeda 様 ご回答ありがとうございます。 ご教示頂いた通り、functions.phpの方を$_POST['maker']に変更し、 selectRvent2内で`console.log(date);`でオブジェクトの中身を確認しましたが結果は変わらず0のままでした。
maruku_1_27

2021/11/18 05:34

gogoweb_ikeda 様 追記でのご教示ありがとうございます。 希望通りできました! 本当にありがとうございます。 初めての質問でここまで丁寧に理由と解決法を教えて頂けたこと感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問