以下のように、カスタムフィールドやカテゴリーの選択肢をラジオボタンで選んで、「検索」ボタンをクリックすると該当記事一覧が表示される、いわゆる普通の検索ページがあります。
例)
・カテゴリー(カテゴリー): カテ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処理終了」と出ているので、動作自体は問題がないようです。
これはどこに問題があるのでしょうか?教えてください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/30 08:57
2019/07/31 00:14