web-dev-qa-db-fra.com

Comment query_posts en utilisant meta_query pour orderby meta_key ET avoir un tri secondaire par date?

J'ai résolu un problème au cours des derniers jours et continue à tourner en rond. Pourrait vraiment utiliser une nouvelle paire d'yeux pour m'aider à répondre à cette question ...

Donc, je travaille avec un site wordpress où les publications ont quelques champs personnalisés pertinents pour la requête que je dois exécuter: "post-expired" et "my-sort-order". Lorsque je lance mes query_posts, je souhaite que les résultats soient des publications où "post-expired" n'est PAS "yes" (cette partie fonctionne dans mon code). Je souhaite également que les résultats soient triés en fonction de la valeur numérique DESC de "mon ordre de tri" (fonctionne également) ET s'il y a un lien entre "mon ordre de tri", j'aimerais un classement secondaire par date avec les messages les plus récents. premier.

Le deuxième tri par date est l'endroit où j'ai des problèmes.

Voici le code que j'ai maintenant:

<?php               
$args = array(
    'paged' => $paged,
    'meta_query'=> array(
        array(
            'key'=>'post-expired',
            'value'=> 'yes',
            'compare' => '!='
        )
    ),
    'meta_key'=>'my-sort-order',
    'orderby'=>'meta_value_num', 
    'order'=>'DESC'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>

En utilisant le code ci-dessus, je récupère correctement les messages non expirés et ils sont triés par ordre de tri my-sort décroissant (c'est-à-dire que 100 s'affiche avant 99, etc.). Mais si les deux publications ont la même valeur d'ordre de tri, il y a un type de tri secondaire en cours que je ne semble pas pouvoir contrôler (et qui ne peut pas comprendre sur quoi il est réellement trié).

Ma première idée pour résoudre ce problème a été d'ajouter uniquement des valeurs à "mon-ordre de tri" si je voulais définir un ordre de tri spécifique pour cette publication. Je pensais que si la valeur de ce champ était laissée en blanc pour le reste des posts, ils seraient simplement renvoyés dans le tri par défaut par la date de DESC (après les posts avec un ordre de tri défini). Cependant, ce qui s'est réellement passé, c'est que tous les messages pour lesquels aucune valeur d'ordre de tri n'a été définie n'étaient PAS renvoyés du tout ...

Ensuite, j'ai essayé d'ajouter plusieurs valeurs dans le champ orderby comme ceci:

('orderby'=>'meta_value_num date')

Cela a complètement gâché les deux ordres de tri que je suivais et a rendu les messages de manière inattendue. J'avais l'impression que plusieurs valeurs orderby étaient autorisées, mais pour une raison quelconque, cela ne fonctionne pas ici.

À ce stade, je ne sais pas comment faire fonctionner l'une ou l'autre de ces solutions potentielles. Est-ce que quelqu'un sait comment je peux soit: 1) Trier les articles par le champ "mon ordre de tri" en premier, puis les articles restants sans valeur dans ce champ sont retournés avec le tri par défaut de la date; ou 2) Déterminez comment contrôler l'ordre secondaire en effectuant un tri afin que tout article ayant un lien sur "mon ordre de tri" soit trié par date (le plus récent en premier)?

8
Dana

J'espère que vous avez déjà compris cela, mais si vous ne l'avez pas encore fait, vous devriez pouvoir utiliser le filtre "posts_orderby" pour composer un ordre spécifique pour votre requête. Je ne vais pas vous donner une solution complète ici, mais vous pouvez vous référer à ce post pour plus d'informations: http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

MODIFIER:

Voici la documentation. En gros, vous pouvez simplement remplacer la clause ORDER BY du code SQL: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

Et voici l'exemple de code tiré de la documentation:

add_filter('posts_orderby', 'edit_posts_orderby');
add_filter('posts_join_paged','edit_posts_join_paged');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}
2
tollmanz