サポート » 使い方全般 » 同じタイトルごとでまとめながら新しい日付順に表示したい

  • 解決済 so-taro

    (@so-taro)


    いつもお世話になります。
    下記のような並び替えを行いたいのですがうまく実現できません。
    どのようにすればよいか教えていただけないでしょうか?

    id  title  date
    ---------------------
    1  AAAAA  2017-01-23
    2  AAAAA  2017-01-12
    3  BBBBB  2017-01-01
    4  CCCCC  2017-01-18
    5  CCCCC  2017-01-10


    【やりたいこと】
    日付ごとで並び替えをしつつ、同じタイトルがある場合はまとめたい。

    id  title  date
    ---------------------
    3  BBBBB  2017-01-01←ここの日付で並び替え
    5  CCCCC  2017-01-10←ここの日付で並び替え
    4  CCCCC  2017-01-18
    2  AAAAA  2017-01-12←ここの日付で並び替え
    1  AAAAA  2017-01-23

    どうぞよろしくおねがいいたします。
    タイトルがわかりづらくて申し訳ありません。。。

    • このトピックはso-taroが6年、 8ヶ月前に変更しました。
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • CG

    (@du-bist-der-lenz)

    条件分岐をタイトルの昇順、第2条件を、日付の降順にしてはいかが

    so-taroさん

    多分、du-bist-der-lenzさんが言われてるのはこんな感じだと思います。

    
    
    $args = array(
    	'orderby'   => 'title date',
    	'order'     => 'ASC',
    );
    $query = new WP_Query( $args );
    
    

    こんにちは

    CGさんやphotographer hiro.さんの案ではso-taroさんのやりたいようには並ばないと思います。
    それでは以下のようになってしまいます。

    id  title  date
    ---------------------
    2  AAAAA  2017-01-12
    1  AAAAA  2017-01-23
    3  BBBBB  2017-01-01
    5  CCCCC  2017-01-10
    4  CCCCC  2017-01-18

    お望みの結果になるためには、1番目のソートキーは、各タイトルのうち、一番小さい日付です。
    AAAAAの一番小さい日付「2017-01-12」よりもCCCCCの一番小さい日付「2017-01-10」の方が小さいため、AAAAAよりCCCCCが上に来る結果となります。

    で、どうすればいいのか。

    これはもう、説明も難しいので、サンプルコードを載せておきます。

    下記をfunctions.phpに追記してください。

    function my_get_date_title_order(){
    	
    	global $wpdb;
    	
    	$results = $wpdb->get_results( "SELECT post_title, min(post_date) as post_date FROM " . $wpdb->posts . " where post_type = 'post' and post_status = 'publish' group by post_title order by post_date" );
    	
    	$posts = array();
    	foreach($results as $post){
    		$ordered = $wpdb->get_results( "SELECT * FROM " . $wpdb->posts . " where post_title = '" . $post->post_title . "' and  post_type = 'post' and post_status = 'publish' order by post_date" );
    		$posts = array_merge($posts, $ordered);
    	}
    	
    	return $posts;
    }

    呼び出し側はこんな感じです。

    $posts = my_get_date_title_order();
    foreach($posts as $post){
    	echo $post->post_title . ' ' . $post->post_date . "\n";
    }

    どうやって実現しているかの説明は長くなるので、興味があればSQLについて調べてみてください。
    SQLが2つに分かれていますが、がんばれば1つにできるかもしれません・・・投稿数が少ないとほどんどメリットがありませんが。

    トピック投稿者 so-taro

    (@so-taro)

    munyaguさん、ありがとうございます!
    ご提示頂いたもので期待通りに表示ができました。

    追加の質問で恐縮なのですが、

    ①それぞれの記事にカスタムフィールドがあった場合はどのようにすればよいでしょうか?

    ②こちらのやり方でも同じことが実現可能なのでしょうか?
     もっと簡単版!WordPress
    投稿の並び順の条件(orderby)を複数にして、それぞれの並べ方(order)を別々に指定したい。

    またCGさん、photographer hiro.さん、ご回答ありがとうございました!

    ①カスタムフィールドの値がソート対象の日付フィールドである場合には、上記ソースを少し書き換える必要があります。
    カスタムフィールドの値を取得したいだけなら、$postが取得できているので、
    get_post_meta($post->ID, $key, $single)
    とか、プラグインをお使いなら用意されている関数などで取得できると思います。

    ②その方法では実現できません。
    order byを変更するだけではダメなのです。

    トピック投稿者 so-taro

    (@so-taro)

    munyaguさん、たびたびありがとうございます。

    get_post_meta($post->ID, $key, $single)でうまくいかなくて困っていたのですが、

    プラグインをお使いなら用意されている関数などで取得できると思います。

    という言葉で助かりました!
    取得したデータをvar_dumpで確認したところデータの持ち方が少し特殊な形になっていたのでget_post_metaだけでは取得ができなかっただけでした。

    また②の件、承知しました。こちらの内容は、うまく消化ができていないのでまた改めて読み直してみようと思います。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「同じタイトルごとでまとめながら新しい日付順に表示したい」には新たに返信することはできません。