Abrufen aller Werte für einen benutzerdefinierten Feldschlüssel (Cross-Post)
-
-
Scheint,als würden Sie dies als Taxonomie verwenden.Warumnichteinfach (automatisch) diesen Postsbeim Speicherneinen Begriff hinzufügen?Würde das Abfragen vieleinfachermachen.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 Ich kann dirnichtgenug dafür danken,dass duein Geniebist!@kaiser I can't thank you enough for being a genius!
- 0
- 2016-10-26
- user2128576
-
7 Antworten
- Stimmen
-
- 2011-02-15
Einmöglicher Ansatz wäre die Verwendungeiner der Hilfsmethodenin der WPDB-Klasse,umeine verfeinertemetabasierte Abfrage durchzuführen. Die Einschränkungbei der Verwendungeiniger dieser Funktionenbestehtjedoch darin,dass Sienormalerweise keineinfaches Datenarray zurückerhalten undnormalerweise unnötige Verweise auf Objekteigenschaften vornehmenmüssen,selbst wenn Sienureine Spalte oder Zeile aufrufen.
Natürlich sindnicht alle Funktionenein und dasselbe,und die WPDB -Methode
get_col
,dieein einfachesflaches Array von zurückgibt,wirdgezielterwähnt Daten abgefragt,icherwähne dies speziell,weil dasfolgende Beispiel diese Methode aufruft.WordPress - WPDB Auswähleneiner Datenspalte
$ wpdb->get_col ()Hieristeine Beispielfunktion,die die Datenbanknach allen Postseines ausgewählten Post-Typs,Post-Status undmit einembestimmten Meta-Schlüssel (odereinem benutzerdefinierten Feldfür wenigertechnisch versierte) abfragt.
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; }
Wenn Siebeispielsweise herausfindenmöchten,welche Beiträge den Metaschlüssel für den Beitragstyp movies und Siemöchten diese Informationenin einer Variablen speichern. Ein Beispielfüreinen solchen Aufruf wäre ..
$movie_ratings = get_meta_values( 'rating', 'movies' );
Wenn Sienur diese Daten auf dem Bildschirm druckenmöchten,kann dieimplodierende Funktion von PHP dieseseinfache Array schnellin Datenzeilen aufteilen.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
Sie können die zurückgegebenen Daten auch verwenden,um herauszufinden,wie viele Posts diese Metawerte haben,indem Siebeispielsweiseeine einfache Schleife über die zurückgegebenen Daten durchführen undein Array der Zählwerteerstellen.
$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. */
Diese Logik kann auf verschiedene Arten von Daten angewendet und auf verschiedene Artenerweitert werden. Daher hoffeich,dassmeine Beispiele hilfreich undeinfachgenug waren,um zufolgen.
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.
-
Auchfür zukünftige Betrachtereine lustige Tatsache,wenn Sienureindeutige Metawerte abrufenmöchten -geben Siein der obigen Funktion direktnach dem AUSWÄHLEN `DISTINCT`ein.Könntenützlich sein.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
-
Ich denke,dasist äußerstnützlichI think this is extremely useful
- 0
- 2017-05-01
- Pablo S G Pacheco
-
Wieman dasmacht und die sortierten Werte zurückgibt? Ich denke,dassmit ORDERby,aberich kannnicht herausfinden,wiemanesbenutztHow 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
Ichmöchte dem obigen Code von t31os nureine Kleinigkeit hinzufügen.Ich habe "SELECT"in "SELECT DISTINCT"geändert,um doppelte Einträge zu vermeiden,wennich diesen Code selbst verwendet habe.
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.
-
Ich kannmir Fälle vorstellen,in denenesgültig wäre,mehrere Metawerte desselben Werts zu haben,und daher diesen Zusatznicht zumeinem Codegemacht habe.Wenn Sie unterschiedliche Werte wünschen,ist diesjedoch der richtige Weg.Darüber hinaus können Sie dies auch als Argumentfür die Funktion hinzufügen (damit Sieesje nach Bedarf verwenden können odernicht).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
Esistnichtgut odererforderlich,dasglobale $ wpdb zu verwenden:
// 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 );
-
Dies wärein denmeisten Fällenmeine bevorzugte Methode.Es werdennichtnureine,sondernfünf Abfragen durchgeführt. Dajedoch die Standardverfahren von WordPress zum Generieren und Senden verwendet werden,wirdjedesplattformspezifische Caching (wie das Object Caching von WP Engine oderein zufälliges Plugin) aktiviert. Die Daten werdenebenfalls aktiviertwerdenfür die Dauer der Anforderungim internen Cache von WordPressgespeichert undmüssen daherbei Bedarfnichterneut aus der Datenbank abgerufen werden.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
-
Alle Filter werden auch auf die Daten angewendet,wasbeispielsweise aufeinermehrsprachigen Site äußerst wichtig sein kann.Daesnur Standard-WordPress-Kernfunktionen verwendet,istes viel weniger wahrscheinlich,dasses durchein zukünftiges Updatebeschädigt wird.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
-
Dies kann leistungsfähigergemacht werden,indem die Abfrage auf die Post-IDbeschränkt wird. Hinzufügen: `'Felder'=> 'IDs'` Das Abfragearray würde alsofolgendermaßen aussehen: `` `Array ( 'post_type'=> $post_type, 'meta_key'=> $meta_key, 'posts_per_page'=> -1, 'Felder'=> '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
-
Achtung,diesfiltert auch Metawerte heraus,dienurfürnicht veröffentlichte Beiträge vorhanden sind. Stellen Sie daher sicher,dass Sie das Argument 'post_status' verwenden,um dies zueiner Funktion undnicht zueinem Fehler zumachenCaution 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
Der schnellste Weg wäreeine benutzerdefinierte SQL-Abfrage,undichbin mirnicht sicher,aber Sie könnenes versuchen
$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 ");
Wenn überhaupt,dannistesein Anfang.
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.
-
Danke,aber solltenbenutzerdefinierte Abfragennicht "umjeden Preis" vermieden werden?Ich würdees vorziehen,die WP-Abstraktionsschicht zu verwenden (heißt sie so?) ... abernatürlich,wenn diesnichtmöglichist.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
-
Benutzerdefinierte Abfragen könnenbesser sein,wenn sie richtiggeschrieben wurden. Sie sollten sienur vermeiden,wenn Sienicht wissen,was Sietun.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
-
Ichbin mitmwbeinverstanden. Benutzerdefinierte Abfragen sind sehrnützlich undpraktisch,aberich denke,sie sind auch viel schwererfür die Datenbank. Insbesonderemit SRT-Funktionen.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
Zum Abrufen aller Metawertemit einem Metaschlüssel
Überprüfen Sie den 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'" );
-
Das Problembei diesem Ansatzist diemangelnde Spezifität. Sieerhalten zahlreiche Ergebnisse auseiner solchen Abfrage,einschließlich Entwürfen,Papierkorb,Posts,Seiten und anderen vorhandenen Post-Typen.Sie solltenniemalsnachfragen,was Sienichtbenötigen. Hieristmit Sicherheiteine Spezifitäterforderlich.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
-
Es stimmt zwar,dass Sie Werte von anderen Beitragstypen und -status abrufen können,abermanchmalbenötigen Sienur die Werte,und Sie haben diesenmeta_keynirgendwo anders verwendet,als dort,wo Sieihnbenötigen.Wenn alle/diemeisten Werteeindeutig sind,ist diesmöglicherweise diebeste Lösung.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
Esgibt keinen Grund,warum Siet31os und Bainternets Codenicht zusammenführen können,umeine wiederverwendbare vorbereitete Anweisung (WordPress-Stil) zuerhalten,die die Anzahl und die Wertein einereffizienten Operation zurückgibt.
Es handelt sich umeine benutzerdefinierte Abfrage,diejedochimmernoch die Abstraktionsschicht der WordPress-Datenbank verwendet. So spieltesbeispielsweise keine Rolle,wie die Tabellennamen wirklich lauten oder ob sie sich ändern,undes handelt sich umeine vorbereitete Anweisung,vor der wir so viel sicherer sind SQL-Angriffe usw.
In diesem Fall überprüfeichnichtmehr den Beitragstyp und schließe leere Zeichenfolgen aus:
$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 diesem speziellen Fallist
Diesgibt ein Array von Objekten wiefolgt zurück:
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)
-
-
Beachten Sie,dass dies standardmäßig der aktuelle Beitragist,wenn keinepost_id angegebenist.Note that this defaults to the current post, when no post_id is specified.
- 0
- 2017-07-29
- birgire
-
Ich weiß,wiemaneinen benutzerdefinierten Feldwertfüreinen bestimmten Beitragerhält.
Ichmuss alle Werte,dieeinem bestimmtenbenutzerdefinierten Beitragsschlüssel zugeordnet sind, über alle Beiträge hinweg abrufen.
Kenntjemandeinen effizienten Weg,dies zutun?Ichmöchtenicht alle Post-IDsin der Datenbank durchlaufen.
Beispiel:
4 Beiträge,allemit unterschiedlichen Wertenfürein benutzerdefiniertes Feldnamens "Stimmung". 2 Beiträge haben den Wert "glücklich",1 Beitrag haben "wütend" und 1 Beitrag hat "traurig"
Ichmöchte Folgendes ausgeben: Über alle Beiträge hinweg haben wir: zweiglückliche,einen wütenden undeinen traurigen Autor.
Aberfür VIELE Beiträge.
Ich sucheentweder: