obtenir toutes les valeurs pour une clé de champ personnalisé (cross-post)
-
-
On dirait que vous l'utilisez commetaxonomie.Pourquoine pas simplement (automatiquement) ajouter unterme à ces articles lors de l'enregistrement?Rendrait les requêtesbeaucoupplusfaciles.Seems like you're using this as a taxonomy. Why not simply (automatically) add a term to these posts when saving? Would make querying a lot easier.
- 5
- 2011-02-15
- kaiser
-
@kaiser Jene sauraistrop vous remercier d'être ungénie!@kaiser I can't thank you enough for being a genius!
- 0
- 2016-10-26
- user2128576
-
7 réponses
- votes
-
- 2011-02-15
Une approchepossible serait d'utiliser l'une desméthodes d'assistance de la classe WPDBpourfaire une requêtebasée sur desmétaplus raffinée. Lamiseen garde à l'utilisation de certaines de cesfonctions,cependant,est que vousne récupérezgénéralementpas un simpletableau de donnéeset que vous devezgénéralementfaire des référencesinutiles auxpropriétés d'objet,même si vousn'appelez qu'une seule colonne ou ligne.
Bien sûr,toutes lesfonctionsne sontpas lesmêmes,et unemention utile va à laméthode WPDB ,
get_col
qui renvoie un simpletableauplat du donnéesinterrogées,je fais cettemention spécifiquementparce que l'exemple suivantfera appel à cetteméthode.WordPress - WPDB Sélection d'une colonne de données
$ wpdb->get_col ()Voici unexemple defonction quiinterroge labase de donnéespourtoutes lespublications d'untype depublication,de l'état de lapublicationet d'uneméta clé spécifique (ou d'un champpersonnalisépour lesmoinstechniquementintéressés).
function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) { global $wpdb; if( empty( $key ) ) return; $r = $wpdb->get_col( $wpdb->prepare( " SELECT pm.meta_value FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = %s AND p.post_status = %s AND p.post_type = %s ", $key, $status, $type ) ); return $r; }
Parexemple,si vous souhaitez savoir quelsmessages ont une cléméta de rating ,pour letype demessage films et que vous aimeriez stocker cesinformations dans une variable,unexemple d'untel appel serait ..
$movie_ratings = get_meta_values( 'rating', 'movies' );
Si vousne vouliez rien d'autre que d'imprimer ces données à l'écran,lafonction d'implosion de PHPpeut rapidement scinder ce simpletableauen lignes de données.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
Vouspouvez également utiliser les données renvoyéespour déterminer lenombre d'articles contenant cesméta-valeursen effectuant une simpleboucle sur les données renvoyéeset en créant untableau des décomptes,parexemple.
$movie_ratings = get_meta_values( 'rating', 'movies' ); if( !empty( $movie_ratings ) ) { $num_of_ratings = array(); foreach( $movie_ratings as $meta_value ) $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1; } /* Result: Array( [5] => 10 [9] => 2 ) // ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9. */
Cette logiquepeut être appliquée à différentstypes de donnéeset étenduepourfonctionner de différentesmanières. J'espère donc quemesexemples ont été utileset suffisamment simples à suivre.
One possible approach would be to use one of the helper methods in the WPDB class to do a more refined meta based query. The caveat to using some of these functions however, is that you don't usually get back a simple array of data and usually have to make needless references to object properties, even if you're only calling for one column or row.
Of course, not all functions are the one and the same, and a purposeful mention goes out to the WPDB method,
get_col
which returns a simple flat array of the data queried for, i make this mention specifically because the example following will call upon this method.WordPress - WPDB Selecting a column of data
$wpdb->get_col()Here's an example function which queries the database for all posts of a chosen post type, post status and with a specific meta key(or custom field to the less technically minded).
function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) { global $wpdb; if( empty( $key ) ) return; $r = $wpdb->get_col( $wpdb->prepare( " SELECT pm.meta_value FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = %s AND p.post_status = %s AND p.post_type = %s ", $key, $status, $type ) ); return $r; }
So for example, if you like to find out which posts have a meta key of rating, for the post type movies and you'd like to store that information inside a variable, an example of such a call would be..
$movie_ratings = get_meta_values( 'rating', 'movies' );
If you wanted to do nothing more than print that data to screen, PHP's implode function can quickly splice that simple array into lines of data.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
You can also use the returned data to work out how many posts have these meta values by doing a simple loop over the returned data and building an array of the counts, for example.
$movie_ratings = get_meta_values( 'rating', 'movies' ); if( !empty( $movie_ratings ) ) { $num_of_ratings = array(); foreach( $movie_ratings as $meta_value ) $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1; } /* Result: Array( [5] => 10 [9] => 2 ) // ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9. */
This logic could be applied to various kinds of data, and extended to work any number of different ways. So i hope my examples have been helpful and simple enough to follow.
-
Fait également amusantpour lesfuturstéléspectateurs,si vous voulezextraire uniquement desméta-valeurs uniques - voustapez `DISTINCT`juste après le` SELECT` dans lafonction ci-dessus.Celapourrait être utile.Also fun-fact for future viewers, if you want to pull only Unique meta values - you type `DISTINCT` right after the `SELECT` in the function above. Could be useful.
- 3
- 2014-02-07
- Howdy_McGee
-
Jepense que c'estextrêmement utileI think this is extremely useful
- 0
- 2017-05-01
- Pablo S G Pacheco
-
Commentfaire celaet renvoyer les valeurstriées?,Jepense que l'utilisation de ORDERbymaisje nepeuxpas comprendre comment l'utiliserHow to do this, and return the values sorted?, I think that using ORDER by but I cant figure out how to use it
- 0
- 2018-04-17
- efirvida
-
- 2011-06-05
Je voudraisjuste ajouter unepetite chose au code de t31os ci-dessus.J'ai changé "SELECT"en "SELECT DISTINCT"pour éliminer lesentréesen double lorsquej'ai utilisé ce codemoi-même.
I'd just like to add one tiny thing to t31os's code above. I changed "SELECT" into "SELECT DISTINCT" to eliminate duplicate entries when I used this code myself.
-
Jepeuximaginer des cas oùil serait valide d'avoirplusieursméta valeurs de lamême valeur,et donc dene pasfaire cet ajout àmon code.Si vous voulez des valeurs distinctes,ce serait la voie à suivre.Deplus,vouspouvez également ajouter celaen tant qu'argumentpour lafonction (afin que vouspuissiez l'utiliser ounon,selon le cas).I can imagine cases where it would be valid to have multiple meta values of the same value, and thus didn't not make that addition to my code. If you want distinct values, this would be the way to go though. Additionally you could also add that in as an argument for the function(so you can use it or not, as appropriate).
- 1
- 2014-01-24
- t31os
-
- 2015-10-03
Iln'estpasbon ounécessaire d'utiliser leglobal $ wpdb:
// function to grab all possible meta values of the chosen meta key. function get_meta_values( $meta_key, $post_type = 'post' ) { $posts = get_posts( array( 'post_type' => $post_type, 'meta_key' => $meta_key, 'posts_per_page' => -1, ) ); $meta_values = array(); foreach( $posts as $post ) { $meta_values[] = get_post_meta( $post->ID, $meta_key, true ); } return $meta_values; } $meta_values = get_meta_values( $meta_key, $post_type );
It is not good or needed to use the global $wpdb:
// function to grab all possible meta values of the chosen meta key. function get_meta_values( $meta_key, $post_type = 'post' ) { $posts = get_posts( array( 'post_type' => $post_type, 'meta_key' => $meta_key, 'posts_per_page' => -1, ) ); $meta_values = array(); foreach( $posts as $post ) { $meta_values[] = get_post_meta( $post->ID, $meta_key, true ); } return $meta_values; } $meta_values = get_meta_values( $meta_key, $post_type );
-
Ce seraitmaméthodepréféréepour lefaire,dans laplupart des cas.Ileffectue cinq requêtes,plutôt qu'une seule,mais,commeil utilise lesprocédures WordPress standardpour lesgénéreret les soumettre,toutemiseen cache spécifique à laplate-forme (telle que lamiseen cache d'objets de WP Engine ou unplugin aléatoire)entreraen vigueur. Les données seront égalementêtre stocké dans le cacheinterne de WordPresspendant la durée de la demande,ilne sera doncpasnécessaire de le récupérer ànouveau de labase de données,sinécessaire.This would be my preferred method of doing it, in most cases. It makes five queries, rather than just one, but, as it's using the standard WordPress procedures to generate and submit them, any platform-specific caching (such as WP Engine's Object Caching or some random plugin) will kick in. The data will also be stored in WordPress' internal cache for the duration of the request, so will not need to be retrieved from the database again, if needed.
- 0
- 2017-06-02
- Andrew Dinmore
-
Tous lesfiltres seront également appliqués aux données,ce quipourrait êtreextrêmementimportant,parexemple sur un sitemultilingue.Enfin,commeiln'utilise que lesfonctionsprincipales de WordPress standard,ilestbeaucoupmoins susceptible d'êtreinterrompupar unefuturemise àjour.Any filters will also be applied to the data, which could be extremely important on, for example, a multi-lingual site. Lastly, since it's using just standard WordPress core functions, it's much less likely to be broken by a future update.
- 0
- 2017-06-02
- Andrew Dinmore
-
Celapourrait être renduplusperformanten limitant la requête àpostid? Ajouter: ``fields '=>'ids'` Ainsi,letableau de requête ressemblerait à: tableau ( 'post_type'=> $post_type, 'meta_key'=> $meta_key, 'posts_per_page'=> -1, 'fields'=> 'ids' ) `` ''This might be made more performant by limiting the query to post id? Add: `'fields' => 'ids'` So, the query array would look like: ```array( 'post_type' => $post_type, 'meta_key' => $meta_key, 'posts_per_page' => -1, 'fields' => 'ids' )```
- 1
- 2020-04-13
- Pea
-
Attention,celafiltre également lesméta-valeurs quin'existent que sur les articlesnonpubliés,alors assurez-vous d'utiliser l'argument 'post_status'pouren faire unefonctionnalitéet non unbogueCaution this also filters out meta values that exist only on not published posts so make sure you use the 'post_status' arg to make this a feature not a bug
- 0
- 2020-07-23
- jnhghy - Alexandru Jantea
-
- 2011-02-15
lemoyen leplus rapide serait une requête SQLpersonnaliséeet jene suispas sûrmais vouspouvezessayer
$wpdb->get_results(" SELECT posts.* , COUNT(*) 'moodcount' FROM $wpdb->posts as posts JOIN $wpdb->postmeta as postmeta ON postmeta.post_id = posts.ID AND postmeta.meta_key = 'Mood' GROUP BY postmeta.meta_key ");
Si quoi que ce soit,c'est un début.
the fastest way would be a custom sql query and i'm not sure but you can try
$wpdb->get_results(" SELECT posts.* , COUNT(*) 'moodcount' FROM $wpdb->posts as posts JOIN $wpdb->postmeta as postmeta ON postmeta.post_id = posts.ID AND postmeta.meta_key = 'Mood' GROUP BY postmeta.meta_key ");
If anything then its a start.
-
merci,maisne faut-ilpas éviter les requêtespersonnalisées «àtoutprix»?Jepréférerais utiliser la couche d'abstraction WP (c'est comme ça qu'on l'appelle?) ...maisbien sûr si cen'estpaspossible ..thanks, but shouldn't custom quesries be avoided 'at all cost'? I'd prefer to use the WP abstraction layer (is that what it's called?)... but of course if this is not possible..
- 1
- 2011-06-08
- mikkelbreum
-
Les requêtespersonnalisées,sielles sont écrites correctement,peuvent êtremeilleureset vousne devriez les éviter que si vousne savezpas ce que vousfaites.Custom queries, if written the right way, can be better and you should only avoid them if you don't know what you're doing.
- 0
- 2011-06-08
- Bainternet
-
Je suis d'accord avecmwb. Les requêtespersonnalisées sonttrès utileset pratiques,maisje pense qu'elles sont aussibeaucoupplus lourdes sur labase de données .. surtouten utilisant lesfonctions SRT ..I Agree with mwb .custom queries are very usefull and practical, but I think they are also much heavier on the DB.. especially using SRT functions..
- 1
- 2011-12-10
- krembo99
-
- 2013-09-07
Pour obtenirtoutes les valeursmétapar une cléméta
Vérifiez wp-> db wordpress codex
$values = $wpdb->get_col("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
For getting all meta values by a meta key
$values = $wpdb->get_col("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
-
Leproblème avec cette approcheest lemanque de spécificité,vous obtiendrez denombreux résultats àpartir d'unetelle requête,quipourraientinclure desbrouillons,des élémentsmis à la corbeille,des articles,despageset tout autretype depublicationexistant.Vousne devriezjamais demander ce dont vousn'avezpasbesoin,la spécificitéesttrès certainement requiseici.The issue with this approach is the lack of specificity, you'll get numerous results from such a query, which could include drafts, trashed items, posts, pages, and any other post type that exists. You should never query for what you don't need, specificity is most certainly required here.
- 3
- 2014-01-24
- t31os
-
S'ilest vrai que vouspouvez obtenir des valeurs d'autrestypeset statuts depublication,il y a desmoments oùtout ce dont vous avezbesoin sont les valeurset vousn'avez utilisé cettemeta_keynullepartmais là où vousen avezbesoin.Sitoutes/laplupart des valeurs sont uniques,celapeut être lameilleure solution.While it is true that you could get values from other post types and statuses, there are times when all you need are the values and you haven't used that meta_key anywhere but where you need it. If all/most values are unique, this may be the best solution.
- 0
- 2018-06-23
- Luke Gedeon
-
- 2012-01-31
Iln'y a aucune raisonpour que vousne puissiezpasfusionner le codet31oset Bainternetpour avoir uneinstructionpréparée réutilisable (style wordpress) qui renvoie lenombreet les valeursen une seule opérationefficace.
C'est une requêtepersonnaliséemaiselle utilisetoujours la couche d'abstraction de labase de données wordpress -parexemple,peuimporte ce que sont réellement lesnoms detable,ou s'ils changent,et c'est uneinstructionpréparée,doncnous sommes d'autantplus sûrs Attaques SQL,etc.
Dans ce cas,je ne vérifieplus letype depublicationet j'exclus les chaînes vides:
$r = $wpdb->get_results( $wpdb->prepare( " SELECT pm.meta_value AS name, count(*) AS count FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = '%s' AND pm.meta_value != '' AND p.post_type = '%s' GROUP BY pm.meta_value ORDER BY pm.meta_value ", $key, $type) ); return $r;
Dans ceparticulierest
Cela renverra untableau d'objets comme ceci:
array 0 => object(stdClass)[359] public 'name' => string 'Hamish' (length=6) public 'count' => string '3' (length=1) 1 => object(stdClass)[360] public 'name' => string 'Ida' (length=11) public 'count' => string '1' (length=1) 2 => object(stdClass)[361] public 'name' => string 'John' (length=12) public 'count' => string '1' (length=1)
There's no reason why you can't merge t31os and Bainternet's code to have a reusable prepared statement (wordpress style) that returns the count and the values in one efficient operation.
It's a custom query but it's still using the wordpress database abstraction layer - so for example it doesn't matter what the table names really are, or if they change, and it's a prepared statement so we're that much safer from SQL attacks etc.
In this instance I'm no longer checking for post type and I'm excluding empty strings:
$r = $wpdb->get_results( $wpdb->prepare( " SELECT pm.meta_value AS name, count(*) AS count FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = '%s' AND pm.meta_value != '' AND p.post_type = '%s' GROUP BY pm.meta_value ORDER BY pm.meta_value ", $key, $type) ); return $r;
In this particular is
This will return an array of objects like so:
array 0 => object(stdClass)[359] public 'name' => string 'Hamish' (length=6) public 'count' => string '3' (length=1) 1 => object(stdClass)[360] public 'name' => string 'Ida' (length=11) public 'count' => string '1' (length=1) 2 => object(stdClass)[361] public 'name' => string 'John' (length=12) public 'count' => string '1' (length=1)
-
-
Notez quepar défaut,il s'agit de lapublication actuelle,lorsqu'aucunpost_idn'est spécifié.Note that this defaults to the current post, when no post_id is specified.
- 0
- 2017-07-29
- birgire
-
Je sais comment obtenir une valeur de champpersonnaliséepour unmessage spécifique.
Ce dontj'aibesoin,c'est d'obtenirtoutes les valeurs associées à une clé depublicationpersonnalisée spécifique, danstous lesmessages .
Quelqu'un connaît-il unmoyenefficace de lefaire?Jene voudraispasparcourirtous lesidentifiants depublication dans labase de données.
Exemple:
4messages,tous avec des valeurs différentespour un champpersonnalisé appelé "Humeur". 2messages ont la valeur "heureux",1message a "en colère"et 1message a la valeur "triste"
Je veux afficher:pourtous lesmessages quenous avons: deux auteurs heureux,unen colèreet untriste auteur (s).
Maispour BEAUCOUP demessages.
Ce queje recherche,c'est soit: