Usando meta_query, come posso filtrare per un campo personalizzato e ordinare da un altro?


10

Con il seguente codice (in Functions.php) i miei post (dell'evento CPT) sono ordinati per _end_date anziché _start_date. Qual è la soluzione corretta a partire da WP 3.1.3? Ovviamente vorrei evitare di usare deprecato 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;
}

Risposte:


15

Questo sembra essere un bug in Wordpress. Wordpress modifica effettivamente la meta_query se si specifica orderby e meta_key come query vars. Normalmente questa modifica aggiunge la nuova meta_key come prima matrice nella matrice meta_query e quindi l'ordine viene applicato alla prima meta chiave specificata in meta_query.

Ma quando modifichi orderby, meta_key e meta_value query_vars nel filtro pre_get_posts, a causa del bug (mi sembra) in Wordpress, aggiunge il nuovo array nella meta query esistente ma il nuovo array non viene inserito come primo array, viene aggiunto alla meta_query esistente. E orderby viene sempre applicato alla prima meta_key in meta_query.

Quindi, come soluzione alternativa fino a quando il bug non viene corretto, è possibile specificare nuovamente la meta_key in meta_query come primo array, come nell'esempio seguente:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.