質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1567閲覧

カスタムフィールド値を使ったフィルタリング

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/11/05 07:32

前提・実現したいこと

Wordpressの記事を「カスタムフィールドの値でフィルタリング」したいと考えています。

「該当のソースコード」にあるように『meta_query』を用いて、$kzn_p01_cnum が「1206」の時を抽出してみようとしたところ、うまく結果が抽出できませんでした。

将来的には、登録日に対しての「期間指定」など、meta_query (?)を使って、フィルタリングしてみたいです。
そのためには、該当のソースコードのように$kzn_p01_cnum が 1206 の時がフィルタリング出来ないと、先には進めません。


サイト(サーバー)の仕様は次のとおりです。

[ O S ] Windows 10
[Server] XAMPP 7.3.22
[ PHP ] 7.4.10
[ D B ] MariaDB 10.3.15
[ W P ] 5.5.1-ja

該当のソースコード

Wordpress

1$args = array( 2 'numberposts'  => -1, 3 'post_type'   => 'post', 4 'post_status'  => 'publish', 5 'meta_key'    => 'kzn_post_person01', // (親:リピートフィールド) 6 'meta_value'   => 'kzn_p01_cnum',    // (子:リピートフィールド) 7 'meta_value_num'  => 1206, 8 'meta_compare'   => '=', 9); 10$mm_query = new WP_Query($args);

参考にしたサイト

試したこと

  1. 'meta_key' の部分を 'meta_query' に置き換えてみた ..... NG
  2. WP_Query の部分を query_posts に置き換えてみた ..... NG
  3. こんなコードも試してみました。 ..... NG

Wordpress

1$args = array( 2  'numberposts' => -1, 3  'post_type'  => 'post', 4  'post_status' => 'publish', 5  'meta_query'  => [ 6   'key'   => 'kzn_post_person01', 7 'value'  => 'kzn_p01_cnum', 8 'compare' => '=', 9 'relation' =>  'AND', 10       [ 11 'key'   => 'kzn_p01_cnum', 12 'value'  => '1206', 13 'compare' => '=', 14 ] 15  ] 16 );
  1. 繰り返しフィールドにならないテキストフィールドを新設。”1206”と入力してフィルタリングできるか試した ..... OK

よって、'meta_key''meta_query' の設定方法が、「繰り返しフィールドに対応していない」というところまではわかりました。

きっと詳しい方からすると、上記の「試したこと」というのは”的外れ”とご指摘を受けそうですが、私の持てるスキルではこれが限界でした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

参考サイトを見てもうちょっと頑張りましょう

https://tombolo.jp/2017/02/621

php

1add_filter('posts_where', function ($where) { 2 // Repeater Field内をmeta_keyで検索するため、LIKEで検索 3 $where = str_replace("meta_key = 'date_repeater_%", "meta_key LIKE 'date_repeater_%", $where); 4 return $where; 5});

これが肝です

つまりACFの繰り返しフィールドは
[親フィールド名][番号][子フィールド名]という動的なmeta_keyで保存されるので
meta_keyの番号部分を%にしてLIKEで比較してやらないといけないってことです

投稿2020/11/05 07:52

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/06 00:18

@KazuhiroHatano 様、ありがとうございます。 うすうす私の方でも、フィールドの親子関係をどう取り扱ったらいいかは考えていたので、ご指導頂いた箇所も参考サイトで知っていたので、次の通り、コードを組んでいました。 ``` 【親フィールド】kzn_post_person01 【子フィールド】kzn_p01_cnum ``` $mm_query = new WP_Query(); $mm_paged = get_query_var('paged') ? get_query_var('paged') : 1; add_filter('posts_where', function ($where) { // Repeater Field内をmeta_keyで検索するため、LIKEで検索 $where = str_replace("meta_key = 'kzn_post_person01_%", "meta_key LIKE 'kzn_post_person01_%", $where); return $where; }); $mm_param = [ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 1, 'paged' => $mm_paged, 'meta_key' => 'kzn_post_person01_%_kzn_p01_cnum', 'order' => 'ASC', 'meta_query' => [ 'relation' => 'AND', [ 'key' => 'kzn_post_person01_%_kzn_p01_cnum', 'compare' => '=', 'value' => '1206', ] ] ]; $mm_query->query($mm_param); ``` 過去の質問にも同様な内容の質問があったので試してみたのですがうまくいきませんでした。 [https://ja.wordpress.org/support/topic/advanced-custom-fields%E3%81%AErepeater-field%E3%81%AE%E5%80%A4%E3%81%A7%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BF%E3%82%92%E7%B0%A1%E7%B4%A0%E3%81%AB%E6%9B%B8%E3%81%8F%E6%96%B9%E6%B3%95/](https://ja.wordpress.org/support/topic/advanced-custom-fields%E3%81%AErepeater-field%E3%81%AE%E5%80%A4%E3%81%A7%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BF%E3%82%92%E7%B0%A1%E7%B4%A0%E3%81%AB%E6%9B%B8%E3%81%8F%E6%96%B9%E6%B3%95/)
退会済みユーザー

退会済みユーザー

2020/11/06 03:10

@KazuhiroHatano 様、ありがとうございます。 折角教えていただいた内容が、私には理解出来ず申し訳ございません。 とりあえず、リファレンスの変更があったか確認する意味で「$the_query = get_post_custom();」としてvar_dump($the_query);してみました。 するとmeta_keyとmeta_valueのようなキーが表示されませんでした。 もしかしてと思って、実際の投稿したページ(ページID=47)を指定したら、一覧の中にmeta_keyとmeta_valueがありました。 コードはこんな感じです。 $pid = 47; $the_query = get_post_custom($pid); var_dump($the_query); 今までは、全投稿に対してのループ処理なので、ページIDを指定しなかったのですが、これが原因なのでしょうか。 また、関数リファレンスを読んでも理解が出来なかったので、上記コードの実行結果から、抽出条件に該当しそうな箇所を探しました。下記のような表示になっていました。 ["kzn_post_person01_kzn_p01_cnum"]=> array(1) { [0]=> string(4) "1206" } ["_kzn_post_person01_kzn_p01_cnum"]=> array(1) { [0]=> string(19) "field_5f7d73a75dfff" } 上記コードから推測するに、親とサブのフィールドを切り分けている感じがない上に、各フィールドに対して個別のフィールドIDを割り当てている印象をを受けました。 ACF公式のドキュメントを探したんですが、該当項目を見つけられる、更に英語でワケワカメで詰みましたorz
KazuhiroHatano

2020/11/06 04:02

仕様変更でmeta_keyから番号部分がなくなったようですね ならば単純に[親フィールド]_[子フィールド]をmeta_keyにすればいいだけなので 'key'=>'kzn_post_person01_kzn_p01_cnum'とすれば良いだけではないでしょうか
退会済みユーザー

退会済みユーザー

2020/11/06 05:35

@KazuhiroHatano 様、ありがとうございました。 無事に全投稿からカスタムフィールドに割り当てた「会員番号が一致する投稿のみ」抽出することが出来ました。 とりあえず「全投稿から指定会員番号だけのデータベースを抽出」ができたので、このデータベースをループさせることができれば、とりあえずはポイント合計を集計できるようになりそうです。 質問をしたときには「一人目のみ」での合計を集計する方法で質問させていただきましたが、同様に「二人目」も存在し、同じ会員番号で「一人目」のときもあったり「二人目」のときもあるため、そんなときの集計方法を考えている時、行き詰まったら、また違う質問で投稿させていただきますのでよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問