J'ai un site avec quelques milliers de messages horodatés dans un type de message personnalisé. Celles-ci sont affichées par quelques taxonomies et une requête de date dans différentes vues (tout cela fonctionne déjà très bien). La partie délicate consiste à les classer selon un format de date unique: le client insiste sur le fait que les messages doivent être commandés DESC par jour, puis ASC par heure chaque jour. Autant que je sache dans le Codex , order
ne prend que date
en tant que paramètre, et non le jour et l'heure en tant que valeurs distinctes. Existe-t-il un moyen d'accomplir ce que je recherche sans avoir à réécrire de manière substantielle une demi-douzaine de fichiers de modèle d'archivage des taxes?
J'utilise déjà ce qui suit pour trier DESC par date et j'aimerais une solution qui convient à cette fonction:
function my_post_sort( $vars ) {
if ( is_tax(array('series', 'speakers', 'topics', 'venues'))) {
$vars['order'] = 'ASC';
}
return $vars;
}
add_filter('query_vars', 'my_post_sort');
Vous n’utilisez pas query_vars
tout à fait à droite - ce filtre sert à l’affichage en liste blanche des vars de requête "publics" et non à la définition de leurs valeurs. Elle est également appelée assez tôt (wp::parse_request
), donc toutes les balises conditionnelles telles que is_tax()
seront toujours fausses à ce stade.
Utilisez l'action pre_get_posts
pour remplacer la requête par défaut. Cela dit, vous avez besoin d’une clause ORDER BY
personnalisée. Utilisez le filtre posts_orderby
:
function wpse_179686_posts_orderby( $orderby, $wp_query ) {
if ( $wp_query->is_main_query() && $wp_query->is_tax( array( 'series', 'speakers', 'topics', 'venues' ) ) )
$orderby = 'DATE( post_date ) DESC, TIME( post_date ) ASC';
return $orderby;
}
add_filter( 'posts_orderby', 'wpse_179686_posts_orderby', 10, 2 );