Używając meta_query, w jaki sposób mogę filtrować według niestandardowego pola i porządkować według innego?


10

Za pomocą następującego kodu (w functions.php) moje posty (zdarzenia CPT) są uporządkowane według _end_date zamiast _start_date. Jakie jest właściwe rozwiązanie tego problemu na WP 3.1.3? Oczywiście, że chciałbym uniknąć używania przestarzałych 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;
}

Odpowiedzi:


15

To wydaje się być błędem w Wordpress. Wordpress faktycznie modyfikuje meta_query, jeśli określisz orderby i meta_key jako zmienne zapytania. Zwykle ta modyfikacja dodaje nowy klucz meta jako pierwszą tablicę w tablicy meta_query, a zatem kolejność według jest stosowana do pierwszego klucza meta określonego w meta_query.

Ale kiedy zmodyfikujesz orderby, meta_key i meta_value query_vars w filtrze pre_get_posts, z powodu błędu (jak mi się wydaje) w Wordpress, dodaje nową tablicę do istniejącego zapytania meta, ale nowa tablica nie jest wstawiana jako pierwsza tablica, dodaje się ją do istniejącego meta_query. I polecenie orderby zawsze jest stosowane do pierwszego meta_key w meta_query.

Aby obejść błąd, dopóki błąd nie zostanie naprawiony, możesz ponownie określić klucz meta_qua w meta_query jako pierwszą tablicę, jak w poniższym przykładzie:

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.