こんにちは
投稿オブジェクトに「山田太郎」というタイトルの投稿を選択した投稿を検索する、という理解でよろしいでしょうか?
投稿オブジェクトでは、カスタムフィールドに投稿IDが入っているようです。
タイトルやコンテンツの中身、作成者などは入っていません。
まず、「山田太郎」というタイトルの投稿を取得します。
その投稿の投稿IDがpostmetaのstaffに入っている入っている投稿をmeta_queryで検索すればいけそうです。
‘value’=>”$staff”
はどうなんでしょうね。
munyagu様
お返事ありがとうございます。
大変も申し訳ないのですが、
ワードプレス初心者ゆえ
お返事の内容が理解できず、
具体的にどうしたらよいかわかりません。
ワードプレスで売上管理システムを構築しており、
売上一覧の表をソートしたり、集計したいと
考えています。
ちなみに担当者でのソートは問題無く出来ています。
$_POST[‘metakey’]; はフォームよリ担当者を選択 <===ソート用
$_POST[‘order’]; はフォームよリ昇降順を選択 <===ソート用
$_POST[‘staff’];はフォームよリ担当者を選択 <===絞り込み用
$staff = $_POST[‘staff’];
$metakey = $_POST[‘metakey’];
$order = $_POST[‘order’];
$args = array(
‘’cat’=>2,’posts_per_page’ => -1, <===カテゴリ用
‘orderby’=>’meta_value’,’order’=>”$order”,’meta_key’=>”$metakey”, <===ソート用
‘meta_query’=> array( <===絞り込み用
array(
‘key’=>’staff’,
‘value’=>”$staff”,
‘compare’=>”LIKE”
)
)
);
$List = new WP_Query($args);
if($List->have_posts()):while($List->have_posts()):$List->the_post();
ここに表
endwhile;endif;
何度も申し訳ございませんがご教授よろしくお願いいたします。
oisit様
お返事ありがとうございます。
‘value’=>”$staff”ですが、
他のフィールドタイプ(テキストや数値)で変数実験をしたところ
問題無く動作しました。(’$staff’ シングルコーテーションでは動作しませんでした)
売上のデータは
・売上
・担当者(投稿オブジェクトで選択されている)
という構造ですね。
そして、別の画面で集計ボタンなどを押下した際にPOSTデータから担当者を取得して集計する、という仕組みと認識しました。
Advanced Custom Fieldsを使うと、以下のようなデータ構造になっています。
■売上データ(投稿)
ID:1
■担当者マスタ(投稿)
ID:2
title:山田太郎
■postmeta
post_id:1
staff:2
postmetaに直接’山田太郎’という名前が入るわけではなく、山田太郎という担当者名はあくまでstaffの投稿タイトルとして保持されており、売り上げデータと山田太郎の関連付けをpostmetaで行っています。
これをふまえて、山田太郎の売上データを全て取得するためには、
(1)山田太郎の担当者マスタの投稿IDを取得する。
(2)その投稿IDをメタデータstaffに保持する投稿を検索
します。
function get_target($staff_name){
$post_staff = get_posts( array( 'title' => $staff_name ) ); //(1)
$posts = get_posts(
array(
'meta_key' => 'staff',
'meta_value' => $post_staff[0]->ID
)
); //(2)
var_dump($posts);
}
引数$staff_nameは$_POST[‘staff’]で取得した名前を渡している前提です。
CODEXではget_postsのパラメータにtitleは見当たりませんでしたが、コアのソース(4.6.1)では処理している様子でしたので指定して担当者マスタを検索しています。
対象データが非常に多い場合は、このような集計をする場合は実際にはSQLを流して集計する方が飛躍的にパフォーマンスがいいと思います。
munyagu様
お世話になります。
何度もご回答いただきありがとうございます。
内容をあまり理解できないままにご回答をコピペして
試してみたのですがうまくいきません。
スタッフのID取得の(1)はちゃんとID 取得できましたが、
リクエストの中にご回答いただいた内容をどのように組み込むのかが
わかりません。
(new WP_Query内でさらにget_postもしてみたのですがうまくいきませんでした)
今一度ご教授いただければ幸いです。
よろしくお願いいたします。
トライ1___ご回答内容を追加
$staff_name = “山田太郎”; //***今回追加
function get_target($staff_name){
$post_staff = get_posts( array( ‘title’ => $staff_name ) ); //(1)
$posts = get_posts(
array(
‘meta_key’ => ‘staff’,
‘meta_value’ => $post_staff[0]->ID
)
); //(2)
$_POST[‘metakey’]; はフォームよリ担当者を選択 <===ソート用
$_POST[‘order’]; はフォームよリ昇降順を選択 <===ソート用
$_POST[‘staff’];はフォームよリ担当者を選択 <===絞り込み用
$staff = $_POST[‘staff’];
$metakey = $_POST[‘metakey’];
$order = $_POST[‘order’];
$args = array(
‘’cat’=>2,’posts_per_page’ => -1, <===カテゴリ用
‘orderby’=>’meta_value’,’order’=>”$order”,’meta_key’=>”$metakey”, <===ソート用
get_target($staff_name); //***今回追加
);
$List = new WP_Query($args);
if($List->have_posts()):while($List->have_posts()):$List->the_post();
ここに表
endwhile;endif;
トライ2___ご回答内容を分解して追加
$_POST[‘metakey’]; はフォームよリ担当者を選択 <===ソート用
$_POST[‘order’]; はフォームよリ昇降順を選択 <===ソート用
$_POST[‘staff’];はフォームよリ担当者を選択 <===絞り込み用
$staff_name = “山田太郎”; //***今回追加
$post_staff = get_posts( array( ‘title’ => $staff_name ) ); //***今回追加
$staff = $_POST[‘staff’];
$metakey = $_POST[‘metakey’];
$order = $_POST[‘order’];
$args = array(
‘’cat’=>2,’posts_per_page’ => -1, <===カテゴリ用
‘orderby’=>’meta_value’,’order’=>”$order”,’meta_key’=>”$metakey”, <===ソート用
array( //***今回追加
“meta_key”=>’s_s_staff’, //***今回追加
‘meta_value’=> $post_staff[0]->ID //***今回追加
),
)
);
$List = new WP_Query($args);
if($List->have_posts()):while($List->have_posts()):$List->the_post();
ここに表
endwhile;endif;
こんにちは
コードはサンプルなので、そのままで正しく取得できるかは当方では分かりません。
例えば、担当者マスタがpostではないカスタム投稿タイプなのであれば、get_postsの引数にそれを追加する必要もあります。
実務ではさらに期間も指定できないと使い物にならない気もしますが・・・
get_postsを使ったので混乱されたのかと思いますが、WP_Queryのパラメータに入れてしまえばいいと思います。
$staff_name = “山田太郎”; //***今回追加
$post_staff = get_posts(array('title' => $staff_name));
$args = array(
'cat' => 2,
'posts_per_page' => -1,
'orderby' => 'meta_value',
'order' => $order,
'meta_key' => 'staff',
'meta_value' => $post_staff[0]->ID
);
$List = new WP_Query($args);
if($List->have_posts()):while($List->have_posts()):$List->the_post();
// ここに表
endwhile;endif;
munyagu様
お世話になります。
何度もご回答いただき本当にありがとうございます。
やはりうまくいかないので、今回は投稿オブジェクトでの絞り込みをあきらめ、
フィールドタイプをセレクトに変更して対応することにしました。
今後、munyagu様の回答を参考にさせていただき管理システムを
ブラッシュアップさせていきたいと思います。
長々とお付き合いいただきありがとうございました。
データーべス見れば早いかなと思いますが、投稿オブジェクトstaffには関連付けられた山田太郎というタイトルの投稿のpost_idが収められていて、それをもとにACF内でオブジェクト(タイトルやらリンクやら投稿者やらのひとかたまり)を取得しget_fieldで返してるということでしょうか。そもそも$_post[staff]の中身は、山田太郎というtitleではなく、山田太郎の投稿ID(数字)にすればよかったんでは。
解決済みのようなので、便乗で一つ添削していただけるとありがたいです。
カスタム投稿 売上 カスタム分類 担当者 (必要ならカスタム投稿 社員)
site_url/?post_type=売上
テンプレート archive-売上.php
site_url/?担当者=山田
テンプレート taxonomy-担当者.php
こっちはカスタム投稿 社員以外とかにしないとだめかも。
社員呼びたかったら
site_url/?社員=山田
テンプレート single-社員.php
あとユーザー登録して、author関連で絞り込みもできたんでしょうか。
oisit様
お世話になります。
お返事ありがとうございます。
$_post[staff]はIDでも確認済みです。(ダメでした)
添削もうまく表示出来ません。
今後、もっと経験を積んでから再度チャレンジしたいと思います。
(今回は業務に遅れが出るといけないので妥協します。)
ありがとうございました。
お仕事頑張ってください。
再チャレンジの時の参考に(ついさっき見つけた)
Advanced Custom Fieldsプラグインを使う際の注意点など
結局、ACF専用のget_field関数使わないとだめだったって話かもしれませんね。