Avec le code suivant (dans functions.php), mes publications (d'événements CPT) sont classées par _end_date au lieu de _start_date. Quelle est la solution appropriée à cela à partir de WP 3.1.3? Bien sûr, j'aimerais éviter d'utiliser meta_key
, obsolète.
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;
}
Cela semble être un bug dans Wordpress. En fait, Wordpress modifie la meta_query si vous spécifiez orderby et meta_key en tant que vars de requête. Normalement, cette modification ajoute la nouvelle méta_key en tant que premier tableau du tableau meta_query. Par conséquent, orderby est appliqué à la première méta clé spécifiée dans meta_query.
Mais lorsque vous modifiez orderby, meta_key et meta_value query_vars dans le filtre pre_get_posts, en raison du bogue (il me semble) dans Wordpress, il ajoute le nouveau tableau dans la méta-requête existante, mais le nouveau tableau n'est pas inséré en tant que premier tableau, il est ajouté. à la meta_query existante. Et orderby est toujours appliqué à la première méta_key de meta_query.
En guise de solution de contournement jusqu'à ce que le bogue soit corrigé, vous pouvez à nouveau spécifier la méta_key dans la méta_query en tant que premier tableau, comme dans l'exemple suivant:
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;
}