Usando meta_query, ¿cómo puedo filtrar por un campo personalizado y ordenar por otro?

10

Con el siguiente código (en functions.php), mis publicaciones (del evento CPT) están ordenadas por _end_date en lugar de _start_date. ¿Cuál es la solución adecuada para esto a partir de WP 3.1.3? Por supuesto, me gustaría evitar utilizar meta_key en desuso.

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;
}
    
pregunta user6254 17.06.2011 - 06:29

1 respuesta

15

Esto parece ser un error en Wordpress. Wordpress en realidad modifica la meta_query si especifica orderby y meta_key como vars de consulta. Normalmente, esta modificación agrega la nueva meta_key como la primera matriz en la matriz meta_query y, por lo tanto, el orden se aplica a la primera clave meta especificada en meta_query.

Pero cuando modifica orderby, meta_key y meta_value query_vars en pre_get_posts filter, debido al error (a mi parecer) en Wordpress, agrega la nueva matriz en la meta consulta existente pero la nueva matriz no se inserta como primera matriz, se anexa a la meta_query existente. Y orderby siempre se aplica a la primera meta_key en meta_query.

Entonces, como solución temporal hasta que se solucione el error, puede especificar la meta_key nuevamente en la meta_query como la primera matriz, como en el siguiente ejemplo:

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;
}
    
respondido por el Hameedullah Khan 17.06.2011 - 12:07

Lea otras preguntas en las etiquetas