サポート » 使い方全般 » 複数の日付形式カスタムフィールドの並べ替え

  • 解決済 makiko_sho

    (@makiko_sho)


    当方のスキルは、PHPはネットで調べてコピペする事がメインで、自作することはできません。
    WPのバージョンは4.8.1です。

    現在、1記事(支店情報が入った記事)に対して日付のカスタムフィールド(デイトピッカーで入力)を4つ設定(当番日)し、当番表を作ろうとしています。
    先週meta_keyを複数の条件で変数に代入しindexに表示でも質問させていただいた内容で、「まずはじめに全ての記事を表示してから、表示する条件を指定しては?」と言う教えをいただき、表示をしようとしています。

    今問題になっているのが、
     ・1記事のタイトルを当番日の数(4つあれば4回)表示したいが表示されない。
     ・当番日の若い順に表示したいが順番が投稿日順になってしまっている。
    の2点です。

    コードは以下の様にしています。
    当番日を入れていないデータと、表示している日以前の日付を表示しない様にしたかったので、`’meta_compare’ => ‘>=’,
    ‘meta_value’ => date(“Y/m/d”),
    ‘meta_type’ => ‘DATE’,`
    を指定し、さらにmeta_queryでvalueとcompareを下記のコードの様に指定しています。

    <?php
    global $post;
    
    //表示している日以降の日の値を表示
    $args = array(
    	'post_type' => 'member-ph',
    	'posts_per_page' => -1,
    	'orderby' => 'meta_value',
    	'order' => 'ASC',
    	'meta_compare' => '>=',
    	'meta_value' => date("Y/m/d"),
    	'meta_type' => 'DATE',
    	'meta_query' => array(
    		'relation' => 'OR',
    			array(
    			'key' => 'duty-date',
    			'value' => ' ',
    			'compare' => '!=',
    			'order' => 'ASC',
    			),
    			array(
    			'key' => 'duty-date02',
    			'value' => '',
    			'compare' => '!=',
    			'order' => 'ASC',
    			),
    		),
    	);
    $myposts = get_posts( $args );
    
    foreach ( $myposts as $post ) : setup_postdata( $post );

    「当番日を4つ」と前述しておりますが、テストなのでコード内では2つしか指定していません。

    コードの中の一番下のforeachの中で、当番日1(duty-date)が値があったら表示し、さらに当番日2(duty-date02)があったら表示という風にループを回してやることで最初の「・1記事のタイトルを当番日の数(4つあれば4回)表示したいが表示されない。」が改善されると思うのですが、ifしか使ったことがないので、表示できていません。

    「・当番日の若い順に表示したいが順番が投稿日順になってしまっている。」については、orderが機能していない様なので、meta_valueのあたり変更しなければならないでしょうか?

    ご教授ください。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    dateの形式はハイフン区切りじゃないとダメだったような気がします。

    トピック投稿者 makiko_sho

    (@makiko_sho)

    mypacecreatorさん
    返信ありがとうございます。
    dateの形式を「y-m-d」に修正し、カスタムフィールドのフォーマットも「yy-mm-dd」に修正した所、若い日付順に並びました!ありがとうございます。

    引き続き、こちらのトピックタイトルにある「1記事のタイトルを当番日の数(4つあれば4回)表示したいが表示されない。」について、ご回答お待ちしております。

    なるほどやはりクエリで表示をコントロールされるのですね。
    しかし記事を抽出するのと条件により重複させるのは相反する動作を一度にするわけで困難ではないでしょうか。
    抽出となると条件を満たしたキーが一つになるようにされた記事がでてくるのみになると思います。
    ここで問題になるのが、複数個に重なる結果になる条件について複製したい場合の、その複製する条件の基準がありますでしょうか。
    言葉的にはメタが基準になると思われると考えますが、メタは準拠する対象であって基準に沿わせるもの、基準とはカレンダーになると思います。メタだけでカレンダーの作成は可能な状態でしょうか。

    そこでまずカレンダー二ヶ月分を用意してその日付ごとに合致する記事をあてはめていけば、全部の記事を毎回日付ごとにループさせて、合致する日付をもっていればその日の表示にあてはめていく。これでカレンダーの日に合致した記事があてはめれられるのではないでしょうか。

    単純に考えるとphpのstrtotime関数で2ヶ月分のカレンダーを作成しその日付ごとに毎回wp_queryをすればできそうですが、ものすごく無駄が多そうなのは想像に難くないと思います。
    そこで全件の menber-ph を抽出して100件ほど、これを表示状態にまで整形したものを配列形式の変数にいれて、そこにメタの日付も入れておきます。
    その整形された変数、全てのワードプレス記事情報が載ったものから必要最小限に絞った全件の配列に対して日付抽出を2ヶ月分順番に全件行えば、比較的軽量に現状のデーターベースに対して抽出ができないでしょうか。

    もしこの案をお試しいただけるようであれば、最終的に記事から必要なデータは何が必要かお教えていただければプログラムの構文をお出しできると思います。たとえばタイトル、メタの要素、更新日、コンテンツ、記事IDなど、表示に必要な要素があれば試作は可能だと思います。もちろんあとから増減あっても問題ありません。

    この案の作業は
    1、カレンダーデータを作成する
    2、カレンダーの日付をキーにした配列変数を用意する
    3、member-ph データを全件抽出する
    4、必要最低限のmember-ph 情報を変数Aに移す。
    5、変数A全件に対してカレンダー日付を一件ずつ確認し合致すれば確保する。(100循環x60循環)
    6、日付をキーにした配列に表示すべきmember-ph の記事が格納される。
    という作業を予定しています。
    ちなみに6000も抽出を循環させるのは大変無駄が大きいと感じるかもしれませんがwp_queryの中だけでも相当に接合、抽出がなされているので負荷はこれの何十倍にもなると思います。

    ほかに、タグを使うというのも考慮いただければ、タグの抽出だけで日付はとれそうな気もします。これは構造定義がかわると思うのでよろしくないかと思うのと、2ヶ月分であれば数字が重複するので月を含む必要があり結果366種類のタグが必要にはなると思います。運用次第では62で済むと思いますが。

    いかがでしょうか。

    トピック投稿者 makiko_sho

    (@makiko_sho)

    msioさん

    こちらでもご返信いただきありがとうございます。
    お返事遅くなってすみません。

    実は社内の利用者から「入力しづらい」と指摘があり、登録画面を変更することとなりました。
    折角色々とご尽力いただいたのですが、そもそも私が頭を悩ませていたことは、利用者の立場に立った画面仕様になっていなかったと言う・・・一番大事な所が欠けておりました。

    新しい登録画面は、イベントカレンダープラグインを利用し、登録・表示する形となりました。
    こちらは、一度担当支店情報を登録してしまえば、「繰り返し」機能を使うことで、ひと月にいくつでも当番が出来るようになっているので、私の方でテーマの修正を若干施せば良いようになっています。
    プラグインは本当に便利ですね:)

    長い時間お付き合いくださいましてありがとうございました。

    わたしもよい経験値が得られました。ありがとうございました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「複数の日付形式カスタムフィールドの並べ替え」には新たに返信することはできません。