カスタムフィールドの検索処理をget_posts()関数のmeta_queryで作成しそれを解説
2017/03/12
get_posts()関数で投稿を条件抽出する
get_posts()関数に関して
以前、「get_posts()」関数を利用し、任意の場所に任意のカテゴリの記事一覧を編集するためのショートコードを作成し、それを記事にしました。
ショートコードで簡単解決!WordPress固定ページにカテゴリ一覧を編集する方法
ショートコードで簡単解決!カスタムフィールドでソート、抽出条件設定方法
今回は「get_posts()」関数の処理を発展させて入力した条件で抽出・検索する処理を作ってみました。
WordPressで条件検索を作成するイメージ
飲食店サイトを構築する想定でサンプルを作りました。
飲食店情報を入力する際にその店舗の予算を設定し、その予算を検索対象項目として条件検索を行う。という処理を考えてみました。
今回のカスタムフィールドの設定については、Advanced Custom Fields(ACF)というプラグインを使用していまして、一部の値の取得にはプラグイン専用の関数を使用していますので、Advanced Custom Fieldsを入れていないと動きません。
Advanced Custom Fields(ACF)の解説については、下記の記事を参照してください。
Advanced Custom Fields管理画面の全項目完全解説・カスタムフィールド決定版!
Advanced Custom Fieldsの全項目解説・公開側表示編集編
Advanced Custom Fieldsの関数の全部の使い方を調べてみた
また、サンプルソースでは、「店舗情報(store)」というカスタム投稿を作成した店舗情報という記事を検索する処理になっています。
カスタム投稿の設定については Custom Post Type UIというプラグインを使用しています。
Custom Post Type UIの解説については下記の記事を参照してください。
Custom Post Type UIでカスタム投稿を設定し編集する方法解説
Custom Post Type UIでカスタム投稿を設定し編集する方法解説
ただ、カスタム投稿に関しては、実際に構築しているサイトがカスタム投稿を利用しているというだけですので、通常の投稿(post)の場合でも全く問題ありません。その解説もしています。
Custom Post Type UIを利用する必要もありません。
テンプレートファイルに記述するサンプルコード
下記のサンプルコードをコピペすることで検索処理を実装することができます。
編集するファイルは、例えば下記のファイルです。詳細は後述します。
/{WordPressのルート}/wp-content/themes/{テーマ}/archive.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
echo "【選択肢】<br>"; echo "■予算<br><br>"; // 選択肢の値を取得(Advanced Custom Field使用を想定) $field_object = get_field_object( "ss_budget" ); // 選択肢のチェックボックス編集 echo '<form method="POST" action="">' . "\n"; foreach ( $field_object['choices'] as $choice ) { if ( isset ( $_POST["chk_budget"] ) ) { if ( in_array ( $choice, $_POST["chk_budget"] ) ) { $checked_text = " checked"; } else { $checked_text = ""; } } echo '<input type="checkbox" name="chk_budget[]" value="' . $choice . '"' . $checked_text . '>' . $choice . "<br>\n"; } echo '<input type="submit" name="submit" value="検索"><br>'; echo '</form>'; // get_posts()関数の初期値を設定 $posts_per_page = 10; $chk_arg_cnt = 0; // get_posts()で取得する「post_type」を配列で設定 $chk_arg = array ( "post_type" => "store", "posts_per_page" => $posts_per_page ); // get_posts()で取得する選択肢の条件を配列に追加 if ( $_POST["chk_budget"] ) { foreach ( $_POST["chk_budget"] as $chk_tmp ) { $chk_arg["meta_query"][] = array ( "key" => "ss_budget", "value" => '"' . $chk_tmp . '"', "compare" => "like", ) ; $chk_arg_cnt++; } if ( $chk_arg_cnt > 1 ) { $chk_arg["meta_query"]["relation"] = "OR"; } } // get_posts()関数を実行 $blog_posts = get_posts ( $chk_arg ); // 検索結果を編集 echo "<br>【検索結果】<br>"; foreach ( $blog_posts as $blog_post ) { echo $blog_post -> post_title . "<br>"; if ( is_array ( get_field ( "ss_budget", $blog_post -> ID ) ) ) { echo implode ( "、", get_field ( "ss_budget", $blog_post -> ID ) ); } else { echo get_field ( "ss_budget", $blog_post -> ID ); } echo "<br>----------<br>"; } |
WordPressの検索処理の解説
今回のサンプルは、飲食店の情報を登録し、その飲食店情報を予算で検索する、という仕組みを想定しています。
飲食店の情報は、「store」というカスタム投稿として作成しています。
検索対象は「予算」で「フィールド名:ss_budget」という項目をカスタムフィールドとして設定しています。
検索処理を記述するファイル
前項のソースコードを編集するファイルは下記に、としました。
/{WordPressのルート}/wp-content/themes/{テーマ}/archive.php
これはデフォルトの一覧に利用されているテンプレートファイルになり、このファイルを変更するとすべての一覧ページが影響を受けます。
そのため、カテゴリごとに一覧を作成する場合、タクソノミーごとに別の一覧テンプレートを作成する場合などは、下記の条件によって「archive.php」をコピーしてテンプレートファイルを作成してください。
- category-{slug}.php 特定のカテゴリだけのテンプレート
- category-{6}.php 1.同様特定のカテゴリ。こちらは IDで指定
- category.php カテゴリ共通のテンプレート
- archive.php カテゴリ、アーカイブ一覧など一覧ページ共通
- index.php すべての共通テンプレート
- taxonomy-{slug}-{term}.php 特定のタクソノミーの中の特定のタームだけのテンプレート
- taxonomy-{slug}.php 特定のタクソノミーだけのテンプレート
- taxonomy.php タクソノミー共通のテンプレート
- archive.php タクソノミー、アーカイブ一覧など一覧ページ共通
- index.php すべての共通テンプレート
※それぞれ上の方が優先的に適用されます。
Advanced Custom Fields(ACF)での設定項目
検索を行う選択肢は、Advanced Custom Fields(ACF)の設定画面から登録を行います。
Advanced Custom Fields(ACF)の管理画面・budgetの設定画面
Advanced Custom Fieldsで「予算」という項目を作成し、「店舗」の情報入力画面で店舗ごとの「予算」情報を入力します。
選択肢の情報を取得する get_field_object()関数
最初は、5行目にある選択肢の情報を取得する関数「get_field_object()」についてです。
「get_field_object()」関数については「Advanced Custom Fieldsの関数の全部の使い方を調べてみた/get_field_object()」に詳しく解説していますが、前項の Advanced Custom Fields(ACF)で設定した「予算」の選択肢を取得する関数です。
「get_field_object( “ss_budget” )」で、「ss_budget」という項目名の情報を取得します。
「get_field_object()」関数で取得した情報を、9行目の foreach文で取得したレコードの数だけまわします。
選択肢は「choices」というキーの配列の中に入っていますので「$field_object[‘choices’]」で取得します。
ここで解説をしたカスタムフィールドに設定されている選択肢のリストを取得する処理を WordPressの最初からある関数で作成する方法を見つけることができませんでした。
もし、その方法があれば Advanced Custom Fieldsを使わなくても同様の処理を構築することが可能になるでしょう。
投稿を条件指定して取得する get_posts()関数
get_posts()関数は、条件を指定して条件に合致する投稿を取得する関数です。
詳しくは「ショートコードで簡単解決!カスタムフィールドでソート、抽出条件設定方法」に解説を書いていますので参考にしてみてください。
26行目の「$posts_per_page = 10;」は 32行目で指定する「”posts_per_page”」の値で、1ページに表示する件数を指定します。
制限なしの場合は「-1」を指定します。
30行目の「”post_type” => “store”,」で「post_type」を指定しています。
今回は、デフォルトの投稿の「post」ではなく、「飲食店(store)」というカスタム投稿を想定していますので「store」を指定しています。
デフォルトの「投稿」の場合は「post」を指定します。
35行目からは、検索条件としてチェックボックスにチェックが入った項目を条件として配列に編集していきます。
例えば、「1,001円~2,000円」「2,001円~3,000円」にチェックが入った場合の処理は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 |
$chk_arg = Array ( "post_type" => store, "posts_per_page" => 10, "meta_query" => Array ( Array ( "key" => "ss_budget", "value" => '"1,001円~2,000円"', "compare" => "like" ), Array ( "key" => "ss_budget", "value" => '"2,001円~3,000円"', "compare" => "like" ), [relation] => "OR" ) ); |
「1,001円~2,000円」のみにチェックが入った場合の処理は以下のようになっています。
1 2 3 4 5 6 7 |
$chk_arg = Array ( "post_type" => store, "posts_per_page" => 10, "meta_query" => Array ( Array ( "key" => "ss_budget", "value" => '"1,001円~2,000円"', "compare" => "like" ) ) ); |
ここで気を付ける必要があるポイントは「meta_query」で条件を設定する場合は、
”meta_query” => array ( array ( 条件 ) );
となるところです。
”meta_query” => array ( 条件 );
ではないところがハマりポイントなので注意しましょう。
もう一つのハマりポイントは、「”value” => ‘”1,001円~2,000円”‘,」となるところです。
これは、Advanced Custom Fields(ACF)のオリジナルの処理のようで、なぜか「”value” => “1,001円~2,000円”,」ではうまく動かないのです。
下記の ACFのオフィシャルサイトにサンプルソースが載っていますので参考にしてみてください。
http://www.advancedcustomfields.com/resources/checkbox/
ところが、これをプログラムで処理をする場合は、どちらでもいいところがステキですね。
36行目は下記のいずれでも問題ありません。
”value” => ‘”‘ . $chk_tmp . ‘”‘,
”value” => $chk_tmp,
40行目は、複数にチェックが入った場合に AND検索するか、OR検索するかを指定します。
検索の内容によって「AND」「OR」を指定します。
生成した配列を引数に、45行目で get_posts()関数で処理を実行します。
get_posts()関数で取得した投稿を編集
45行目の get_posts()関数で取得した投稿を 49行目以降で編集を行います。
ここではあくまでもサンプルとして、投稿のタイトル(店舗名)と、予算の項目だけを編集する処理にしています。
50行目は投稿のタイトル(店舗名)を取得しています。
51行目の get_field()関数は、Advanced Custom Fields(ACF)のオリジナルの関数で、「get_field ( “ss_budget”, $blog_post -> ID )」の様にフィールド名と投稿IDを指定することで指定した項目を取得します。
「get_field()」関数については「Advanced Custom Fieldsの関数の全部の使い方を調べてみた/get_field()」に詳しく解説していますので、併せて参考にしてください。
WordPressのデフォルトの関数でカスタムフィールドの値を取得する場合は「get_post_meta ( $blog_post -> ID, “ss_budget”, false )」となります。
Advanced Custom Fields(ACF)で入力したカスタムフィールドの値も取得できますので、get_post_meta()関数でも問題ありません。
get_posts()関数を使おう。query_posts()関数は非推奨
今回作成した処理は「get_posts()」関数で作成しています。
同じような投稿を検索する関数として、かつては「query_posts()」関数というものがありましたが、現在は非推奨となっています。詳しくは下記オフィシャルサイトを参照してください。
http://wpdocs.osdn.jp/テンプレートタグ/query_posts
「ショートコードで簡単解決!WordPress固定ページにカテゴリ一覧を編集する方法」の記事を書くときに使ってみましたが、query_posts()関数はそもそも正しく動作しない場合もあります。
投稿の情報を検索して情報を取得する場合は get_posts()関数を使いましょう。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
WordPressのアップグレードの英語版と日本語版の公開のタイムラグは?
WordPressのアップグレードの英語版と日本語版の公開のタイムラグについて説明しています。
-
get_categories、get_termsでカテゴリとタクソノミーのターム一覧の編集方法
get_categories()関数やget_terms()関数を使ってタクソノミーのタームを取得し検索処理の部品を作るプログラム作りその解説をしています。
-
WordPressで ¥円マークが \ バックスラッシュになる原因と対処方法
円マークがバックスラッシュに変換される。その原因と対処方法を解説します。原因はCSSでのフォント指定に欧文フォントも含まれるため欧文フォントで表示されること。
-
Category Order and Taxonomy Terms Orderでカテゴリ・タクソノミーのタームの順番を並び替える
標準機能では行えないカテゴリやタクソノミーの並び替えを行うプラグインCategory Order and Taxonomy Terms Orderの紹介です。
-
BackWPupでバックアップ・エラー発生の具体的対処方法事例6
BackWPupその6。エラーが起こったときの対処方法の具体例紹介です。
-
DuplicatorでWordPressを簡単引越し!インストーラー付のバックアップにも
WordPressの引越しや開発環境から本番環境への移行など他の環境に移す作業を簡単にしてくれるプラグインの紹介。インストーラー付のバックアップツールとしても使る。
-
WordPress 画面が真っ白になる対応の一つ デバッグモード
WordPressで画面が真っ白になる不具合があった場合などのために用意されているデバッグモードの解説です。
-
BackWPupでバックアップ・リストア(復元)の具体的手順
BackWPupその9。バックアップファイルからのリストア(復元)の手順です。
-
WordPressの一般設定 投稿設定 表示設定 ディスカッション メディア
基本的な設定を行う「設定」の解説です。ブログサイトを構築する際に必要な設定内容を一般設定、投稿設定、表示設定などの各項目を説明しながら設定内容を提示しています。
-
WordPressの不正ログインを Force email loginで回避
WordPressのセキュリティ強化に Force email loginを使う理由と設定方法の解説をしています。