meta_queryを使用して、カスタムフィールドでフィルタリングし、別のフィールドで並べ替えるにはどうすればよいですか?


10

次のコード(functions.php内)を使用すると、(CPTイベントの)私の投稿は_start_dateではなく_end_date順に並べられます。WP 3.1.3以降、これに対する適切な解決策は何ですか?もちろん、非推奨のの使用は避けたいですmeta_key

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
                                   array(
                                         'key' => '_end_date',
                                         'value' => time(),
                                         'compare' => '>=',
                                         'type' => 'numeric'
                                        )
                                   )
                              );
  }
  return $query;
}

回答:


15

これはWordpressのバグのようです。クエリ変数としてorderbyおよびmeta_keyを指定すると、Wordpressは実際にmeta_queryを変更します。通常、この変更は新しいmeta_keyをmeta_query配列の最初の配列として追加するため、orderbyはmeta_queryで指定された最初のメタキーに適用されます。

しかし、pre_get_postsフィルターでorderby、meta_key、meta_value query_varsを変更すると、Wordpressの(私には思われる)バグにより、既存のメタクエリに新しい配列が追加されますが、新しい配列は最初の配列として挿入されず、追加されます既存のmeta_queryに。そして、orderbyは常にmeta_queryの最初のmeta_keyに適用されます。

したがって、バグが修正されるまでの回避策として、次の例のように、最初の配列としてmeta_queryでmeta_keyを再度指定できます。

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
        array(
              'key' => '_start_date'
        ),
        array(
              'key' => '_end_date',
              'value' => time(),
              'compare' => '>=',
              'type' => 'numeric'
        )
  ));
  }
  return $query;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.