Je vois que beaucoup de gens préfèrent utiliser le crochet pre_get_posts au lieu de query_posts
Yay!
pre_get_posts
Filtre donc un WP_Query
objet, ce qui signifie que tout ce que vous pouvez faire via query_posts()
vous pouvez le faire via $query->set()
et $query->get()
. En particulier, nous pouvons utiliser l' meta_query
attribut (voir Codex ):
$meta_query = array(
array(
'key'=>'featured',
'value'=>'yes',
'compare'=>'!=',
),
);
$query->set('meta_query',$meta_query);
Mais .. cela remplace la «méta-requête» d'origine (si elle en avait une). Donc, à moins que vous ne vouliez remplacer complètement la méta-requête d'origine, je suggère:
//Get original meta query
$meta_query = $query->get('meta_query');
//Add our meta query to the original meta queries
$meta_query[] = array(
'key'=>'featured',
'value'=>'yes',
'compare'=>'!=',
);
$query->set('meta_query',$meta_query);
De cette façon, nous ajoutons notre méta-requête aux méta-requêtes existantes.
Vous pouvez / pouvez pas définir la relation
propriété $meta_query
à AND
ou OR
(à des postes retour qui répondent à tous, ou au moins une, les requêtes méta).
* Remarque: ce type de requête renvoie des articles avec la méta-clé «en vedette», mais dont la valeur n'est pas yes
. Il n'inclura pas les publications où la méta-clé «en vedette» n'existe pas. Vous pourrez le faire en 3.5 .
Yes
et lesNo
options et « Non » sera sélectionné par défaut. Lorsque je souhaite publier un article, je sélectionneYes
. Cependant, je veux que les 5 derniers messages restent en vedette et que d'autres s'affichent sur la requête principale. Je ne veux pas revenir en arrière et changer la sélection à chaque fois, donc je dois trouver un moyen d'exclure uniquement les 5 derniers messages. Je vois de nombreuses questions similaires sur stackexchange et il devrait y avoir un moyen facile de gérer ces messages en vedette. (une manière qui n'affecte pas les performances générales, ne crée pas beaucoup de requêtes ou ne nécessite pas de requêtes SQL mixtes)Yes
ou uneNo
valeur pour tous les messages. Ce serait formidable d'exclure les postes qui n'ont tout simplement pas lafeatured
clé.Uncaught Error: [] operator not supported for strings
erreur car l'originalmeta_query
revenait comme nul. Vous pouvez la contourner en se repliant à un tableau vide si aucune commutation existe sur$meta_query = $query->get('meta_query');
pour$meta_query = ( is_array( $query->get('meta_query') ) ) ? $query->get('meta_query') : [];
.Je souhaite publier ma solution temporaire pour les publications en vedette au cas où certaines personnes pourraient l'utiliser. Je n'utilise pas de
pre_get_posts
crochet ici mais pas nonquery_posts
plus. Le problème est que je dois jouer avec la requête principale et exécuter un morceau de requête sql. Je serais heureux si des experts pouvaient vérifier le code et me faire savoir s'il est OK et ne causerait aucun problème de performances. Ce sera également formidable si quelqu'un a une meilleure approche et la partage avec nous.Créer une requête de publications en vedette
Créez la requête principale, excluez les publications contenant la méta-clé en vedette, limitez l'exclusion à 5 publications les plus récentes et affichez toutes les autres.
la source
En réponse @Carlisle, si vous souhaitez exclure les 5 derniers messages marqués comme étant en vedette, vous pouvez procéder comme suit. Remplacez posts_per_page par le nombre que vous souhaitez exclure et la méta_query par la façon dont vous désignez la catégorie sélectionnée.
la source