meta_keyを複数の条件で変数に代入しindexに表示
-
お世話になります。
現在、以下の様にカスタム投稿の情報をmeta_key(デイトピッカーから入力された日付)を1つ指定して、表示している日から2週間分のデータをindexに表示しています。
この度、4つのmeta_keyを指定して、期間中に4つある場合は4つ表示したいと考えております。
$meta_key = 'hoge-date','hoge-date02','hoge-date03','hoge-date04';
と指定してみたのですが、うまくいかず、データが表示されませんでした。$meta_key =array( array('key' => 'hoge-date'), array('key' => 'hoge-date02'), array('key' => 'hoge-date03'), array('key' => 'hoge-date04'), relation => 'AND' );
としてみたのですが、こちらもエラーが出てしまい、表示されません。
`<dl class=”hoge clearfix”>
<?php
global $post;$meta_key = ‘hoge-date’;
$w = date(“w”,time());
$today = date(‘Ymd’);
$ones_week = date(‘Ymd’, strtotime(‘+2 week’));$mydata = get_posts( array(
‘posts_per_page’ => -1,
‘post_type’=> ‘member-ph’,
‘orderby’ => ‘meta_value’,
‘order’ => ‘ASC’,//2週間以内の当番のみ表示
‘meta_query’ => array(
‘relation’ => ‘AND’,
array(
‘key’ => $meta_key,
‘value’ => $today,
‘type’ => ‘numeric’,
‘compare’ => ‘>=’,
),
array(
‘key’ => $meta_key,
‘value’ => $ones_week,
‘type’ => ‘numeric’,
‘compare’ => ‘<=’,
),
),
) );
if( !empty( $mydata ) ) {
foreach( $mydata as $post ) {
setup_postdata( $post );//変数に格納
$date = get_field(‘hoge-date’,$post_ID);
$name = get_the_title($post_ID);
$tel = get_field(‘ph-telephone’,$post_ID);
$add = get_field(‘ph-address’,$post_ID);if(get_field(‘hoge-date’)): //指定がないものは非表示
echo ‘<dt>’ .date(‘Y年n月j日’, strtotime($date));
$day = date(‘(D)’, strtotime($date));
//曜日を日本語に変換
$str = $day;
$search = array(‘Sun’,’Mon’,’Tue’, ‘Wed’, ‘Thu’, ‘Fri’, ‘Sat’);
$replace = array(‘日’,’月’,’火’, ‘水’, ‘木’, ‘金’, ‘土’);
echo str_replace($search,$replace,$str). ‘</dt>’; //曜日
echo ‘<dd class=”ph-name”>’ .$name. ‘</dd>’;
echo ‘<dd class=”tel-no”><i class=”fa fa-phone” aria-hidden=”true”></i> ‘ .$tel. ‘ ’;
echo ‘<span class=”br-mob”><i class=”fa fa-map-marker” aria-hidden=”true”></i> <a href=”https://maps.google.co.jp/maps/search/’ .$add. ‘” target=”_blank”>’;
echo $add.'</a></span></dd>’;
endif;
}
}
wp_reset_postdata();
?>
</dl>`どこを改善すれば表示されるのか、それともそもそもすべて作り直す必要があるのか、ご教授ください。
-
ちなみに
$meta_key =array( array('key' => 'hoge-date'), array('key' => 'hoge-date02'), array('key' => 'hoge-date03'), array('key' => 'hoge-date04'), relation => 'AND' );
した時のエラーメッセージが
Warning: trim() expects parameter 1 to be string, array given in ***\wp-includes\class-wp-meta-query.php on line 584
と出ました。(***は、伏字です。)普通に考えたらこうではないですか?
$meta_key = array( 'hoge-date','hoge-date02','hoge-date03','hoge-date04' );
manboさん
ご回答ありがとうございます。
ご提示いただいた内容、実は試してまして、Warning: trim() expects parameter 1 to be string, array given in ***\wp-includes\class-wp-meta-query.php on line 584
というエラーメッセージが表示されます。(***は、伏字です。)
この$meta_keyは、以下のmeta_queryの中でkeyとして使用しているのですが、複数のkeyがダメなのかなぁと漠然としたイメージしかなく、良く分かっていません。
‘meta_query’ => array( ‘relation’ => ‘AND’, array( ‘key’ => $meta_key, ‘value’ => $today, ‘type’ => ‘numeric’, ‘compare’ => ‘>=’, ), array( ‘key’ => $meta_key, ‘value’ => $ones_week, ‘type’ => ‘numeric’, ‘compare’ => ‘<=’, ), ), ) );
仕様としましては、現在2週間分表示されていらっしゃいますデータをメタで設定してある4つの要素のうちいずれかが合致していれば表示し、合致がなければ表示しないということでしょうか。
データベースとしては平行して複数の条件を単一の項目にあてがうのは直接的なクエリでないとむつかしいと思います。
間接的に処理しようとする場合は、表示されている2週間分のデータについてget_post_meta(get_the_id(), "hoge-date", true);
などで抽出して検証しそれを表示ないしは変数に格納してしかるべき処置にするというのはいかがでしょうか。msioさん
私の言葉足らずで「何をしたいのか」が明確でなかったですね。
後だしですみません。カスタムフィールドで、当番日1、2、3、4というフィールドを用意して当番表を作っています。
「2週間分の日付データを出力」ですが、「4つのうちいずれかが合致」ではなく、「4つの日付データのうち、1つでも日付データがあれば表示」です。日付データがなければ表示しません。
担当が複数人いて、1ヶ月のうち1回しか当番が回ってこない人、2回当番が回ってくる人、4回回ってくる人がいて、それを2週間分表示したいのです。当番の日付が入っていない(当番ではない)人は表示させません。msioさんが仰る「間接的に処理」する場合は、全体的に見直しで作り直すようにした方が良いという事でしょうか?
ネット上のコードをコピペして組み合わせることしか出来ないのですが、処理としては、
1.各日付データをすべて取得・抽出、変数に格納
2.2週間分だけ表示する処理をする
3.表示する
という感じでしょうか?ご仕様について理解しました。
各個人の月業務ないしは個人を示す記事があり、それに日程の許容が4つメタでついている状態でしょうか。
2週先までの範囲をその4つあるメタを見て、存在すれば取り上げるということで範囲内の予定のある各記事ないしは個人を引き出す、と考えました。この場合問題がいくつかあるのではと、以下に注意していただければと思いました。
・記事の日付を毎回書き換えるのでしょうか。
履歴となった場合、指定範囲内を検索する母数がまいかい「全記事数」になりたいへんだと思います。母数を絞る方法が必要ではないでしょうか。
履歴がいらない、という場合は記事を毎回変更する形でよいと思いますが、そうなるとその元記事、履歴の残る情報が電子または物理でお持ちではないでしょうか。
もしその元となる情報があるならば、その掲載規則をそのまま取り込むのがよいのではないかと思います。・メタに4つ項目が必要でしょうか。
日程の許容として4段階あり、それをわけるものだと思いますが、個別に役割はあるのでしょうか。たとえば1の日程と2の日程の意味するところは違いますでしょうか。
早出は1、時差は2などあった場合、それらを単体で抽出するタイミング(母数が全体になるのを避ける)があるならば必要かと思いますが、どれも同じ当番で候補の件数上限が4であるならば、メタはひとつで改行などのセパレータを使用して複数日書き込んではいかがでしょうか。
日付が範囲にふくまれているかどうか、を検索するには多少ほねがおれますが機能性は向上すると思います。
日付の目的が均一であればタグでもよいのではと思います。履歴を残されるのであればタグの量がふえてしまいますが月ごとなどで個人記事を書き換えるのであえば日付だけ31個のタグがあれば足りるのではないでしょうか。
また役割と日の関連性が高くあるならば、それらの関係性を記事か関連性のみを記載したメタにして、抽出する日付となるものは別途用意をするのはいかがでしょうか。これらをふまえて、まずメタテーブルから日付の範囲内を検索して、それに結びつく母体の記事を列挙するのがよいと思うのですが、記事に結びつけ肥大化した表示用の記事を抽出するのはあまり効率がよくない気がします。
データベースを直接操作すればたやすいと思いますが準備関数で、となるとハードルがとてもたかい気がします。そういうむつかしい話はおいといて、実現可能ななんらかの方策を練る場合は、作成の手順として
1各当番のユーザーの記事はつねに1記事で、日程は毎月その記事の内容を書き換える。
(基準と履歴となる情報は別にエクセルなどで日程管理しているものとして、WPはあくまで表示用)2全ユーザーをまず表示する機能を作成する。そのうちで指定範囲内の日付をもっている記事については非表示にさせない。
基準にみたなかった記事は随時非表示にする。
または、表示せず全権列挙して、該当する記事は掲載させる処理をすすめる。表示用データを読み込んでいる動作の最中にメタ情報を取得して、あたりならば対象の動作をさせる、という感じでどうでしょうか。
運用状況などにもよるとおもうのですが、管理なのか表示なのかでも構造がかわってくると思います。おおまかに
○必要な項目数だけ抽出クエリで読み出したい。というご要望について
●全対象を読み出して、各件整形して取り込む、または表示する際にメタをチェックして表示する、しないを決定させてみては。
という案になります。
抽出クエリをねりあげるまえに、対象の母数や範囲、記事の増減や履歴の扱いについてもうすこし把握できればよりよい方向性が求められそうな気がしました。
msioさん
ご丁寧にありがとうございます。
担当(個人ではなく支店)を示すカスタム投稿があり、4つの当番日フィールド(メタ)があります。
他に、住所と電話番号などの情報フィールドがあります。
閲覧している日($today)を基準にして、2週間の範囲にあるメタを検索し、該当すれば表示と言う形です。>・記事の日付を毎回書き換えるのでしょうか。
月毎に当番表がExcelで出来上がってくるので、それを見て【月に1回】WPに日付のデータを入れます。
WPは「データ管理」ではなく「データ表示」として利用していますので、その際に前の月のデータは保有する必要がないので消しています。>・メタに4つ項目が必要でしょうか。
当番の日付データを入力するフィールドについては、私も当初1フィールドに複数の日付を改行で入力することを考えていたのですが、なにぶんコードの自作が出来ず、ネット上のコードをコピペし改変するレベルでしか出来ないため、そのフィールドから指定範囲内の日付を抽出することができず、1フィールド1データだと抽出できると思いやってみたのですが、つまづいていると言う状況です。ちなみに担当データは78件あります。
増減はあるようですが、maxで100件を想定しています。なるほど了解しました。
データの抽出母数はおおよそ100件くらいということですね。
流動的なデータと固定的なデータが等しくメタ情報にについているようですが、消すというのはメタ情報を上書きするという認識でよろしかったでしょうか。なのであれば、全件に対して抽出をかけて絞られた結果を受け取り表示するという方向から転換して、全件抽出して、いざ表示するという状態にもっていく際にひとつひとつメタ情報を確認してゆき、そこで条件にあわないものをふるいおとすという作業を考えるのはいかがでしょうか。
現在のデータ構成設計をとくに変更する必要はなさそうだと思います。流れとしては
1)対象となる全ポストについて最低限の抽出を図り列挙の準備をする。(いろいろな記事を含めた全記事中の対象となる100件のみに絞る)
2)列挙されるポストを表示または変数に取り込む際にメタ情報を取得する
3)取得したメタ情報を精査する
4)精査の結果適合しない記事については表示を完了させず次の記事にへ進行するこれを具体的にコードにして埋め込むとご希望の動作になりそうでしょうか。
将来的な拡張予定について機能的に潜在させたくクエリによる抽出を重要視するという場合は根本的にメタ情報を基軸とした設計のほうがよいと思います。
そうなれば、きっと外注を視野にいれられたほうがよいのではと思います。ご検討くださいませ。
msioさん
画像まで添付いただきありがとうございます。
「消す」と言うのは「上書き」するという事です。
フィールドごとに変数に入れてどうこうすると言うよりも、全部取得して、該当するのだけ表示するのですね。
明日から仕事は連休なので、ちょっと自宅でコード含め、考えてみないとですね。
と言うか、基礎がなってないので「クエリ抽出を重要視する」と言うのが分かっていません。
いま現在はWP_Queryを使って検索・抽出していますが、他の方法があるということでしょうか?プログラムの利点は多様性にあって、クエリを使って抽出するのも多様性が長所です。
プログラムやクエリは、多様なデータが山積しているものについて非常に効果を発揮しますが、小規模のデータを整理するのにそこまで全力でかかる選択は不要な場合もあると思います。クエリという表現については「抽出」全般行為にかかわることを示していまして、wp_queryをつかわれますと、ワードプレスの準備した定義での抽出になります。
イメージが共有できるとよいのですが、ワードプレスの準備した関数にて抽出を行う方法は、感覚的に「代理店経由」のようなものです。
直接phpのプログラムを使ってデータベースにアクセスし情報を抽出してくることもできます。この場合は「直接卸から仕入れる」ようなものです。
またそれらの中間をなす技術もあると思います。自由度が圧倒的に高い「卸」や、安定性、安全性の高い「代理店」で手間や安全性に差が出てきます。
「そういう出し方は非効率なのでうちではあつかっていない」という代理店や、「そこまでやるか」という卸の対応などを基準にどのレベルまで掘り下げるか選択肢があっても損ではないと思います。むつかしい方の案ですと、ワードプレス自身がデータベースを読み取りに行くときの接続を利用して直接データベースからデータを抽出し、得られたIDで記事群を整形しようというものです。
クエリという命令文を使用して、データベース内部から切り分けたデータを取りだします。
今回クエリという命令にて小分けにしたデータでなくてはならないほど取り出し口が狭くないか、もしくは取り出すデータが巨大ではない、そのまま持ち出してから表示の直前で切り分けても間に合うのではないかと思った次第です。クエリ、にも難易度高低があり、また作業的にもクエリを使用するしない、で高低がある、ということについては図などで経緯を説明しなくては、文字だけではよけいにややこしくなると思うので今回はそういうものだと思っていただけると幸いです。
工程がお決りになれば逐次必要なコードや設計について、助言をくださる方も多くいらっしゃると思いますのでがんばってください。
msioさん
毎度ご丁寧に解説いただきありがとうございます。
文章でも十分イメージ伝わりました。
クエリというと「WPの中だけで使うプログラム」と思っていましたが、クエリはWPだけではないんですね。
また、いちいち変数に入れて~と言うやり方をやるのが当たり前だと思っていたのですが、見方を変えてやる事も大事なんですね。もう少し自分の中で整理してみて、改めて別スレで質問をしたいと思いますので、こちらは解決済みと致します。
msioさん、長い時間お付き合いくださいましてありがとうございました。
- トピック「meta_keyを複数の条件で変数に代入しindexに表示」には新たに返信することはできません。