Folosind meta_query, cum pot filtra după un câmp personalizat și ordona după altul?

17 iun. 2011, 07:29:41
Vizualizări: 34.7K
Voturi: 10

Cu următorul cod (în functions.php) postările mele (de tip CPT event) sunt ordonate după _end_date în loc de _start_date. Care este soluția corectă pentru WP 3.1.3? Bineînțeles, aș dori să evit folosirea depreciatei 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' => '>=', // mai mare sau egal
                                         'type' => 'numeric'  // tip numeric
                                        )
                                   )
                              );
  }
  return $query;
}
0
Toate răspunsurile la întrebare 1
0
15

Acesta pare a fi un bug în WordPress. WordPress modifică de fapt meta_query dacă specifici orderby și meta_key ca variabile de interogare. În mod normal, această modificare adaugă noul meta_key ca primul array în array-ul meta_query și astfel orderby este aplicat primului meta_key specificat în meta_query.

Dar când modifici orderby, meta_key și meta_value în filtrul pre_get_posts, din cauza (după cum mi se pare) unui bug în WordPress, acesta adaugă noul array în meta_query existent, dar noul array nu este inserat ca primul array, ci este adăugat la sfârșitul meta_query existent. Și orderby este întotdeauna aplicat primului meta_key din meta_query.

Ca soluție temporară până când bug-ul este rezolvat, poți specifica din nou meta_key în meta_query ca prim array, ca în exemplul următor:

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;
}
17 iun. 2011 13:07:34