Usando meta_query, como posso filtrar por um campo personalizado e pedir por outro?

10

Com o código a seguir (em functions.php), minhas postagens (do evento CPT) são ordenadas por _end_date em vez de _start_date. Qual é a solução adequada para isso no WP 3.1.3? É claro que eu gostaria de evitar o uso obsoleto 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
fonte

Respostas:

15

Este parece ser um bug no Wordpress. O Wordpress na verdade modifica a meta_query se você especificar orderby e meta_key como vars de consulta. Normalmente, essa modificação adiciona a nova meta_key como a primeira matriz na matriz meta_query e, portanto, o orderby é aplicado à primeira meta-chave especificada na meta_query.

Mas quando você modifica orderby, meta_key e meta_value query_vars no filtro pre_get_posts, devido ao (parece-me) bug no Wordpress, ele adiciona a nova matriz na meta query existente, mas a nova matriz não é inserida como primeira matriz, é anexada para a meta_query existente. E orderby sempre é aplicado à primeira meta_key na meta_query.

Portanto, como uma solução alternativa até que o bug seja corrigido, você pode especificar a meta_key novamente na meta_query como a primeira matriz, como no exemplo a seguir:

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
fonte