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つにできるかもしれません・・・投稿数が少ないとほどんどメリットがありませんが。
munyaguさん、ありがとうございます!
ご提示頂いたもので期待通りに表示ができました。
追加の質問で恐縮なのですが、
①それぞれの記事にカスタムフィールドがあった場合はどのようにすればよいでしょうか?
②こちらのやり方でも同じことが実現可能なのでしょうか?
もっと簡単版!WordPress
投稿の並び順の条件(orderby)を複数にして、それぞれの並べ方(order)を別々に指定したい。
またCGさん、photographer hiro.さん、ご回答ありがとうございました!
①カスタムフィールドの値がソート対象の日付フィールドである場合には、上記ソースを少し書き換える必要があります。
カスタムフィールドの値を取得したいだけなら、$postが取得できているので、
get_post_meta($post->ID, $key, $single)
とか、プラグインをお使いなら用意されている関数などで取得できると思います。
②その方法では実現できません。
order byを変更するだけではダメなのです。
munyaguさん、たびたびありがとうございます。
get_post_meta($post->ID, $key, $single)でうまくいかなくて困っていたのですが、
プラグインをお使いなら用意されている関数などで取得できると思います。
という言葉で助かりました!
取得したデータをvar_dumpで確認したところデータの持ち方が少し特殊な形になっていたのでget_post_metaだけでは取得ができなかっただけでした。
また②の件、承知しました。こちらの内容は、うまく消化ができていないのでまた改めて読み直してみようと思います。