エス技研

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.

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

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

  関連記事

SMTP Mailerでスパム判定回避。WP Mail SMTPで発生する送信エラーも対応
SMTP Mailerでスパム判定回避。WP Mail SMTPで発生する送信エラーも対応

WordPressからのメールをスパム判定されずに送信する「SMTP Mailer」の解説。SMTP MailerはPHP 5.6、7.0になってもSMTP接続でエラーにならない設定を搭載しているのが特徴。

BackWPupでバックアップ・全体バックアップ具体的設定例

BackWPupその7。ファイル、DB全体をバックアップする具体的事例での説明です。

WordPress 任意のファイルを読み込むショートコードの処理

投稿ページにショートコードを利用して任意のファイルを読み込む処理の解説です。

WordPress 画面が真っ白になる対応の一つ デバッグモード

WordPressで画面が真っ白になる不具合があった場合などのために用意されているデバッグモードの解説です。

WordPressの functions.phpがある場所

WordPressのカスタマイズには大切な functions.phpですが、最初はその場所がどこなのか分かりませんのでその説明をしています。

WP Mail SMTP、WP SMTP、Easy WP SMTPでWordPressのメールのスパム判定を回避

WordPressから送信したメールがスパム判定される!そんな悩みを解決するプラグインを紹介。3種類にプラグインを比較しオススメを紹介。なぜスパム判定されるかの解説も。

WordPressに Favicon(ファビコン)を設定する(プラグイン必要なし)

WordPressに Favicon(ファビコン)をプラグインなしで設定する方法をサンプルソース付きで説明します。

ショートコード+ウィジェットでサイドバーに人気記事を表示させる方法

WordPressのサイドナビゲーションに人気記事を編集する方法です。プラグインを使わずウィジェットにショートコードで任意のPostIDを指定することで編集する方法です。

アクセス5倍増!FC2、seesaaからWordPressに引越結果をレポート

FC2、seesaaからWordPressに引越しでアクセス数がどう変わるかのレポート。canonical、meta refresh設定とWordPressの集客力の検証しています。

WordPress csvインポート、エクスポートのプラグイン

WordPressから csvファイルをエクスポート、インポートする方法を紹介しています。