Comment interroger_posts en utilisant meta_query pour commander par meta_key ET avoir un tri secondaire par date?

8

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

Je travaille donc 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 j'exécute mon query_posts, je veux que les résultats soient des articles où le «post-expiré» n'est PAS «oui» (cette partie fonctionne dans mon code). Je veux également que les résultats soient triés par la valeur du numéro DESC de "mon-ordre de tri" (fonctionne aussi) ET s'il y a un lien avec "mon-ordre de tri", je voudrais un tri secondaire par date avec les articles les plus récents première.

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

Voici le code que j'ai en ce moment:

<?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 décroissant (c'est-à-dire que 100 s'affiche avant 99, etc.). Mais si les deux articles ont la même valeur d'ordre de tri, il y a un type de tri secondaire que je n'arrive pas à contrôler (et je ne peux pas comprendre sur quoi il est réellement trié).

Ma première idée pour résoudre ce problème était 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 vide pour le reste des messages, ils seraient simplement renvoyés dans le tri par défaut par date DESC (après les messages avec un ordre de tri défini). Cependant, ce qui s'est réellement passé, c'est que les publications qui n'avaient pas de valeur d'ordre de tri n'étaient PAS renvoyées 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 fait exploser les deux ordres de tri que j'allais chercher et a renvoyé les messages de manière inattendue. J'avais l'impression que plusieurs valeurs de commande é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: 1) Trier d'abord les messages par le champ "mon ordre de tri", puis renvoyer les messages restants sans valeur dans ce champ avec le tri par date par défaut; ou 2) comprendre comment contrôler l'ordre secondaire par tri afin que tous les messages ayant un lien avec «mon ordre de tri» soient triés par date (le plus récent en premier)?

Dana
la source

Réponses:

2

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

ÉDITER:

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

Et voici l'exemple de code des documents:

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;
}
tollmanz
la source
Oui, le filtre posts_orderby est ce que vous recherchez. Je vais éditer la réponse avec le code sur ce lien ...
mltsy