Usando meta_query, ¿cómo puedo filtrar por un campo personalizado y ordenar por otro?
Con el siguiente código (en functions.php) mis entradas (del CPT event) están ordenadas por _end_date en lugar de _start_date. ¿Cuál es la solución correcta para esto en WP 3.1.3? Por supuesto, me gustaría evitar usar el 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;
}
Esto parece ser un error en WordPress. WordPress realmente modifica el meta_query si especificas orderby y meta_key como variables de consulta. Normalmente, esta modificación agrega el nuevo meta_key como el primer array en el array meta_query y, por lo tanto, el orderby se aplica al primer meta key especificado en meta_query.
Pero cuando modificas las query_vars orderby, meta_key y meta_value en el filtro pre_get_posts, debido a lo que me parece un error en WordPress, agrega el nuevo array al meta_query existente pero el nuevo array no se inserta como primer array, sino que se agrega al final del meta_query existente. Y el orderby siempre se aplica al primer meta_key en meta_query.
Como solución temporal hasta que se solucione el error, puedes especificar nuevamente el meta_key en el meta_query como el primer array, 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', 'evento' );
$query->set( 'meta_key', '_fecha_inicio' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
$query->set( 'meta_query', array(
array(
'key' => '_fecha_inicio'
),
array(
'key' => '_fecha_fin',
'value' => time(),
'compare' => '>=',
'type' => 'numeric'
)
));
}
return $query;
}
