カスタムフィールドの検索処理を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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
get_categories、get_termsでカテゴリとタクソノミーのターム一覧の編集方法
get_categories()関数やget_terms()関数を使ってタクソノミーのタームを取得し検索処理の部品を作るプログラム作りその解説をしています。
-
seesaaからWordPressに引越。インストールなど必要な全てを解説
seesaaブログからWordPressへの引越し解説。他のブログにはないseesaaブログからcanonicalとリダイレクトの設定方法を実装!
-
WordPressで月極駐車場検索サイトを構築し無料公開・使ったプラグインの紹介も
月極駐車場を検索するシステムをWordPressで構築。そのアナウンスと構築するために利用したプラグインの紹介。構築にどれくらいの期間がかかるのかの紹介。
-
Export to Textで WordPressを csv出力
WordPressのデータを csv出力する Export to Textの使い方を解説しています。
-
Advanced Custom Fieldsの関数の全部の使い方を調べてみた
Advanced Custom Fieldsに用意されている関数を全て調べてみた。よく使うget_field、the_field以外にも多くの関数が用意されていて、フォームを作成することも可能。
-
自サイト内のリンクをショートコードで指定する・アンカーリンク対応版
自サイト内の記事にショートコードで自動リンクを設定する関数のソースコードを提供。Post ID、slugで指定でき、アンカーリンクを設定する場合も対応。
-
Crayon Syntax Highlighterでソースコードをキレイに編集する設定方法
PHP、HTMLなどのソースコードを紹介する際に見やすく編集してくれる Crayon Syntax Highlighterの設定の方法、利用方法の解説です。
-
Rich ReviewsでWordPressに口コミサイトを簡単に構築する方法
口コミサイトに必要なレビュー投稿機能を提供するプラグインです。独自のフォームをショートコードで編集する自由度が高い設計で、平均点の表示も用意されています。
-
WordPressにプラグインを使わず OGP(Open Graph Protocol)の設定方法解説
WordPressに OGP(Open Graph Protocol)をプラグインを使わずに設定する方法の解説。
-
ショートコード+ウィジェットでサイドバーに人気記事を表示させる方法
WordPressのサイドナビゲーションに人気記事を編集する方法です。プラグインを使わずウィジェットにショートコードで任意のPostIDを指定することで編集する方法です。