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

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

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

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

Q&A

解決済

2回答

1105閲覧

WordPressでAjaxを使ったリアルタイムな複合検索をおこないたい

waon

総合スコア17

WordPress

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

0グッド

0クリップ

投稿2019/07/30 01:50

編集2019/07/30 01:52

以下のように、カスタムフィールドやカテゴリーの選択肢をラジオボタンで選んで、「検索」ボタンをクリックすると該当記事一覧が表示される、いわゆる普通の検索ページがあります。

例)
・カテゴリー(カテゴリー): カテ1 カテ2
・カスタム項目A(カスタムフィールド): カスタムA1 カスタムA2 
・カスタム項目B(カスタムフィールド): カスタムB1 カスタムB2 

これを、ラジオボタンのcheckedが変わるたびに(=選択/選択の変更をトリガーにして)、ボタンを押さなくてもその条件に該当する記事一覧を
その都度リアルタイムに表示させたいです。

まずは該当ページのHTMLですが、

PHP

1●検索フォーム部分 2<form method="get" id="searchform" action="<?php echo esc_url(home_url()); ?>/page/"> 3<input id="cat01" type="radio" name="cat" value="cat01"> 4<label for="cat01">カテ1</label> 5 6<input id="cat02" type="radio" name="cat" value="cat02"> 7<label for="cat02">カテ2</label> 8 9<input id="cus-a1" type="radio" name="cus-a" value="cus-a1"> 10<label for="cus-a1">カスタムA1</label> 11 12<input id="cus-a2" type="radio" name="cus-a" value="cus-a2"> 13<label for="cus-a2">カスタムA1</label> 14 15<input id="cus-b1" type="radio" name="cus-b" value="cus-b1"> 16<label for="cus-b1">カスタムB1</label> 17 18<input id="cus-b2" type="radio" name="cus-b" value="cus-b2"> 19<label for="cus-b2">カスタムB1</label> 20<input type="submit" class="submit" name="submit" id="searchsubmit" value="検索" /></div> 21</form> 22 23 24●検索まわりの部分 25$my_cat = $_GET['cat']; 26$cus_a = $_GET['cus-a']; 27$cus_b = $_GET['cus-b']; 28 29if($cus_a){ 30 $meta_key[] = array( 31 'key'=>'cus_a', 32 'value'=> $cus_a, 33 'compare'=>'=', 34 ); 35} 36if($cus_b){ 37 $meta_key[] = array( 38 'key'=>'cus_b', 39 'value'=> $cus_b, 40 'compare'=>'=', 41 ); 42} 43$meta_key['relation'] = 'AND'; 44 45$args = array( 46 'post_type' => 'post', 47 'posts_per_page' => -1, 48 'post_status' => 'publish', 49 'paged' => $paged, 50 51 'tax_query' => array( 52 'relation' => 'AND', 53 array( 54 'taxonomy' => 'category', 55 'field' => 'slug', 56 'terms' => $my_cat, 57 'operator' => 'IN' 58 ), 59 ), 60 'meta_query' => $meta_key, 61); 62$my_result = new WP_Query($args); 63 64 65●記事一覧表示部分 66<div id="search-list" class="search-list"> 67 <?php if( $my_result->have_posts()): while( $my_result->have_posts()): $my_result->the_post(); ?> 68 <div><a href="<?php the_permalink(); ?>"><?php the_title();?></a></div> 69 <?php endwhile; endif; wp_reset_postdata(); ?> 70</div>

と記述し「検索」ボタンでクリックで正常に記事一覧が取得できている状態です。
ここから、functions.phpにadmin-ajax.phpを読み込むためのコードを以下のように記述しました。

PHP

