• 解決済 senkegs

    (@senkegs)


    カスタムフィールドの投稿について教えてください。

    イベントに日にちを記入した投稿を

    ・投稿の順番を記入した投稿をソート(数字が少ない記事が上に)
    ・それ以外をイベント日時でソート(最新記事が上に)

    したいのですが、どのようにすればよいでしょうか?

    現状のコード

    <?php
    
    $args =array(
    
      'orderby' => array (
      	'day' => 'meta_value',
      	'number' => 'meta_value_num'
      	),
    
      'order'=>array (
      	'day' => 'DESC',
      	'number' => 'ASC'
      	),
    
    	'meta_query' => array(
    		array(
    			'key'=>'number'
    			),
    		array(
    			'key'=>'day',
    			)
    
    	)
    
    );
    
     ?>
    
    $query = new WP_Query( $args );
    
    <?php while ( $query->have_posts() ) : $query->the_post(); ?>
    
    		<?php
    			get_template_part( 'content', get_post_format() );
    			?>
    	<?php endwhile; ?>

    ‘number’が優先順位、’day’がイベントの日にちのキーです。
    ‘day’ => ‘meta_value’になっているのは、イベントが複数の日に渡ることがあるので、’date(‘Y-m-d’)’にしませんでした。

    以前の投稿にあります、カスタムフィールドの日付でソート
    https://ja.forums.wordpress.org/topic/22997
    を参考にしつつ、meta_queryで複数のソートができるようになった、というのを拝見し現状のようになりました。

    上記のコード自体怪しいのですが、投稿の順番をすべてに記入するわけではないので、この方法だとよくないのか、とも思っています。
    投稿の順番を記入をしない場合、デフォルトの値として何か指定されていてもかまいません。

    また、今日の日付が過ぎると掲載されないようにしたいのですが、イベントが複数の日に渡るため、この場合は別途、掲載終了日を記入するようにすれば良いでしょうか?

    ご教授頂ければ幸いです。
    よろしくお願いします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 複数キーでのソートについて、私は試していませんが、下記の記事が参考になるかと思います。

    WordPress 4.2 から可能になった、カスタムフィールドの複数ソート

    Query improvements in WP 4.2: ‘orderby’ and ‘meta_query’

    ふたつ目の記事は英語ですが、こちらの方が読みやすいかもです。

    イベントの日付については、私なら開始日と終了日で別のフィールドを設定するかなと思います。

    トピック投稿者 senkegs

    (@senkegs)

    ありがとうございます。
    日本語のリンク先や色々と見ていたのですが、未だによく分かりません…教えて頂いた英語サイトの方が分かりやすいのは確かですが..

    orderbyが’meta_value”meta_value_num’、orderが’DESC”ASC’であったものが、複数ソートになるとorderbyが’DESC”ASC’になるのが、謎すぎて..

    あれから、これらのリンク先

    WordPressで指定したカスタムフィールドが存在しない場合の投稿一覧を取得する方法
    get_postsで、複数のカスタムフィールドをキーにして検索・取得する方法

    を参考にして、
    ‘meta_value’ => ‘null’,
    ‘meta_compare’ => ‘!=’

    ‘meta_compare’ => ‘NOT EXISTS’
    と試しましたが、そもそもnumberを記入した記事しか表示されていないので、別のところがおかしいのでしょうか。

    $args =array(
      'orderby' => array (
      	'day' => 'DESC',
      	'number' => 'ASC'
      	),
    	'meta_query' => array(
    		array(
    			'key'=>'number',
    			'meta_value' => 'null',
    			'meta_compare' => '!='
    			),
    		array(
    			'key'=>'day',
    			'meta_compare' => 'NOT EXISTS'
    			)
    	)
    );

    イベントの終了日の設定は、別項目として設けたいと思います。
    ありがとうございます。

    一応手元で試したのですが、下記のようにしてソートできました。
    numberフィールドについては必須として、デフォルト値を100みたいな運用を想定しました。優先させたいものは小さい数値を指定するイメージです。

    $args = array(
      'meta_query' => array(
        'relation' => 'AND',
        'meta_number' => array(//ソート用のラベルを設定
          'key' => 'number',//特にクエリの条件は不要かと
        ),
        'meta_day' => array(//ソート用のラベルを設定
          'key' => 'day',//こちらもクエリの条件は不要かと
        ),
        'meta_endday' => array(//新しくイベント終了日フィールド(デートピッカー)を設定する。本日以降に終了するイベントのみ取得
          'key' => 'endday',
          'compare' => '>=',
          'value' => date("Y-m-d"),
          'type' => 'DATE',
        ),
      ),
      'orderby' => array (//先に設定したソート用のラベルを使用してソート順を設定
        'meta_number' => 'ASC',
        'meta_day' => 'DESC',
      ),
    );
    $query = new WP_Query( $args );
    トピック投稿者 senkegs

    (@senkegs)

    ありがとうございます。
    ‘relation’ => ‘AND’が肝だったのですね..

    ‘meta_カスタムフィールド名’でも実装できるとは、初めて知りました。
    勉強になります。

    教えていただいたもので十分実装できたのですが、もしよろしければ以下も教えて頂ければ幸いです。
    試しにmeta_queryを以下のようにすると、優先順位のソートはできたものの、開催日でのソートがうまく実装できなかったのですが、

    array(
    ‘key’ => ‘number’,
    ),

    ‘meta_number’ => array(
    ‘key’ => ‘number’,
    ),

    では設定しているものが違うのでしょうか…?

    $args = array(
      'meta_query' => array(
        'relation' => 'AND',
          array(
           'key' => 'number',
           ),
          array(
           'key' => 'day',
           ),
          array(
           'key' => 'endday',
           'compare' => '>=',
           'value' => date("Y-m-d"),
           'type' => 'DATE',
          	)
         ),
       'orderby' => array (
         'number' => 'ASC',
         'day' => 'DESC',
        ),
      );

    少し勘違いさせてしまったかもしれないですが、’meta_カスタムフィールド名’で実装しているわけではないです。
    meta_numberとmeta_dayは単純に最後のorderbyで指定するためのラベルで、文字列としてはhogeとかfugaとかなんでも大丈夫です。
    WP4.2からこの複数のカスタムフィールド値でのソートができるようになったようですが、そのために

    'meta_number' => array(
    'key' => 'number',
    ),

    のような設定方法が必要になっています。
    ですので、お書きになられているmeta_queryの書式では複数のカスタムフィールド値でのソートはできません。

    トピック投稿者 senkegs

    (@senkegs)

    なるほど、ありがとうございます。
    複数ソートの場合はこれまでの書き方から変えないといけないのですね。
    とてもよくわかりました!

    お忙しい中教えていただき、大変助かりました。
    どうもありがとうございます。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「カスタムフィールドでの投稿順のソート、及び日付でのソート」には新たに返信することはできません。