エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


カスタムフィールドの検索処理をget_posts()関数のmeta_queryで作成しそれを解説

      2017/03/12

get_posts()関数で投稿を条件抽出する

 

get_posts()関数に関して

 
以前、「get_posts()」関数を利用し、任意の場所に任意のカテゴリの記事一覧を編集するためのショートコードを作成し、それを記事にしました。
 ショートコードで簡単解決!WordPress固定ページにカテゴリ一覧を編集する方法
 ショートコードで簡単解決!カスタムフィールドでソート、抽出条件設定方法
 
今回は「get_posts()」関数の処理を発展させて入力した条件で抽出・検索する処理を作ってみました。
 
 

WordPressで条件検索を作成するイメージ

 
飲食店サイトを構築する想定でサンプルを作りました。
飲食店情報を入力する際にその店舗の予算を設定し、その予算を検索対象項目として条件検索を行う。という処理を考えてみました。
 
20161010_wp_01
 
 
今回のカスタムフィールドの設定については、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
 

 
 


 

WordPressの検索処理の解説

 
今回のサンプルは、飲食店の情報を登録し、その飲食店情報を予算で検索する、という仕組みを想定しています。
飲食店の情報は、「store」というカスタム投稿として作成しています。
検索対象は「予算」で「フィールド名:ss_budget」という項目をカスタムフィールドとして設定しています。
 
 

検索処理を記述するファイル

 
前項のソースコードを編集するファイルは下記に、としました。
 /{WordPressのルート}/wp-content/themes/{テーマ}/archive.php
 
これはデフォルトの一覧に利用されているテンプレートファイルになり、このファイルを変更するとすべての一覧ページが影響を受けます。
 
そのため、カテゴリごとに一覧を作成する場合、タクソノミーごとに別の一覧テンプレートを作成する場合などは、下記の条件によって「archive.php」をコピーしてテンプレートファイルを作成してください。
 

  1. category-{slug}.php 特定のカテゴリだけのテンプレート
  2. category-{6}.php   1.同様特定のカテゴリ。こちらは IDで指定
  3. category.php    カテゴリ共通のテンプレート
  4. archive.php    カテゴリ、アーカイブ一覧など一覧ページ共通
  5. index.php     すべての共通テンプレート

 

  1. taxonomy-{slug}-{term}.php 特定のタクソノミーの中の特定のタームだけのテンプレート
  2. taxonomy-{slug}.php 特定のタクソノミーだけのテンプレート
  3. taxonomy.php    タクソノミー共通のテンプレート
  4. archive.php    タクソノミー、アーカイブ一覧など一覧ページ共通
  5. index.php     すべての共通テンプレート

 
  ※それぞれ上の方が優先的に適用されます。
 
 

Advanced Custom Fields(ACF)での設定項目

 
検索を行う選択肢は、Advanced Custom Fields(ACF)の設定画面から登録を行います。
 
Advanced Custom Fields(ACF)の管理画面・budgetの設定画面
20161010_wp_02
 
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,001円~2,000円」のみにチェックが入った場合の処理は以下のようになっています。

 
ここで気を付ける必要があるポイントは「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()関数を使いましょう。

 - WordPress

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

WordPress・Contact Form7、MW WP Form共通 細かなデザイン調整方法

お問い合わせフォームプラグインの Contact Form7、MW WP Formにおけるラジオボタン、チェックボックスなどの見た目を調整する小技を紹介。

Category Order and Taxonomy Terms Orderでカテゴリ・タクソノミーのタームの順番を並び替える

標準機能では行えないカテゴリやタクソノミーの並び替えを行うプラグインCategory Order and Taxonomy Terms Orderの紹介です。

WordPressの管理画面ログインURLの変更方法解説

管理画面のログインURLの変更は極めて有効なセキュリティ向上の方法ですので、その解説を行います。

WordPressのカテゴリ単位・フォルダ単位でBasic認証を設定する方法

カテゴリ単位でBasic認証を設定する方法の解説。WordPressのカテゴリはフォルダの実態がないですが、実は簡単な方法でプラグインも使わずにBasic認証を設置できます。

Advanced Custom Fieldsの全項目解説・公開側表示編集編

Advanced Custom Fieldsは現時点でカスタムフィールドを設定する最高のプラグイン。それで入力した情報を取り出す方法を全て網羅して解説しました。

WordPressのログイン画面 URLを変更する 管理画面に Basic認証を設定する

ログインURLは誰でも知っています。そのまま使うとリスクが高まりますのでログインURLを変更し Basic認証で二重チェックをする方法を解説。

ロリポップでWordPress+Basic認証で不具合発生!回避方法解説

ロリポップサーバでWordPressを使いBasic認証を設定する際には注意しないとWordPressが動かなくなる場合も!その回避方法を解説します。

WordPressの画像ファイルアップロード・メディアの使い方解説

画像ファイルをアップロードするメディアの使い方解説。アップロードしたファイルの管理や編集、ファイルのURL、アップロード先の解説。

wp_mail()関数でWordPressのスパム対策済のメールフォーム作成

WordPressでメール送信フォームを作成するための関数「wp_mail()」の使い方の解説。CC、BCC、添付ファイルも HTMLメールも設定可能。

SyntaxHighlighterの設定、カスタマイズ方法を解説。Crayonから乗換え、高速化にも最適

SyntaxHighlighter 3の設置方法、各機能の設定方法、オプション、デフォルト設定の変更方法を解説。Crayonから乗り替えるならこれしかない。