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 usar en desuso 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;
}

Respuestas:


15

Esto parece ser un error en Wordpress. Wordpress en realidad modifica el meta_query si especifica orderby y meta_key como variables 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 metaclave especificada en meta_query.

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

Entonces, como una solución alternativa hasta que se solucione el error, puede especificar meta_key nuevamente en 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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.