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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1447閲覧

WordPressの絞り込み検索を実装したい(カスタム投稿&カスタムフィールド有り)

kskk

総合スコア2

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/10/25 05:43

前提・実現したいこと

WordPressで、プラグインなしで絞り込み検索を実装したいと思っています。

発生している問題・エラーメッセージ

「customer」という投稿タイプの中で、選択したカスタムフィールドの値で絞り込み検索をしたいのですが、うまく投稿が表示されません。
現在の状態としては、
①functions.phpで、pre_get_postsを使ってメインクエリにカスタムフィールドの値を追加
②searchform.phpで検索フォームを作成
③archive-customer.phpに検索フォームとメインループを設置
というところまできています。

var_damp()で検索クエリ?を確認しましたが、値は正しく入っているような気がします。

カスタムフィールドは、ACFを使用しています。
検索対象のフィールドは、以下の箇所となります。
イメージ説明

該当のソースコード

該当のソースコードを記載します。

【functions.php】

php

1function change_pre_get_posts($query) { 2 3 // 管理画面,メインクエリ以外に干渉しないため 4 if ( is_admin() || ! $query->is_main_query() ){ 5 return; 6 } 7 8 // カスタム投稿タイプが「customer」 9 if($query->is_post_type_archive( 'customer' )) { 10 11 $meta_query = [ 12 'relation' => 'AND', 13 ]; 14 15 // radioボタンの方 16 if(!empty($_GET['prefecture'])) { 17 $meta_query[] = array( 18 'key' => 'school', 19 'value' => $_GET['prefecture'], 20 'compare' => '=' 21 ); 22 } 23 24 // セレクトボックスの方 25 if(!empty($_GET['class']) and is_array($_GET['class'])) { 26 $sub_meta_query = [ 27 'relation' => 'OR', 28 ]; 29 foreach ($_GET['class'] as $index => $occupation) { 30 $sub_meta_query[] = [ 31 'key' => 'doll_b', 32 'value' => $occupation, 33 'compare' => '=' 34 ]; 35 } 36 $meta_query[] = $sub_meta_query; 37 } 38 39 40 $query->set('meta_query', $meta_query); 41 } 42} 43add_action( 'pre_get_posts', 'change_pre_get_posts' );

【searchform.php】

php

1<form action="/customer/" method="get"> 2 3 <table> 4 <tbody> 5 <tr> 6 <th width="150">クラス名</th> 7 <td> 8 <div> 9 <label for="talk">クラスA</label> 10 <input type="radio" name="class[]" id="talk" value="話し方クラス" checked> 11 </div> 12 <div> 13 <label for="read">クラスB</label> 14 <input type="radio" name="class[]" id="read" value="朗読クラス"> 15 </div> 16 </td> 17 </tr> 18 <tr> 19 <th>キャラ</th> 20 <td> 21 <select name="prefecture" class="input"> 22 <option value="">-----</option> 23 <option value="キャラA">キャラA</option> 24 <option value="キャラB">キャラB</option> 25 <option value="キャラC">キャラC</option> 26 <option value="キャラD">キャラD</option> 27 </select> 28 </td> 29 </tr> 30 </tbody> 31 </table> 32 <input type="submit" value="検索する" class="button is-primary"> 33</form>

【archive-customer.php】

php

1 <?php get_header();?> 2 3 <?php get_search_form();?> 4 5 6 <?php if (have_posts()): 7 while (have_posts()): 8 the_post(); ?> 9 <?php the_title();?> 10 <?php endwhile;?> 11 <?php endif;?> 12 13<?php var_dump($_GET['class']);?> 14<?php var_dump($_GET['prefecture']);?> 15 16<?php get_footer();?>

みなさまお忙しい中誠に恐縮ですが、どうかお知恵をお貸しいただきたいと存じます。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

こちらのサンプル記述を参考にして、
https://tenderfeel.xsrv.jp/wordpress/2942/#i-10

サブクエリ配列に名前を付けてを入れ子定義にして処理すればいけそうな気がします。

投稿2021/10/26 15:27

AnMoreNight

総合スコア109

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問