Trier par valeur méta, pro d'abord, puis gratuit
-
-
Bienvenue à WPSE.Pour commencer,n'hésitezpas à visiternotrepage [visite]pour avoir uneidée dufonctionnement du site.Consultez également [aide]pourtoute question relative au site.Pour revenir à votre question,j'aijustebesoin de résoudre certainsproblèmes,vous souhaitez récupérer au hasard desmessages àpartir d'une cléméta avec des valeursmétagratuiteset professionnelles.Disons que vous obtenez 10messages,4proet 6gratuits,les 4messagespro doivent être affichésen premier,puis les 6 autresgratuits.Juste un conseil,n'utilisezpas `query_posts`,utilisezplutôt` WP_Query`Welcome to WPSE. To start you off, please feel free to visit our [tour] page to get a feel on how the site operate. Also visit [help] for any site related questions. To come back to your question, I just need to clear some issues, you want to randomly fetch posts from a meta key with free and pro as meta values. Say you get 10 posts, 4 pro and 6 free, the 4 pro posts must be shown first, then the other 6 free. Just a tip, do not use `query_posts`, rather use `WP_Query`
- 0
- 2014-10-13
- Pieter Goosen
-
kmerci signifie quej'ai utilisé query_posts -fonctionintégrée du.tax-list.php doncj'aibesoin de créer unnouveaufichier cat.php?pour unenouvelleboucle?ou utilisé wp dans lemêmefichier?k thanks means i used query_post in - inbuild function of theme. tax-list.php so i need to create new cat.php file ? for new loop ? or used wp in same file ?
- 0
- 2014-10-13
- itcgpit mark
-
Utilisez lemêmefichier,changez simplement `query_posts`en` WP_Query`.Aussi,veuillezindiquer dansmon dernier commentaire si c'est ce que vousessayez defaireUse the same file, just change `query_posts` to `WP_Query`. Also, please advice on my last comment whether this is what you are trying to do
- 0
- 2014-10-13
- Pieter Goosen
-
yaj'essaye comme. dans lapage de la liste des catégories type depublication=liste meta value=proet gratuitmaispremier affichagepropuisgratuit .so orderbymeta value order DESC WP_Query ($ query_string. '& Orderby=meta_value_num'); Appel à lafonctionnon définie WP_Query () Erreurya i am trying like. in page of category listing post type = listing meta value = pro and free but first display pro then free .so order by meta value order DESC WP_Query($query_string . '&orderby=meta_value_num'); Call to undefined function WP_Query() error
- 0
- 2014-10-13
- itcgpit mark
-
parex dansmapage de catégorie s'il y a 10messages alorsje veux 10 avec aléatoiremaismeta value=pro d'abordpuismeta_value=freeensuite.D'accord . en cemomenttravail aléatoire. avectout ou seulement laposte ou seulementgratuit.maisje veux un ordrepar valeurméta sifacilepourmoi de résoudre cesproblèmesfor ex in my category page if there 10 post then i want 10 with random but meta value = pro first then meta_value = free then. ok . right now random working .with all or only post or only free. but i want order by meta value so easy for me to solve this issues
- 0
- 2014-10-13
- itcgpit mark
-
Veuillez visiter [`WP_Query`] (http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters)pour comprendre comment lesparamètres deméta-requêtefonctionnentet commentils doivent être construits.Vérifiez également lesparamètres orderbyPlease visit [`WP_Query`](http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters) to understand how the meta query parameters work and how it should be constructed. Also, check the orderby parameters
- 0
- 2014-10-13
- Pieter Goosen
-
2 réponses
- votes
-
- 2014-10-13
Avant detirer,juste unenote, JAMAIS (je souligne)n'utilisez
query_posts
pour créer des requêtespersonnaliséesRemarque: Cettefonctionn'estpas destinée à être utiliséepar desplugins ou desthèmes. Commeexpliquéplus loin,ilexiste demeilleures optionsplusperformantespourmodifier la requêteprincipale. query_posts ()est unmoyentrop simplisteet problématique demodifier la requêteprincipale d'unepageen la remplaçantpar unenouvelleinstance de la requête. Ilestinefficace (réexécute les requêtes SQL)et échouera carrément dans certaines circonstances (surtout souvent lors de lapagination des articles).
Utilisezplutôt
WP_Query
ouget_posts
pour créer des requêtespersonnalisées,mais UNIQUEMENT si vousimpossible demodifier la requêteprincipale avecpre_get_posts
. Pourplus d'informations,consultez cepostEn supposant qu'iln'y ait que deux valeurspour votre
meta_key
( VEUILLEZ NOTER: À desfins detest,j'ai utilisémapropre cléméta,vous devez la remplacerpar la vôtre ),à savoirpro
etfree
,vouspouvez simplement récupérer lesmessages qui ont cettemeta_key
spécifique. Votre requête ressemblera alors à ceci:$args = [ 'meta_key' => 'packages', 'orderby' => 'rand', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args );
Sitoutefois vous avezplus de valeurs que ces deux,vous devrez ajuster votre requêtepourinclure la
meta_value
,puis utiliser leparamètremeta_compare
. Votre requête ajustée deviendra alors:$args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ];
( PS! Avant de continuer,vous deveznoter que leparamètre
orderby
a changé dans la version 4.0,mais celane fonctionnerapas dans ce cas.Génial,vous aurezmaintenant 5messages qui ont été récupérés au hasardet qui ont soit une
meta_value
depro
oufree
Nous devonsmaintenant lestrier. Lameilleure solutionpossible consiste à utiliser
usort
pourtrier letableau des articles retournés dans$the_query->posts
en fonction de la valeur des articlesmeta_value
. Vous devrezensuite désactiver$the_query->posts
,puis le réinitialiser avec letableau d'articles réorganisé.Voici le code complet:
<?php $args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args ); $post_metas = $the_query->posts; usort( $post_metas, function( $a, $b ){ $a = get_post_meta( $a->ID , 'packages', true ) ; $b = get_post_meta( $b->ID, 'packages', true ) ; if ( $a == $b ) { return 0; } return ( $a > $b ) ? -1 : 1; } ); unset($the_query->posts); $the_query->posts = $post_metas; if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_post_meta( get_the_ID(), 'packages', true ). '</br>' . get_the_title() . '</li>'; } echo '</ul>'; } wp_reset_postdata(); ?>
Vous aurezjustebesoin d'ajuster les variables de requêteen fonction de vosbesoinset d'ajuster également labouclepour afficher ce quiestnécessaire
Cen'estpas le seulmoyen d'yparvenir,vouspouvez également déplacer votrefonction detri vers votrefunctions.phpet cibler spécifiquement cette requêtepersonnalisée
Before I fire away, just one note, NEVER (my emphasis) make use of
query_posts
to create custom queriesNote: This function isn't meant to be used by plugins or themes. As explained later, there are better, more performant options to alter the main query. query_posts() is overly simplistic and problematic way to modify main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination).
Rather make use of
WP_Query
orget_posts
to create custom queries, but ONLY if you can't modify the main query withpre_get_posts
. For more info, check out this postAssuming that there are only two values for your
meta_key
(PLEASE NOTE: For testing purposes, I have used my own meta key, you should replace this with your own), namelypro
andfree
, you can just retrieve posts that has this specificmeta_key
. Your query will then look something like this:$args = [ 'meta_key' => 'packages', 'orderby' => 'rand', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args );
If you however have more values than just these two, then you will need to adjust your query to include the
meta_value
and then make use of themeta_compare
parameter. Your adjusted query will then become:$args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ];
(PS! Before I go on, you should note that the
orderby
parameter has changed in version 4.0, but this will not work in this instance.Great, you will now have 5 posts that was retrieved randomly which has either a
meta_value
ofpro
orfree
Now we need to sort them. The best possible solution is to make use of
usort
to sort the returned array of posts in$the_query->posts
according to the value of the postsmeta_value
. You will then need to unset$the_query->posts
and then reset it with the reordered post array.Here is the complete code:
<?php $args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args ); $post_metas = $the_query->posts; usort( $post_metas, function( $a, $b ){ $a = get_post_meta( $a->ID , 'packages', true ) ; $b = get_post_meta( $b->ID, 'packages', true ) ; if ( $a == $b ) { return 0; } return ( $a > $b ) ? -1 : 1; } ); unset($the_query->posts); $the_query->posts = $post_metas; if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_post_meta( get_the_ID(), 'packages', true ). '</br>' . get_the_title() . '</li>'; } echo '</ul>'; } wp_reset_postdata(); ?>
You will just need to adjust the query variables to suit your needs and also adjust the loop to display what is needed
This is not the only way to achieve it though, you can also move your sorting function to your functions.php and specifically target this custom query
-
vousje suis d'abordpro ainsi quegrâce au hasard.maismaintenant son résultat d'affichage commetout lepoteau ..maisje veux seulementpour la catégorieperticuler.commeje clique sur la catégorieet je veuxpublier uniquement cette catégoriemerci aussimontype demessage=listeye i got pro first as well as random thanks . but now its display result as all post.. but i want only for perticuler category. like i click on categoryand i want post of only that category thanks also my post type = listing
- 0
- 2014-10-15
- itcgpit mark
-
Ajoutez simplement `` cat '=>get_queried_object (' cat ') -> cat_ID,`à vos argumentsJust add `'cat' => get_queried_object('cat')->cat_ID,` to your arguments
- 0
- 2014-10-15
- Pieter Goosen
-
mercij'ai obtenu une sortieparfaite dans labase de données.quandje passe la sortie sql.maintenant,j'aijustebesoin de changeren html signifie unepartie d'écho.aslmaismaintenant c'estpro aprèsgratuitmaisje veux que cette valeur soit aléatoire.?.merci j'ai égalementbesoin de changements dans le HTML ou ce queje veux afficher dans lapagemercithanks i got perfect output in database. when i pass output sql. now i just need to change in html means echo part. asl but right now its pro after free but i want that value as random .?.thanks i also need to changes in html or what i want to display in page thanks
- 0
- 2014-10-15
- itcgpit mark
-
Heureux que ce soit résolu.Quant à la section HTML,c'est hors deportée de cette question.Les éléments liés au HTML sont également hors sujet sur ce site.Si vous avezbesoin d'aide avec la structure html de votrepage,vous devriezposer unenouvelle question sur stackoverflow.com qui convientmieux à cetype de questions.Je vous remercieGlad that is solved. As for the HTML section, that is out of scope of this question. HTML related stuff is also off topic on this site. If you need help with the html structure of your page, you should ask a new question over at stackoverflow.com which is better suited for these type of questions. Thank you
- 0
- 2014-10-15
- Pieter Goosen
-
mercibeaucouptum'as sauvé lajournée.J'aimaintenantjustebesoin de donnéesen écho.untitre d'imageet des.avec selon leformat dethème.okmercimonsieur :)thanks a lot u saved my day. i got right data now just need in echo. an image title and des. with as per theme formate. ok thanks sir :)
- 0
- 2014-10-15
- itcgpit mark
-
ilne prendrapas demessageparpage .. cela cassera lapagination dans ... !!it will not take post per page.. this will break pagination in ...!!
- 0
- 2014-10-15
- itcgpit mark
-
- 2014-10-13
Vous devezeffectuer une requête avec la
meta_key
au lieu demeta_value
:$query_string . '&meta_key=name_of_key_that_stores_free_or_pro&orderby=meta_value_num'
You need to query by the
meta_key
instead ofmeta_value
:$query_string . '&meta_key=name_of_key_that_stores_free_or_pro&orderby=meta_value_num'
-
mercipour la réponsemais çane fonctionnepasj'ai utilisé query_posts ($ query_string. '&meta_key=J_listing_type & orderby=meta_value_num'); maisne fonctionnepasthanks for reply but its not working i used query_posts($query_string . '&meta_key=J_listing_type&orderby=meta_value_num'); but not working
- 0
- 2014-10-13
- itcgpit mark
-
Essayez simplement `orderby=meta_value`Try just `orderby=meta_value`
- 0
- 2014-10-13
- TheDeadMedic
-
j'essaye ceci aussimaisne fonctionnepas :(i try this also but not working :(
- 0
- 2014-10-13
- itcgpit mark
J'obtiens une listepro avec aléatoire,maisje veux
pro
aussibien quegratuit,mais avec la listepro
d'abord,puismeta_value
free
gratuite.J'ai également défini
orderby
meta_value
Celane fonctionnepas,et dans la chaîne de requêtepar défautpour
cat
.Ilfaudraorderby
date
avec à lafoismeta value = pro
etfree
.Des suggestions?