Utilizzare meta_query, come posso filtrare per un campo personalizzato e ordinare per un altro?
Con il seguente codice (in functions.php) i miei post (del CPT event) vengono ordinati per _end_date invece che per _start_date. Qual è la soluzione corretta a partire da WP 3.1.3? Naturalmente vorrei evitare di utilizzare il deprecato 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' => '>=', // Maggiore o uguale a
'type' => 'numeric' // Tipo numerico
)
)
);
}
return $query;
}
Questo sembra essere un bug in WordPress. WordPress effettivamente modifica la meta_query se si specificano orderby e meta_key come variabili di query. Normalmente questa modifica aggiunge il nuovo meta_key come primo array nell'array meta_query e quindi l'ordinamento viene applicato al primo meta key specificato in meta_query.
Ma quando si modificano le variabili di query orderby, meta_key e meta_value nel filtro pre_get_posts, a causa di quello che mi sembra un bug in WordPress, aggiunge il nuovo array nella meta query esistente ma il nuovo array non viene inserito come primo array, bensì viene aggiunto alla fine della meta_query esistente. E l'ordinamento viene sempre applicato al primo meta_key nella meta_query.
Come soluzione alternativa finché il bug non viene risolto, puoi specificare nuovamente il meta_key nella meta_query come primo array, come nell'esempio seguente:
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;
}
