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

Com o seguinte código (em functions.php), minhas postagens (de evento CPT) são ordenadas por _end_date em vez de _start_date. Qual é a solução adequada para isso a partir do WP 3.1.3? Claro, eu gostaria de evitar o uso de meta_key obsoleto.

 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; } 

Solutions Collecting From Web of "Usando meta_query, como posso filtrar por um campo personalizado e encomendar por outro?"

Isso parece ser um bug no WordPress. WordPress realmente modifica a meta_query se você especificar orderby e meta_key como query vars. Normalmente, esta modificação adiciona a nova meta_key como a primeira matriz na matriz de meta_query e, portanto, o orderby é aplicado à primeira meta-chave especificada em meta_query.

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

Então, 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; }