En utilisant meta_query, comment puis-je filtrer par un champ personnalisé et commander par un autre?

10

Avec le code suivant (dans functions.php) mes messages (d'événement CPT) sont classés par _end_date au lieu de _start_date. Quelle est la bonne solution à cela à partir de WP 3.1.3? Bien sûr, je voudrais éviter d'utiliser obsolète 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;
}
user6254
la source

Réponses:

15

Cela semble être un bug dans Wordpress. Wordpress modifie en fait la meta_query si vous spécifiez orderby et meta_key comme variables de requête. Normalement, cette modification ajoute la nouvelle meta_key en tant que premier tableau dans le tableau meta_query et donc l'ordre est appliqué à la première clé meta spécifiée dans meta_query.

Mais lorsque vous modifiez orderby, meta_key et meta_value query_vars dans le filtre pre_get_posts, en raison du bogue (il me semble) dans Wordpress, il ajoute le nouveau tableau dans la méta-requête existante mais le nouveau tableau n'est pas inséré en tant que premier tableau, il est ajouté à la méta_query existante. Et orderby est toujours appliqué à la première meta_key dans meta_query.

Donc, comme solution de contournement jusqu'à ce que le bogue soit corrigé, vous pouvez spécifier à nouveau la meta_key dans la meta_query comme premier tableau, comme dans l'exemple suivant:

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;
}
Hameedullah Khan
la source