エス技研

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
 

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」をコピーしてテンプレートファイルを作成してください。
 

  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円」にチェックが入った場合の処理は以下のようになっています。

$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円」のみにチェックが入った場合の処理は以下のようになっています。

$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()関数を使いましょう。

 - WordPress

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

Message

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

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

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

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

  関連記事

Search RegexでWordPress投稿の文字列を検索・置換する使い方解説

WordPressの投稿テキストを検索、置換するプラグイン Search Regexの使い方の詳細解説です。

Broken Link Checkerのリンク生死チェックでサイトの品質向上!SEO対策!

Broken Link Checkerは記事内のリンクのリンク切れチェックをし自動的にリンク切れの対処をします。リンク切れは一覧表示されますので手動での処置も可能です。

ショートコードで簡単解決!カスタムフィールドでソート、抽出条件設定方法

ショートコードを使って固定ページや投稿に特定のカテゴリ一覧を編集する処理に、ソート条件、抽出条件も設定できる処理を作成。カスタムフィールドも条件に利用可。

WP Multibyte PatchでWordPressの管理画面のイタリック体を解消

管理画面の一部の文字がイタリック(斜体)になっているのはプラグイン「WP Multibyte Patch」が有効になっていないためです。日本語を使うには必ず有効化しましょう。

CSV Importerで WordPressにcsvを取込む

WordPressに csvファイルを取り込む CSV Importerの使い方の解説です。

Export to Textで WordPressを csv出力

WordPressのデータを csv出力する Export to Textの使い方を解説しています。

Custom Post Type UIでカスタムタクソノミーを設定・バージョン1.4対応解説

カスタムタクソノミーをプラグインCustom Post Type UIを使って設定する方法の解説。バージョンアップにより設定する項目も増え続け、より柔軟な設定が可能に。

タクソノミーの一覧をショートコードで編集・ソート機能付き・wp_list_categories

カスタムタクソノミーのターム一覧をショートコードで編集する方法の解説です。Category Order and Taxonomy Terms Orderを利用してソート機能を追加したバージョンです。

WordPressで ¥円マークが \ バックスラッシュになる原因と対処方法

円マークがバックスラッシュに変換される。その原因と対処方法を解説します。原因はCSSでのフォント指定に欧文フォントも含まれるため欧文フォントで表示されること。

WordPressのサイドバー(サイドナビ)はウィジェットで編集

サイドバー(サイドナビ)を編集するウィジェットの利用方法の解説です。カテゴリ一覧、アーカイブ、リンク集などを設定する方法を解説しています。


Warning: Trying to access array offset on null in /home/ss-giken/s-giken.net/public_html/blog/wp-content/plugins/amazonjs/amazonjs.php on line 637