1<?php function add_my_ajaxurl() { ?> 2 <script> 3 var ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>'; 4 </script> 5<?php 6} 7add_action( 'wp_footer', 'add_my_ajaxurl', 1 );

続いて、同じくfunctions.phpにjsから呼び出すアクションフックを記述しました。
基本はテーマファイルの検索まわりに書いたコードを同じになります。

PHP

1function my_ajax_get_posts(){ 2 // 1. 受け渡しするデータ 3 $my_cat = $_POST['cat']; 4 $cus_a = $_POST['cus-a']; 5 $cus_b = $_POST['cus-b']; 6 7 // 2. フォームの値を検索条件にセット 8 if($cus_a){ 9 $meta_key[] = array( 10 'key'=>'cus_a', 11 'value'=> $cus_a, 12 'compare'=>'=', 13 ); 14 } 15 if($cus_b){ 16 $meta_key[] = array( 17 'key'=>'cus_b', 18 'value'=> $cus_b, 19 'compare'=>'=', 20 ); 21 } 22 $meta_key['relation'] = 'AND'; 23 24 // 3. get_posts オプション 25 $args = array( 26 'post_type' => 'post', 27 'posts_per_page' => -1, 28 'post_status' => 'publish', 29 'paged' => $paged, 30 31 'tax_query' => array( 32 'relation' => 'AND', 33 array( 34 'taxonomy' => 'category', 35 'field' => 'slug', 36 'terms' => $my_cat, 37 'operator' => 'IN' 38 ), 39 ), 40 'meta_query' => $meta_key, 41 ); 42 43 // 結果取得 44 $my_result = new WP_Query($args); 45 $response = ''; 46 $my_result->post_count = count( $my_result->posts ); 47 48 // マッチした記事数をセット 49 $get_num = $my_result->post_count; 50 51 52 // 投稿表示 53 if($my_result->have_posts()) { 54 while($my_result->have_posts()){ 55 $my_result->the_post(); 56 $response .= get_template_part('loop-posts'); // テーマファイルで記述したループと同じコードを記述したテンプレートファイル 57 }; 58 } else { 59 $response .= get_template_part('none'); 60 } 61 //wp_reset_postdata(); 62 echo $response; 63 exit; 64} 65add_action( 'wp_ajax_my_get_posts', 'my_get_posts' ); 66add_action( 'wp_ajax_nopriv_my_get_posts', 'my_get_posts' );

最後にfooter.phpにjsで以下のように記述しています。

js

1<script> 2// strictモード(厳格モード)」で実行 3'use strict'; 4 5jQuery(function($){ 6 // 1. 出力するクラスを設定 7 var resultArea = $('.archive-search-section'); 8 9 // 2. ラジオボタンの変更をトリガーに 10 $('input[name="post-select-type1"] , input[name="post-select-type2"]').change(function() { 11 12 // 3. 出力するクラスの投稿を全削除 13 resultArea.children().remove(); 14 15 // 4. ajax 16 $.ajax({ 17 type: 'POST', 18 url: ajaxurl, 19 dataType: "html", 20 data: { 21 // actionでアクションフックを実行 22 action : 'my_get_posts', 23 }, 24 success: function( response ) { 25 console.log( response ); 26 resultArea.html( response ); 27 }, 28 error: function(){ 29 console.log("Ajax処理エラー" ); 30 }, 31 complete: function(){ 32 console.log( "Ajax処理終了" ); 33 } 34 }); 35 }); 36}); 37</script>

としています。

これでラジオボタンを選択/変更すると、対象クラス内のコードが正常に消えるのですが、該当する記事一覧が表示されず「0」と、数字のゼロが表示されるだけです。コンソールログを見ると「Ajax処理終了」と出ているので、動作自体は問題がないようです。

これはどこに問題があるのでしょうか?教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

admin-ajax 側で POST 変数を受けるのであれば、POST リクエストを送る際に data で必要なデータを渡してください。

js

1data: { 2 // actionでアクションフックを実行 3 action: 'my_get_posts', 4 cat: ..., // 適宜値を入れてください. 5 'cus-a': ..., 6 'cus-b': ... 7},

追記前

get_template_part 関数は値を返しません。
変数に代入するためには ob_start/ob_get_clean などを使用する必要があります。

php

1ob_start(); 2get_template_part( 'loop-posts' ); 3$response .= ob_get_clean();

投稿2019/07/30 02:34

編集2019/07/30 10:50
YukiYamashina

総合スコア1011

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

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

waon

2019/07/30 08:57

ありがとうございます。回答いただいた内容にしてみましたが、動きませんでした。そうなると値の受け渡しが出来ていない可能性がありますね。もう少し調べてみます。
waon

2019/07/31 00:14

ありがとうございます、出来ました!なるほど、dataの中に渡す値もセットしないといけなかったんですね。勉強になりました!
guest

0

関数名をmy_ajax_get_postsからmy_get_postsに変えてみてはどうでしょう。

投稿2019/07/30 02:29

yukikp

総合スコア797

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

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

yukikp

2019/07/30 02:32

これでだめなら、my_get_posts関数の中の各ステップで出力される内容をvar_dump()とdie()で出力してconsole.logで確認してみましょう。
waon

2019/07/30 08:57

ありがとうございます。確かに関数名が違っていましたね、失礼しました。修正してみましたがやはり改善されず。ご教示いただいた通り、各ステップの内容を確認してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問