Menggunakan meta_query, bagaimana saya bisa memfilter menurut bidang khusus dan memesan dengan yang lain?


10

Dengan kode berikut (dalam functions.php) posting saya (acara CPT) dipesan oleh _end_date bukan _start_date. Apa solusi yang tepat untuk ini pada WP 3.1.3? Tentu saja saya ingin menghindari penggunaan yang usang 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;
}

Jawaban:


15

Ini sepertinya bug di Wordpress. Wordpress sebenarnya memodifikasi meta_query jika Anda menentukan orderby dan meta_key sebagai vars kueri. Biasanya modifikasi ini menambahkan meta_key baru sebagai array pertama dalam array meta_query dan karenanya orderby diterapkan ke kunci meta pertama yang ditentukan dalam meta_query.

Tetapi ketika Anda memodifikasi orderby, meta_key dan meta_value query_vars di filter pre_get_posts, karena bug (sepertinya saya) di Wordpress, itu menambahkan array baru dalam permintaan meta yang ada tetapi array baru tidak dimasukkan sebagai array pertama, itu akan ditambahkan ke meta_query yang ada. Dan orderby selalu diterapkan pada meta_key pertama di meta_query.

Jadi sebagai solusi hingga bug diperbaiki Anda dapat menentukan meta_key lagi di meta_query sebagai array pertama, seperti dalam contoh berikut:

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.