ottenere tutti i valori per una chiave di campo personalizzata (cross-post)
-
-
Sembra chetu lo stia usando cometassonomia.Perchénon aggiungere semplicemente (automaticamente) untermine a questipost duranteil salvataggio?Renderebbemoltopiùfacileinterrogare.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 Nonposso ringraziarti abbastanzaperessere ungenio!@kaiser I can't thank you enough for being a genius!
- 0
- 2016-10-26
- user2128576
-
7 risposta
- voti
-
- 2011-02-15
Unpossibile approcciopotrebbeessere quello di utilizzare uno deimetodi di supportonella classe WPDBpereseguire una querybasata sumetapiù raffinata. L'avvertenzaper l'utilizzo di alcune di questefunzioni,tuttavia,è che di solitonon si ottieneindietro un semplice array di datie di solito ènecessariofare riferimentiinutili alleproprietà degli oggetti,anche se si sta chiamando solo una colonna o una riga.
Ovviamente,nontutte lefunzioni sono uguali,e unamenzionemirata va almetodo WPDB ,
get_col
che restituisce un semplice arraypiatto del dati richiesti,faccio questamenzione specificamenteperché l'esempio seguente chiamerà questometodo.WordPress - WPDB Selezione di una colonna di dati
$ wpdb->get_col ()Ecco unafunzione diesempio cheinterrogail databasepertuttii post deltipo dipost scelto,lo stato delposte con unameta chiave specifica (o un campopersonalizzatoperi menoesperti ditecnologia).
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; }
Quindi,adesempio,se desideri scoprire qualipost hanno unameta chiave di valutazione ,periltipo dipost film e desiderimemorizzaretaliinformazioni all'interno di una variabile,unesempio ditale chiamata sarebbe ..
$movie_ratings = get_meta_values( 'rating', 'movies' );
Senon si desiderafare altro che stamparei dati sullo schermo,lafunzioneimplode di PHPpuò unire rapidamente quel semplice arrayin righe di dati.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
Puoi anche utilizzarei dati restituitiper calcolare quantipost hanno questimeta valorieseguendo un semplice ciclo sui dati restituitie costruendo un array dei conteggi,adesempio.
$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. */
Questa logicapotrebbeessere applicata a varitipi di datiedestesaperfunzionarein moltimodi diversi. Quindi spero chei mieiesempi siano stati utilie abbastanza semplici da seguire.
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.
-
Anche unfatto divertenteperi futuri spettatori,se vuoiestrarre solometa valori unici - digita "DISTINCT" subito dopo "SELEZIONA"nellafunzione sopra.Potrebbeessere 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
-
Penso che questo siaestremamente utileI think this is extremely useful
- 0
- 2017-05-01
- Pablo S G Pacheco
-
Comefare questoe restituirei valori ordinati? Penso che usando ORDERbymanon riesco a capire come usarloHow 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
Vorrei solo aggiungere unapiccola cosa al codice di t31os sopra.Ho cambiato "SELECT"in "SELECT DISTINCT"pereliminare voci duplicate quando ho usatoio stesso questo codice.
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.
-
Possoimmaginare casiin cui sarebbe valido averepiùmeta valori dello stesso valore,e quindinon hofatto quell'aggiunta almio codice.Se vuoi valori distinti,questa sarebbe la strada dapercorrere.Inoltrepotresti anche aggiungerlo come argomentoper lafunzione (quindipuoi usarlo omeno,a seconda dei casi).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
Non vabene onon ènecessario utilizzareil $ wpdbglobale:
// 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 );
-
Questo sarebbeilmiometodopreferitoperfarlo,nellamaggiorparte dei casi.Esegue cinque query,anziché una sola,ma,poiché utilizza leprocedure standard di WordPresspergenerarlee inviarle,qualsiasi caching specifico dellapiattaforma (come Object Caching di WP Engine o qualcheplug-in casuale) verrà attivato.essere archiviatonella cacheinterna di WordPressper la durata della richiesta,quindinon sarànecessario recuperarlonuovamente dal database,senecessario.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
-
Eventualifiltri verranno applicati anche ai dati,il chepotrebbeessereestremamenteimportante,adesempio,su un sitomultilingue.Infine,poiché utilizza solo lefunzioniprincipali standard di WordPress,èmoltomenoprobabile che vengainterrotto da un aggiornamentofuturo.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
-
Questopotrebbeessere resopiùperformante limitando la query apostid? Aggiungi: `'fields'=> 'ids'` Quindi,l'array di query sarebbe simile a: `` array ( '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
-
Attenzione questofiltra anchei meta valori cheesistono solo suipostnonpubblicati quindi assicurati di utilizzare l'argomento 'post_status'per rendere questa unafunzionalitànon unbugCaution 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
ilmodopiù veloce sarebbe una query sqlpersonalizzatae nonne sono sicuro,mapuoiprovare
$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 ");
Semmai è uninizio.
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.
-
grazie,ma le querypersonalizzatenon dovrebberoessereevitate "atuttii costi"?Preferirei usareil livello di astrazione WP (è così che si chiama?) ...ma ovviamente se questonon èpossibile ..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
-
Le querypersonalizzate,se scrittenelmodogiusto,possonoesseremigliorie dovrestievitarle solo senon sai cosa staifacendo.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
-
Sono d'accordo conmwb. Le querypersonalizzate sonomolto utilie pratiche,mapenso che siano anchemoltopiùpesanti sul DB .. soprattutto usando lefunzioni 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
Per otteneretuttii meta valori da unameta chiave
Controlla 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'" );
-
Ilproblema con questo approccio è lamancanza di specificità,otterrainumerosi risultati da una query di questotipo,chepotrebbeincluderebozze,elementi cestinati,post,paginee qualsiasi altrotipo dipostesistente.Non dovrestimai cercare ciò chenonti serve,la specificità è sicuramente richiesta qui.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
-
Sebbene sia vero chepotresti ottenere valori da altritipi diposte stati,ci sono voltein cuitutto ciò di cui haibisogno sonoi valorie non hai usato quellameta_key danessunapartema dovene haibisogno.Setutti/lamaggiorparte dei valori sono unici,questapotrebbeessere la soluzionemigliore.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
Non c'èmotivoper cuinon èpossibile uniret31ose il codice di Bainternetper avere un'istruzionepreparata riutilizzabile (stile wordpress) che restituiscail conteggioei valoriin un'unica operazioneefficiente.
È una querypersonalizzatama utilizza ancorail livello di astrazione del database wordpress,quindi adesempiononimporta quali siano realmentei nomi delletabelle o se cambiano,ed è un'istruzionepreparata quindi siamomoltopiù al sicuro da Attacchi SQLecc.
In questo casonon stopiù controllandoiltipo diposte stoescludendo stringhe vuote:
$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 questoparticolare è
Questo restituirà un array di oggettiin questomodo:
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)
-
-
Nota che questo valorepredefinito èilpost corrente,quandonon è specificatopost_id.Note that this defaults to the current post, when no post_id is specified.
- 0
- 2017-07-29
- birgire
-
So come ottenere un valore di campopersonalizzatoper unpost specifico.
Ciò di cui hobisogno è otteneretuttii valori associati a una specifica chiave dipostpersonalizzata,in tuttii post .
Qualcuno conosce unmodoefficienteperfarlo?Non vorrei scorreretuttigli ID deipostnel DB.
Esempio:
4post,tutti con valori diversiper un campopersonalizzato chiamato "Mood". 2post hannoil valore "felice",1post "arrabbiato"e 1post "triste"
Voglioprodurre:in tuttii post abbiamo: due autorifelici,uno arrabbiatoe unotriste.
Maper MOLTIpost.
Quello che cerco è: