Folosind meta_query, cum pot filtra după un câmp personalizat și ordona după altul?
Cu următorul cod (în functions.php) postările mele (de tip CPT event) sunt ordonate după _end_date în loc de _start_date. Care este soluția corectă pentru WP 3.1.3? Bineînțeles, aș dori să evit folosirea depreciatei 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' => '>=', // mai mare sau egal
'type' => 'numeric' // tip numeric
)
)
);
}
return $query;
}
Acesta pare a fi un bug în WordPress. WordPress modifică de fapt meta_query dacă specifici orderby și meta_key ca variabile de interogare. În mod normal, această modificare adaugă noul meta_key ca primul array în array-ul meta_query și astfel orderby este aplicat primului meta_key specificat în meta_query.
Dar când modifici orderby, meta_key și meta_value în filtrul pre_get_posts, din cauza (după cum mi se pare) unui bug în WordPress, acesta adaugă noul array în meta_query existent, dar noul array nu este inserat ca primul array, ci este adăugat la sfârșitul meta_query existent. Și orderby este întotdeauna aplicat primului meta_key din meta_query.
Ca soluție temporară până când bug-ul este rezolvat, poți specifica din nou meta_key în meta_query ca prim array, ca în exemplul următor:
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;
}
