エス技研

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.

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

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

  関連記事

評価点投票プラグイン10個を比較!WordPressで口コミサイトを構築

口コミサイトを作るために必要な評価点、レビューを投稿できるプラグインを探して評価。10プラグインをチェックし、8プラグインは詳細解説付き。

FC2からWordPressに引越。インストールなど必要な全てを解説

FC2からWordPressへの引越し解説。内容は引越しメインではなくこれからWordPressでブログを構築する方向けのブログ構築の解説記事です。

WordPress 画面が真っ白になる不具合があった場合の対応の一つ

WordPressで画面が真っ白になる不具合があった場合の対応方法の説明です。PHPでエラーが起こっている場合がほとんどですがその対処方法です。

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

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

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

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

Theme My Loginの旧バージョン(V6.4.17)のダウンロード場所の紹介
Theme My Loginの旧バージョン(V6.4.17)のダウンロード場所の紹介

Theme My Loginのバージョンアップ(V6.4系→V7.0系)で不具合が発生!問題を解消するには元バージョンにダウングレードだ!そんな時に必要となるV6.4系をダウンロードできるURLを紹介!

WordPressの Link Managerでブックマーク(リンク)の管理を行う

ウィジェットのブックマーク(リンク)はプラグイン化された「Link Manager」を使って設定します。その使い方の解説です。

Theme My Loginの日本語翻訳ファイル Ver.6.4.5対応

Theme My Loginの日本語翻訳ファイルのダウンロードページ。WordPressの翻訳ファイルの設置方法、注意点、翻訳ファイルの作成方法なども解説。

WordPressの Google XML Sitemapsで WebMaster Tools用の sitemap.xmlを生成

WordPressの Google XML Sitemapsで WebMaster Tools用の sitemap.xmlを生成する方法を説明しています。

BackWPupでバックアップ・機能の基本設定 Settings

BackWPupその5。バックアップ設定のベースになるBackWPup自体の設定解説です。