サポート » 使い方全般 » meta_queryによるカスタムフィールドの複数値によるソート

  • `
    <?php

    $args = array(
    ‘cat’ => 1,
    ‘showposts’ => -1,
    ‘meta_query’ => array(
    ‘relation’ => ‘AND’,
    ‘meta_time’ => array(
    ‘key’ => ‘time’,
    ‘type’ => ‘numeric’,
    ),
    ‘meta_start’ => array(
    ‘key’ => ‘start’,
    ‘type’ => ‘numeric’,
    ),
    ),
    ‘orderby’ => array(
    ‘meta_time’ => ‘asc’,
    ‘meta_start’ => ‘asc’
    )

    );

    $the_query = new WP_Query( $args );
    ?>`

    上記の2つのカスタムフィールドの値でソートしたいのですが、
    うまくいきません。。
    なぜか、meta_timeの方だけ効いていて、meta_startの方が無視されます。
    試しに順番を入れ替えてみても変わらず、timeのみでソートされます。

    また、timeの方を消してstartのみにするとちゃんとstartでソートされます。
    下記のようにです。

    `
    <?php

    $args = array(
    ‘cat’ => 1,
    ‘showposts’ => -1,
    ‘meta_query’ => array(
    ‘relation’ => ‘AND’,
    ‘meta_start’ => array(
    ‘key’ => ‘start’,
    ‘type’ => ‘numeric’,
    ),
    ),
    ‘orderby’ => array(
    ‘meta_start’ => ‘asc’
    )

    );

    $the_query = new WP_Query( $args );
    ?>`

    何がいけませんでしょうか?

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • 順序指定にカスタムフィールドは1個までしか使えないのが現在のWordPressの仕様みたいです。同じことをやりたくてできない、というトピックが過去に出ていました。

    フィルターフックを使って対処した例もありました(検証してはいませんが)
    WordPress › Support » OrderBy multiple meta_key ?
    いったん menu_order をソートキーの先頭に指定しておき、フィルターでそれをカスタムフィールドへ置き換える(クエリ文字列を書き換える)という方法みたいです。

    トピック投稿者 cheche0830

    (@cheche0830)

    ご回答ありがとうございます。

    meta_queryを利用すれば、
    ver4.4.2では複数カスタムフィールドの値でソートできるようなのですが、
    いかがでしょうか?
    http://notnil-creative.com/blog/archives/3672
    こちらを参考にしているのですがうまくいかず・・・

    cheche0830さん、申し訳ありません。古い情報でしたので無視してください。

    以下のコードで(cheche0830さんと同じコードだと思います)無視されずソートできました。ただし time と start のどちらか片方だけついている投稿は出力されませんでした。

    <?php
    $args = array(
    	'nopaging' => 'true',
    	'meta_query' => array(
    		'relation' => 'AND',
    		'meta_time' => array(
    			'key' => 'time',
    			'type' => 'numeric',
    		),
    		'meta_start' => array(
    			'key' => 'start',
    			'type' => 'numeric',
    		),
    	),
    	'orderby' => array(
    		'meta_time' => 'asc',
    //		'meta_time' => 'desc',
    		'meta_start' => 'asc',
    //		'meta_start' => 'desc',
    	)
    );
    $the_query = new WP_Query( $args );
    echo "\n<ol>";
    while ( $the_query->have_posts() ) {
    	$the_query->the_post();
    	echo "<li>", get_the_title(), "</li>";
    }
    echo "</ol>\n";
    wp_reset_postdata();
    ?>

    トピック投稿者 cheche0830

    (@cheche0830)

    ありがとうございます。
    一応、queryの部分をコピーして貼り付けてみたのですが、
    やはり、timeの方しかソートされないので、
    もう少し調べてみます・・・

    書き忘れてましたが WordPress 4.5.1 で検証しました。

    トピック投稿者 cheche0830

    (@cheche0830)

    いろいろ試しまして結局下記で実現できました。

    $args = array(
                      'cat' => 1,
                      'showposts' => -1,
                      'meta_query' => array(
                        'relation' => 'AND',
                        'start' => array(
                          'key' => 'start',
                          'type' => 'numeric',
                        ),
                        'time' => array(
                          'key' => 'time',
                          'type' => 'numeric',
                        ),
                      ),
                      'orderby' => array(
                          'start' => 'ASC',
                          'time' => 'ASC',
                      ),
                    );

    理由はわからないのですが、
    meta_をとったらできました。。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「meta_queryによるカスタムフィールドの複数値によるソート」には新たに返信することはできません。