web-dev-qa-db-fra.com

Demande de commande WP_Query complexe: DESC par jour, puis ASC par heure

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');
1
jdsteinbach

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 );
1
TheDeadMedic