meta_query mit Metawerten als Serialisierungsarrays
11 Antworten
- Stimmen
-
- 2015-04-16
Ichbin auchin diese Situationgeraten. Hier,wasichgetan habe:
$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ) ) );
Hoffe diese Hilfe
I also run into this situation. Here what i did:
$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ) ) );
Hope this help
-
Diese Lösung hatmir sehrgutgefallen.Diesgilt leidernicht,wenn der "$ value" aucheine IDist.In diesem Fallempfehleich,Funktionen zuerstellen,umjedem Array-Elementein Zeichen hinzuzufügen,bevor die Datengespeichert werden,undeine andere Funktion,um das Zeichen zuentfernen,bevor die Daten verwendet werden.Dieses Wat,der serialisierte "i: 2" -Index,wirdnichtmit dem "i: D2" der "echten" Daten verwechselt.Der Meta-Abfrageparameter sollte dann "Wert"=> sprintf (":" D% s ";",$ value) werden,und Siebehalten die korrekte Funktionalität dieser wunderbaren Antwort!I really liked this solution. Unfortunately, this is not applicable when the `$value` is also an ID. In that case, i suggest to create to functions to add a character to each array element before saving the data and another function to remove the character before using the data. This wat, the serialized `i:2` index will not be confused with the `i:D2` of the "real" data. The meta query parameter should then become `'value' => sprintf(':"D%s";', $value),` and you will keep the correct functionality of this wonderful answer!
- 1
- 2017-04-13
- Erenor Paz
-
Diese Lösungfunktioniertbei mirThis solution is working for me
- 0
- 2018-01-12
- Rakhi
-
Das hat auchbei mirperfektfunktioniert.Hatteeine kleine Panik,alsich die akzeptierte Lösung sahThis also worked perfectly for me. Did have a mini panic when I saw the accepted solution though
- 0
- 2018-02-26
- Shane Jones
-
@Erenor Paz,ich habegeradeeine Lösung veröffentlicht,die sowohlmit ID als auchmit Stringsgutfunktioniert: https://wordpress.stackexchange.com/a/299325/25264@Erenor Paz, I just posted a solution which works well with both ID and Strings: https://wordpress.stackexchange.com/a/299325/25264
- 0
- 2018-03-29
- Pablo S G Pacheco
-
Die Verwendung von "LIKE"isteine großartige und schnelle Möglichkeit,Ihren Server herunterzufahren (ganz zu schweigen von Fehlalarmen). Sie habenbesserein sehrgutes Caching.using `LIKE` is a great and fast way to bring your server down (not to mention false positives) you better have a very good caching.
- 0
- 2018-04-02
- Mark Kaplun
-
Beachten Sie,dassbei dieser Lösungjeder Unterwertmit diesem Wert übereinstimmt.Wenn Sie alsonacheinem Breitengrad von "5" suchen,entspricht dieser auch dem Längengrad von "5".Diesistbei diesem speziellen Anwendungsfall wenigerein Problem,aberesistetwas,auf das Sie achtenmüssen.Esist auch unmöglich,die Ergebnisse zu sortieren,undesistnichtmöglich,eine Logik/Mathematik auszuführen,z. B. alle Werte abzurufen,die über oder untereiner Zahl liegenNote that with this solution, it will match any subvalue with that value. So if you look for a latitude of `5`, it will match longitudes of `5` too. This is less of an issue with this particular use case, but it's something to watch out for. It's also impossible to sort the results, and it's not possible to perform any logic/math such as fetch all values that are above or below a number
- 0
- 2020-05-29
- Tom J Nowell
-
- 2012-08-20
Sie werden wirklich die Fähigkeit verlieren,Ihre Daten aufeffiziente Weise abzufragen,wenn Sie Einträgein die WP-Datenbank serialisieren.
Die allgemeine Leistungsersparnis und der Gewinn,den Sie durch die Serialisierungerzielenmöchten,werden sichnicht wesentlichbemerkbarmachen. Möglicherweiseerhalten Sieeine etwas kleinere Datenbankgröße,aber die Kostenfür SQL-Transaktionen werden hoch sein,wenn Sie diese Felderjemals abfragen und versuchen,sie aufnützliche und sinnvolle Weise zu vergleichen.
Speichern Sie stattdessen die Serialisierungfür Daten,die Sienichtin dieser Art abfragenmöchten,sondernnurpassiv über den direkten WP-API-Aufruf
get_post_meta()
abrufen - von dieser Funktion aus kanneinen serialisierten Eintragentpacken,um auch auf seine Array-Eigenschaften zuzugreifen.Tatsächlich wurde der Wert true wiein;
zugewiesen$meta = get_post_meta( $post->ID, 'key', true );
Gibt die Daten als Array zurück,auf das Sie wiegewohnt zugreifen können.
Sie können sich auf andere Datenbank-/Site-Optimierungen wie Caching,CSS- und JS-Minimierung konzentrieren und diese Dienstebei Bedarf als CDN verwenden. Umnureinige zunennen ... WordPress Codexistein guter Ausgangspunkt,ummehr zu diesem Thema zuerfahren: HIER
You really are going to lose the ability to query your data in any efficient manner when serializing entries into the WP database.
The overall performance saving and gain you think you are achieving by serialization is not going to be noticeable to any major extent. You might obtain a slightly smaller database size but the cost of SQL transactions is going to be heavy if you ever query those fields and try to compare them in any useful, meaningful manner.
Instead, save serialization for data that you do not intend to query in that nature, but instead would only access in a passive fashion by the direct WP API call
get_post_meta()
- from that function you can unpack a serialized entry to access its array properties too.In fact assigned the value of true as in;
$meta = get_post_meta( $post->ID, 'key', true );
Will return the data as an array, accessible for you to iterate over as per normal.
You can focus on other database/site optimizations such as caching, CSS and JS minification and using such services as a CDN if you require. To name but a few.... WordPress Codex is a good starting point to uncover more on that topic: HERE
-
- 2013-08-22
Ich habemichgerademit serialisierten Feldernbefasst und konnte sie abfragen. Verwenden Sienicht diemeta_query,sonderneine SQL-Abfrage.
global $wpdb; $search = serialize('latitude').serialize(50); $query = $wpdb->prepare("SELECT `post_id` FROM `wp_postmeta` WHERE `post_id` IN (SELECT `ID` FROM `wp_posts` WHERE `post_type` = 'my-post-type') AND `meta_key` = '_coordinates' AND `meta_value` LIKE '%s'",'%'.$search.'%'); $ids = $wpdb->get_col($query); $args = array( 'post__in' => $ids 'post_type' => 'team' //add the type because the default will be 'post' ); $posts = get_posts($args);
Die Abfrage sucht zuerstnach Postsmit dempassendenpost_type,sodass die Anzahl der zufilternden wp_postmeta-Datensätzegeringerist. Dann habeicheine where-Anweisung hinzugefügt,um die Zeilen durch Filternnach
weiter zu reduzierenmeta_key
Die IDs landennach Bedarffürget_postsin einem Array.
PS.MySQL v5.6 oder höher wirdfüreine gute Leistung von Unterabfragenbenötigt
I've just dealed with serialized fields and could query them. Not using the meta_query but using a SQL query.
global $wpdb; $search = serialize('latitude').serialize(50); $query = $wpdb->prepare("SELECT `post_id` FROM `wp_postmeta` WHERE `post_id` IN (SELECT `ID` FROM `wp_posts` WHERE `post_type` = 'my-post-type') AND `meta_key` = '_coordinates' AND `meta_value` LIKE '%s'",'%'.$search.'%'); $ids = $wpdb->get_col($query); $args = array( 'post__in' => $ids 'post_type' => 'team' //add the type because the default will be 'post' ); $posts = get_posts($args);
The query first searches for post with the matching post_type so the amount of wp_postmeta records will be less to filter. Then i've added a where statement to reduce the rows further by filtering on
meta_key
The IDs end up nicely in an array as needed for get_posts.
PS. MySQL v5.6 or higher is needed for good subquery performance
-
- 2018-03-29
Ich denke,esgibt zwei Lösungen,die versuchen können,das Problem zu lösen,dass Ergebnisse sowohl als String als auch als Ganzzahlengespeichert werden. Esistjedoch wichtig zu sagen,wie anderebetonten,dassesnichtmöglichist,die Integrität der als Integergespeicherten Ergebnisse zugewährleisten,da diese Werte als serialisierte Arraysgespeichert werden und der Index und die Wertegenaumit demselben Mustergespeichert werden. Beispiel:
array(37,87);
wird wiefolgt als serialisiertes Arraygespeichert
a:2:{i:0;i:37;i:1;i:87;}
Beachten Sie den
i:0
alserste Position des Arrays und deni:37
alsersten Wert. Das Musterist dasgleiche. Abergehen wir zu den Lösungen
1) REGEXP-Lösung
Diese Lösungfunktioniertfürmich unabhängig davon,welcher Metawert als Zeichenfolge oder Nummer/IDgespeichert wird. Es wirdjedoch
REGEXP
verwendet,wasnicht so schnellist wie die Verwendung vonLIKE
$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => '\;i\:' . $value . '\;|\"' . $value . '\";', 'compare' => 'REGEXP' ) ) );
2) LIKE Solution
Ichbin mir über den Leistungsunterschiednicht sicher,aber diesisteine Lösung,die
funktioniertLIKE
verwendet und auchfür Zahlen und Zeichenfolgen$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'latitude', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ), array( 'key' => 'latitude', 'value' => sprintf(';i:%d;', $value), 'compare' => 'LIKE' ) ) );
I think there are 2 solutions that can try to solve the problem of results being stored as both String and Integers. However, it's important to say, as others pointed out, that it is not possible to guarantee the integrity of results stored as Integer, because as these values as stored as serialized arrays, the index and the values are stored exactly with the same pattern. Example:
array(37,87);
is stored as a serialized array, like this
a:2:{i:0;i:37;i:1;i:87;}
Note the
i:0
as the first position of the array andi:37
as the first value. The pattern is the same. But let's go to the solutions
1) REGEXP Solution
This solution works for me regardless of the meta value being saved as string or number / id. However it uses
REGEXP
, which is not so fast as usingLIKE
$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => '\;i\:' . $value . '\;|\"' . $value . '\";', 'compare' => 'REGEXP' ) ) );
2) LIKE Solution
I'm not sure about the performance difference but this is a solution that uses
LIKE
and also works for both number and strings$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'latitude', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ), array( 'key' => 'latitude', 'value' => sprintf(';i:%d;', $value), 'compare' => 'LIKE' ) ) );
-
`REGEXP`istin bestimmten Situationennett,aber wenn Sie` LIKE` verwenden können,denkeich,dasses diebevorzugte Methodeist.Ein alter Link,abermeiner Meinungnachimmernoch sehrnützlich: https://thingsilearn.wordpress.com/2008/02/28/mysql-query-speed-regexp-vs-like/:-)`REGEXP` is nice in certain situations, but if you can use `LIKE`, I think it's the preferable method. An old link, but still quite useful, in my opinion: https://thingsilearn.wordpress.com/2008/02/28/mysql-query-speed-regexp-vs-like/ :-)
- 0
- 2018-03-30
- Erenor Paz
-
@ErenorPaz Du hast recht.`LIKE`ist schneller.Diesistjedocheine Lösung,die sowohlfür Zeichenfolgen als auchfür Zahlenfunktioniert@ErenorPaz You are right. `LIKE` is faster. But this is a solution that works for both strings and numbers
- 0
- 2018-03-30
- Pablo S G Pacheco
-
Ja,also lautet die Antwort (wieimmer): Jenach Situation,wenn Sie "LIKE" verwenden können;esist vorzuziehen,sonst reicht REGEXP auch :-)Yes..so, the answer is (as always): depending on the situation, if you can use "LIKE"; it's preferable, otherwise REGEXP will do as well :-)
- 0
- 2018-03-31
- Erenor Paz
-
@ErenorPaz,ich habemeine Antwortbearbeitet undeine neue Lösung hinzugefügt,die "LIKE" verwendet,aber sowohlfür Zahlen als auchfür Zeichenfolgenfunktioniert.Ichbin mir über die Leistungnicht sicher,da die Ergebnissemit "ODER" verglichen werdenmüssen@ErenorPaz, I edited my answer adding a new solution that uses `LIKE` but works for both numbers and strings. I'm not sure about the performance because it has to compare the results using `OR`
- 0
- 2018-04-01
- Pablo S G Pacheco
-
Genau !!!wasichbrauche,um dasgleiche Ergebnis zuerhalten .... Danke,Mann!!!Exactly !!! which i need to get result same like this.... Thanks Man!!!
- 0
- 2018-09-27
- kuldip Makadiya
-
- 2012-12-12
Dieses Beispiel hatmir wirklichgeholfen. Esist speziellfür das S2Members-Plugin (das Benutzermetadaten serialisiert). Sie könnenjedocheinen Teileines serialisierten Arraysinnerhalb desmeta_key abfragen.
Esfunktioniertmit der MySQL REGEXP-Funktion.
Hier ist die Quelle
Hierist der Code,der allein den USA lebenden Benutzer abfragt. Ich habeeseinfachgeändert,umeinesmeinerbenutzerdefinierten Registrierungsfelder abzufragen,undes hatin kürzester Zeitfunktioniert.
<?php global $wpdb; $users = $wpdb->get_results ("SELECT `user_id` as `ID` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_custom_fields' AND `meta_value` REGEXP '.*\"country_code\";s:[0-9]+:\"US\".*'"); if (is_array ($users) && count ($users) > 0) { foreach ($users as $user) { $user = /* Get full User object now. */ new WP_User ($user->ID); print_r($user); /* Get a full list of properties when/if debugging. */ } } ?>
This example really helped me. It's specifically for S2Members plugin (which serializes user metadata). But it allows you to query a portion of a serialized array within the meta_key.
It works by using the MySQL REGEXP function.
Here is the source
Here is the code that queries all users living in the US. I easily modified it to query one of my custom registration fields and had it working in no time.
<?php global $wpdb; $users = $wpdb->get_results ("SELECT `user_id` as `ID` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_custom_fields' AND `meta_value` REGEXP '.*\"country_code\";s:[0-9]+:\"US\".*'"); if (is_array ($users) && count ($users) > 0) { foreach ($users as $user) { $user = /* Get full User object now. */ new WP_User ($user->ID); print_r($user); /* Get a full list of properties when/if debugging. */ } } ?>
-
- 2015-01-22
Nachdemicheine Reihe von Tipps zum Ausführeneiner
WP_Query
-Filterung durch serialisierte Arraysgelesen habe,habeich Folgendesgetan: Durch Erstelleneines Arrays von durch Kommasgetrennten Wertenmithilfe vonimplodein Verbindungmit einem$ wpdb
benutzerdefinierte SQL-Abfrage unter Verwendung vonFIND_IN_SET
zum Durchsuchen der durch Kommasgetrennten Listenach dem angeforderten Wert.(Dies ähnelt der Antwort von Tomas,istjedochfür die SQL-Abfrageetwas weniger leistungsintensiv.)
1. Infunctions.php:
Verwenden Siein Ihrer Dateifunctions.php (oder woimmer Sie die Meta-Boxeinrichten)in der Funktion
yourname_save_post ()
update_post_meta ($post- > ID,'checkboxArray',implode (",",$ checkboxArray));//Hinzufügen der Implode
,um das Arraymit durch Kommasgetrennten Werten zuerstellen.
Siemöchten Ihre Ausgabevariable auchin der Konstruktionsfunktion
ändernyourname_post_meta ()
adminmetaboxin$ checkboxArray=explode (",",get_post_custom ($post- > ID) ["checkboxArray"] [0]);//Hinzufügen der Explosion
2. In der PHP-Vorlagendatei:
Test: Wenn Sieeinen
get_post_meta ($id) ausführen;
sollten SiecheckboxArray
als Array sehen,das Ihre durch Kommasgetrennten Werte anstelleeines serialisierten Arraysenthält.Jetzterstellen wir unserebenutzerdefinierte SQL-Abfragemit
$wpdb
.global $ wpdb; $ search=$post- > ID; $ query="SELECT * FROM wp_posts WHERE FIND_IN_SET ($ search,( SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.meta_key='blogLocations' AND wp_postmeta.post_id=wp_posts.ID) ) AND (wp_posts.post_type='post') AND (wp_posts.post_status='veröffentlichen'); "; $posts=$ wpdb- >get_results ($ query); foreach ($posts als $post) { //dein Beitragsinhalt hier }}
Beachten Sie den
FIND_IN_SET
,hiergeschieht die Magie.Nun ... daich
SELECT *
verwende,werden alle Post-Daten zurückgegeben,undinnerhalb vonforeach
können Sie herausfinden,waspassiert Siemöchten davon (machen Sieeinenprint_r ($posts);
,wenn Sienicht wissen,wasenthaltenist. Es wirdnicht "die Schleife"für Sieeingerichtet (ichbevorzugees so),aber Es kann leichtgeändert werden,um die Schleifeeinzurichten,wenn Sie diesbevorzugen (siehesetup_postdata ($post);
im Codexmüssen Sie wahrscheinlichSELECT *
umnur Post-IDs und$ wpdb- >get_results
für den richtigen$ wpdb
-Typ auszuwählen - siehe den Codexfür$ wpdb
auchfür Informationen zu diesem Thema).Welpe,es hatein wenig Mühegekostet,aber da
wp_query
das Ausführen von'compare'=> 'IN'
serialisierte oder durch Kommasgetrennte Werte Diese Unterlegscheibeist diebeste Option!Hoffe,das hilftjemandem.
After reading a bunch of tips for running a
WP_Query
filtering by serialized arrays, here's how I finally did it: by creating an array of comma separated values using implode in conjunction with a$wpdb
custom SQL query utilizingFIND_IN_SET
to search the comma separated list for the requested value.(this is similar to Tomas's answer, but its a bit less performance intensive for the SQL query)
1. In functions.php:
In your functions.php file (or wherever you're setting up the meta box) in the
yourname_save_post()
function useupdate_post_meta($post->ID, 'checkboxArray', implode(",", $checkboxArray)); //adding the implode
to create the array containing comma separated values.
You'll also want to change your output variable in the
yourname_post_meta()
admin meta box construction function to$checkboxArray = explode(",", get_post_custom($post->ID)["checkboxArray"][0]); //adding the explode
2. In the template PHP file:
Test: if you run a
get_post_meta( $id );
you should seecheckboxArray
as an array containing your comma separated values instead of a serialized array.Now, we build our custom SQL query using
$wpdb
.global $wpdb; $search = $post->ID; $query = "SELECT * FROM wp_posts WHERE FIND_IN_SET( $search, ( SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.meta_key = 'blogLocations' AND wp_postmeta.post_id = wp_posts.ID ) ) AND ( wp_posts.post_type = 'post' ) AND ( wp_posts.post_status = 'publish' );"; $posts = $wpdb->get_results($query); foreach ($posts as $post) { //your post content here }
Notice the
FIND_IN_SET
, that's where the magic happens.Now... since I'm using
SELECT *
this returns all the post data and within theforeach
you can echo out what you want from that (do aprint_r($posts);
if you don't know what's included. It doesn't set up "the loop" for you (I prefer it this way), but it can easily be modified to set up the loop if you prefer (take a look atsetup_postdata($post);
in the codex, you'll probably need to changeSELECT *
to select only post ID's and$wpdb->get_results
to the correct$wpdb
type -- see the codex for$wpdb
also for information on that subject).Whelp, it took a bit of effort, but since
wp_query
doesn't support doing'compare' => 'IN'
serialized or comma separated values this shim is your best option!Hope this helps someone.
-
- 2015-07-03
Wenn Siein Ihrer Metaabfrage den Vergleichsoperator
like
verwenden,sollteesgutfunktionieren,in ein serialisiertes Array zu schauen.$wp_user_search = new WP_User_Query(array( 'meta_query' => array( array( 'key' => 'wp_capabilities', 'value' => 'subscriber', 'compare' => 'not like' ) ) ) );
führt zu:
[query_where] => WHERE 1=1 AND ( ( wp_usermeta.meta_key = 'wp_capabilities' AND CAST(wp_usermeta.meta_value AS CHAR) NOT LIKE '%subscriber%' )
If you use the
like
comparison operator in your meta query, it should work fine to look inside a serialized array.$wp_user_search = new WP_User_Query(array( 'meta_query' => array( array( 'key' => 'wp_capabilities', 'value' => 'subscriber', 'compare' => 'not like' ) ) ) );
results in:
[query_where] => WHERE 1=1 AND ( ( wp_usermeta.meta_key = 'wp_capabilities' AND CAST(wp_usermeta.meta_value AS CHAR) NOT LIKE '%subscriber%' )
-
- 2016-07-07
Wennmeine Metadaten vom Array-Typ sind,verwendeich diese Methodefür die Abfragenach Meta:
$args = array( 'post_type' => 'fotobank', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'collections', 'value' => ':"'.$post->ID.'";', 'compare' => 'LIKE' ) ) ); $fotos = new WP_Query($args);
If my meta data is array type, i'm use this method for query by meta:
$args = array( 'post_type' => 'fotobank', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'collections', 'value' => ':"'.$post->ID.'";', 'compare' => 'LIKE' ) ) ); $fotos = new WP_Query($args);
-
Dies kann zu unerwünschten Ergebnissenführen,wenneine Post-ID denselben Wert wie die ID der serialisierten Zeichenfolge hatThis could lead to unwanted results when a post ID has the same value as the id of the serialized string
- 0
- 2017-04-13
- Erenor Paz
-
- 2017-07-06
Ich wurdeneugierig auf die obigen Antworten,bei denen die
meta_query
auf den Schlüssellatitude
anstatt auf_coordinates
abzielte. Ichmusstetesten,obesin Metaabfragen wirklichmöglich war,einen bestimmten Schlüsselin einem serialisierten Array anzuvisieren. :)Das war offensichtlichnicht der Fall.
Beachten Sie also,dass der richtige Schlüssel zum Ziel
_coordinates
anstelle vonlatitude
ist.$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => '_coordinates', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ) ) );
HINWEISE:
-
Mit diesem Ansatz könnennurexakte Übereinstimmungenermittelt werden. Dinge wie alle Breitengrößer als 50 sind alsonichtmöglich.
-
Um Teilstring-Übereinstimmungeneinzuschließen,könnteman
'value' => sprintf(':"%%%s%%";', $value),
. (nochnichtgetestet)
I got curious about the answers above, where the
meta_query
targeted the keylatitude
instead of_coordinates
. Had to go and test if it really was possible in meta queries to target a specific key inside a serialized array. :)That obviously wasn't the case.
So, note that the correct key to target is
_coordinates
instead oflatitude
.$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => '_coordinates', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ) ) );
NOTES:
This approach makes it only possible to target exact matches. So things like all latitudes greater than 50 are not possible.
To include substring matches, one could use
'value' => sprintf(':"%%%s%%";', $value),
. (haven't tested)
-
- 2011-05-12
Ich habe diegleiche Frage.Vielleichtbrauchen Sie den Parameter 'type'?Schauen Sie sich diese verwandte Frage an: Benutzerdefinierte Feldabfrage - Metawertist Array
Vielleicht versuchen Sie:
$ args=array ( 'post_type'=> 'my-post-type', 'meta_query'=> array ( Array ( 'Schlüssel'=> 'Breitengrad', 'Wert'=> '50', 'compare'=> '>', 'type'=> 'numeric' ) ) );
I have the same question. Maybe you need the 'type' parameter? Check out this related question: Custom Field Query - Meta Value is Array
Perhaps try:
$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => '50', 'compare' => '>', 'type' => 'numeric' ) ) );
-
Dankefür den Vorschlag,aber dasistnichtganz das,wonachich suche.Das Problemist,dass der Wert,denich abgleichenmöchte,Teileines Arraysist,dasin der Datenbank serialisiertist.Thanks for the suggestion, but this isn't quite what I'm after. The problem is that the value I'm trying to match is a part of an array that is serialized within the database.
- 0
- 2011-05-13
- tollmanz
-
Ja,du hast recht.Ich habees heute Morgen versucht undes hat auchbei mirnichtfunktioniert. Ich habe dasgleiche Problem.Speicherneines Wertseines Metaschlüssels als Array.Ichfange an zu denken,dass diesnichtmöglichist undichmuss sie stattdessenmöglicherweise als separate Metafeldermit demselben Namen speichern ... undnur das Löschen/Aktualisieren ordnungsgemäß verwalten.Yea, you're right. I tried this this morning and it didn't work for me either. I have the same issue. Storing a value of a meta key as an array. I'm starting to think this can't be done and I might instead have to store them as separate meta fields with the same name...and just manage the deleting/updating of them properly.
- 0
- 2011-05-13
- user4356
-
@ user4356 ...genau das werdeichtun.Ich hattegehofft,die Anzahl der Zeilen,dieichfürjeden Beitrageinfügen würde,reduzieren zu können,aberich denke,dasistnichtmöglich.@user4356...that's exactly what I'm going to do. I was hoping to cut down on the number of rows that I would insert for each post, but I guess that's not possible.
- 0
- 2011-05-14
- tollmanz
-
- 2011-05-12
Bei der Verwendung des Magic Fields-Pluginsbin ich aufetwas Ähnlichesgestoßen.Dies könnte den Tricktun
$values_serialized = serialize(array('50')); $args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => $values_serialized, 'compare' => '>' ) ) );
I ran into something similar while using the Magic Fields plugin. This might do the trick
$values_serialized = serialize(array('50')); $args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => $values_serialized, 'compare' => '>' ) ) );
-
Dankefür den Vorschlag!Ich denke,dasist sonah wiemöglich,aberes wirdnichtfunktionieren,da der Vergleicheines serialisierten Arraysmit einem anderen serialisierten Arraynur dann Sinnmacht,wennichnacheinergenauen Übereinstimmunggesucht habe.Thanks for the suggestion! I think this is as close as one can get, but it won't actually work because comparing a serialized array to another serialized array doesn't made sense unless I was looking for an exact match.
- 1
- 2011-05-13
- tollmanz
-
Dann sollte diesnicht als die richtige Antwortmarkiert werden undesist unverantwortlich von Ihnen,dies zutun.Die richtige Antwort wäre also "Nein,dasistnichtmöglich".Then this shouldn't be marked as the correct answer and it is irresponsible of you to do so. The correct answer thus would be 'No, it's not possible'
- 5
- 2012-08-20
- Tom J Nowell
-
Stimmen Sie zu,auch WP übernimmt die Serialisierungfür Sie. `Serialize ()`istin diesem Fallnichterforderlich ...Agree, also WP handles serialization for you, `serialize()` is not required in this instance...
- 1
- 2012-08-20
- Adam
-
Tatsächlichist die Antwort von @ seth-stevensongroßartig,wenn Siegenau dastun,wasergesagt hat,indem Sie das Plugin "Magic Fields" verwenden.Da dieses Plugin standardmäßigbestimmte Datentypen serialisiert,ist dies derbeste Weg,umeine GENAUE Übereinstimmung zuerzielen.Actually @seth-stevenson answer is great when doing exactly what he said, using "Magic Fields" plugin. As that plugin serializes certain data type by default, this is the best way to do an EXACT match.
- 2
- 2013-01-09
- zmonteca
-
@ TomJNowell Fertig!Ich habegerade 5 Monategebraucht;)@TomJNowell Done! Just took me 5 months ;)
- 0
- 2013-01-17
- tollmanz
Ich arbeite aneinem Projekt,in demicheinen benutzerdefinierten Beitragstyp undbenutzerdefinierte Datenerstelle,die über Meta-Boxeneingegeben werden,diemeinem benutzerdefinierten Beitragstyp zugeordnet sind. Ausirgendeinem Grund habeichbeschlossen,die Meta-Boxen so zu codieren,dass die Eingabenin jeder Metabox Teileines Arrays sind. Zum Beispiel speichereich Längen- und Breitengrade:
Ausirgendeinem Grundgefielmir die Idee,fürjede Metaboxeinen einzelnen Postmeta-Eintrag zu haben. Beim Hook
save_post
speichereich die Daten wiefolgt:Ich habe diesgetan,weilich drei Metaboxen habe undnur 3 Postmeta-Wertefürjeden Beitrag habenmöchte. Jetzt habeichjedochein potenzielles Problem damiterkannt. Ichmöchtemöglicherweise WP_Query verwenden,umnurbestimmte Beiträgebasierend auf diesen Metawerten abzurufen. Zum Beispielmöchteichmöglicherweise alle Beiträgemit Breitengradwerten über 50erhalten. Wennich diese Dateneinzelnin der Datenbank hätte,möglicherweise unter Verwendung des Schlüssels
latitude
,würdeich Folgendestun:Daich den Breitengrad als Teil der Postcode
_coordinates
habe,würde diesnichtfunktionieren.Meine Frageist also,gibt eseine Möglichkeit,
meta_query
zu verwenden,umein serialisiertes Array abzufragen,wieichesin diesem Szenario habe?