J'ai modifié la recherche intégrée dans WP à l'aide du pre_get_posts
filtre, ce qui permet à l'utilisateur de trier les publications (y compris un ensemble de types de publications personnalisées) selon différents champs.
Le problème que j'ai cependant est que lorsque je dis à WP de trier par une méta-valeur, il exclut tous les posts qui n'ont pas cette méta-valeur définie. Cela entraîne le changement du nombre de résultats si vous modifiez le tri de "Prix" en "Date", car les "Messages" n'ont pas "Prix" défini mais "Articles".
Ce n'est pas ce que je veux, alors j'aimerais savoir s'il existe un moyen d'inclure TOUS les messages - même ceux qui n'ont pas la méta-valeur sur laquelle je fais le tri - et de mettre ceux qui ne le sont pas.
Je sais comment trier sur plus d'un domaine mais cela ne m'aide pas.
Merci
Il semble que je ne sois pas le seul à poser cette question: façon d’inclure des publications avec et sans certaines méta_key dans les arguments de wp_query? mais il n'y a pas de solution là-bas.
Mise à jour
J'ai essayé la réponse mais je ne suis pas sûr d'avoir bien compris. Voici ce que j'ai maintenant:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
La méta valeur est un nombre (il est utilisé pour stocker un prix comme son nom l'indique)
Mise à jour 2
J'ai commenté les commandes et tout ce que j'ai à présent est le suivant:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
Avec ce code, la requête semble renvoyer toutes les publications qui ne possèdent pas la item_price
clé et aucune des publications qui en disposent. IE le problème est maintenant inversé.
Si j'ajoute également le code de commande, j'obtiens 0 résultats.
Edit: ... trois ans plus tard ... : PI avait à nouveau ce problème. J'ai essayé toutes les réponses données et aucune ne fonctionne. Je ne sais pas pourquoi certaines personnes semblent penser qu'elles travaillent mais elles ne travaillent pas pour moi du moins.
La solution avec laquelle je me suis retrouvé utilise le save_post
filtre - en s'assurant que toutes les publications ont le champ personnalisé que je souhaite trier. C'est un peu agaçant que je sois obligé de le faire, mais si vous le faites tôt, vous n'aurez probablement aucun problème.
Dans ce cas, je construisais un "compteur de vues" sur les messages et je voulais que les utilisateurs puissent trier les messages les plus lus. Encore une fois, les messages qui n’ont jamais été visionnés (je suppose que c’est assez improbable - mais qui restent) ont disparu lors du tri sur le nombre de vues. J'ai ajouté ce morceau de code pour m'assurer que toutes les publications ont un nombre de vues:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
et tax_query
sont toujours un array( array() )
car ils combinent des réseaux multiples. Deuxièmement - comme mentionné dans ma réponse - vous devez utiliser meta_value_num
pour les chiffres. Il pourrait également être nécessaire de définir réellement le meta_value_num
(voir WP_Query
Entrée de page Codex). Enfin, il ne fait pas de sens order
dans ASC
et DESC
direction. Ce n'est pas possible. Le délimiteur d'espace ne fonctionne que pour orderby
et vous ne pouvez pas lui dire de trier le premier ASC
et le second DESC
. C'est à ça que posts_clauses
sert le filtre.
meta_value_num
entrées sont de vrais nombres. Vu trop souvent, quelqu'un a dit qu'il s'agissait d'un nombre, mais l'enregistrait en fait sous forme de chaîne dans la base de données.
ASC DESC
est pour qu'il trie le meta_value
dans ASC
et date
dans DESC
, pour autant que je peux dire cela fonctionne.