meta_query avec des valeurs méta comme tableaux de sérialisation
11 réponses
- votes
-
- 2015-04-16
Je rencontre également cette situation. Voici ce quej'aifait:
$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ) ) );
J'espère que cette aide
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
-
J'ai vraiment aimé cette solution.Malheureusement,celane s'appliquepas lorsque la «valeur $»est également unidentifiant.Dans ce cas,je suggère de créer desfonctionspour ajouter un caractère à chaque élément dutableau avant d'enregistrer les donnéeset une autrefonctionpour supprimer le caractère avant d'utiliser les données.Ce wat,l'index sérialisé «i: 2»ne serapas confondu avec le «i: D2» des données «réelles».Leparamètre deméta-requête doit alors devenir `` valeur '=> sprintf (': "D% s"; ',$ valeur),`et vous conserverez lafonctionnalité correcte de cettemerveilleuse réponse!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
-
Cette solutionfonctionnepourmoiThis solution is working for me
- 0
- 2018-01-12
- Rakhi
-
Cela a égalementparfaitementfonctionnépourmoi.J'aieu unemini panique quandj'ai vu la solution acceptéeThis 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,je viens depublier une solution quifonctionnebien avec lesidentifiantset les chaînes: 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
-
l'utilisation de `LIKE`est unmoyenefficaceet rapide demettre votre serveur hors service (sansparler desfauxpositifs),vousferiezmieux d'avoir unetrèsbonnemiseen cache.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
-
Notez qu'avec cette solution,il correspondra àtoute sous-valeur avec cette valeur.Donc,si vous recherchez une latitude de «5»,elle correspondra également à des longitudes de «5».C'estmoins unproblème avec ce cas d'utilisationparticulier,mais c'est quelque chose à surveiller.Ilest égalementimpossible detrier les résultats,et iln'estpaspossible d'effectuer des opérations logiques/mathématiquestelles que récupérertoutes les valeurs supérieures ouinférieures à unnombreNote 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
Vous allez vraimentperdre lapossibilité d'interroger vos données demanièreefficace lors de la sérialisation desentrées dans labase de données WP.
Les économies deperformancesglobaleset legain que vouspensez obtenirgrâce à la sérialisationne serontpasperceptibles dans une largemesure. Vouspouvez obtenir unetaille debase de données légèrementpluspetite,mais le coût destransactions SQL sera lourd si vousinterrogez ces champset essayez de les comparer demanière utileet significative.
Au lieu de cela,enregistrez la sérialisationpour les données que vousn'avezpas l'intention d'interroger de cettenature,mais que vousn'accédez que demanièrepassivepar l'appel direct de l'API WP
get_post_meta()
- àpartir de cettefonctionpeut également décompresser uneentrée sérialiséepour accéder à sespropriétés detableau.Enfait attribué la valeur de vrai comme dans;
$meta = get_post_meta( $post->ID, 'key', true );
Renvoie les données sousforme detableau,accessiblepour que vouspuissiez lesparcourirnormalement.
Vouspouvez vous concentrer sur d'autres optimisations debase de données/sitetelles que lamiseen cache,laminification CSSet JSet l'utilisation detels services comme CDN si vousen avezbesoin. Pourn'en citer que quelques-uns ... WordPress Codexest unbonpoint de départpouren savoirplus sur ce sujet: ICI
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
Je viens detraiter des champs sérialiséset jepourrais lesinterroger. Nepas utiliser lameta_querymais utiliser une requête SQL.
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);
La requête recherche d'abord lapublication avec lepost_type correspondant,donc la quantité d'enregistrements wp_postmeta serainférieure àfiltrer. Ensuite,j'ai ajouté uneinstruction wherepour réduire davantage les lignesen filtrant sur
meta_key
Lesidentifiants se retrouventbien dans untableau selon lesbesoins deget_posts.
PS.MySQL v5.6 ou supérieurestnécessairepour debonnesperformances de sous-requête
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
Jepense qu'ilexiste 2 solutions quipeuventessayer de résoudre leproblème des résultats stockés à lafois sousforme de chaîneet d'entiers. Cependant,ilestimportant de dire,comme d'autres l'ont souligné,qu'iln'estpaspossible degarantir l'intégrité des résultats stockésen tant qu'Integer,car comme ces valeurs sont stockées sousforme detableaux sérialisés,l'indexet les valeurs sont stockésexactement avec lemêmemodèle. Exemple:
array(37,87);
est stocké sousforme detableau sérialisé,comme ceci
a:2:{i:0;i:37;i:1;i:87;}
Notez le
i:0
commepremièreposition dutableaueti:37
commepremière valeur. Le schémaest lemême. Maispassons aux solutions
1) Solution REGEXP
Cette solutionfonctionnepourmoi quelle que soit la valeurmétaenregistrée sousforme de chaîne ou denombre/id. Cependant,il utilise
REGEXP
,ce quin'estpas aussi rapide que d'utiliserLIKE
$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => 'latitude', 'value' => '\;i\:' . $value . '\;|\"' . $value . '\";', 'compare' => 'REGEXP' ) ) );
2) LIKE Solution
Jene suispas sûr de la différence deperformances,mais c'est une solution qui utilise
LIKE
et fonctionne égalementpour lesnombreset les chaînes$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`estbien dans certaines situations,mais si vouspouvez utiliser` LIKE`,je pense que c'est laméthodepréférable.Un vieux lien,maistoujours assez utile,àmon avis: 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 Vous avez raison.«LIKE»estplus rapide.Mais c'est une solution quifonctionne à lafoispour les chaîneset lesnombres@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
-
Oui .. ainsi,la réponseest (commetoujours): selon la situation,si vouspouvez utiliser "LIKE";c'estpréférable,sinon REGEXPfera aussibien :-)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,j'ai éditéma réponseen ajoutant unenouvelle solution qui utilise `LIKE`maisfonctionne à lafoispour lesnombreset les chaînes.Jene suispas sûr de laperformance caril doit comparer les résultatsen utilisant `OU`@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
-
Exactement !!!dontj'aibesoinpour obtenir lemême résultat comme celui-ci .... Mercimec!!!Exactly !!! which i need to get result same like this.... Thanks Man!!!
- 0
- 2018-09-27
- kuldip Makadiya
-
- 2012-12-12
Cetexemplem'a vraiment aidé. C'est spécifiquementpour leplugin S2Members (qui sérialise lesmétadonnées utilisateur). Mais cela vouspermet d'interroger unepartie d'untableau sérialisé dans lameta_key.
Celafonctionneen utilisant lafonction MySQL REGEXP.
Voici la source
Voici le code quiinterrogetous les utilisateurs résidant aux États-Unis. Je l'aifacilementmodifiépourinterroger l'un demes champs d'enregistrementpersonnaliséset l'aifaitfonctionneren un rien detemps.
<?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
Après avoir lu denombreux conseilspourexécuter unfiltrage
WP_Query
par destableaux sérialisés,voici commentje l'aifinalementfait:en créant untableau de valeurs séparéespar des virgulesen utilisantimplodeen conjonction avec un$ wpdb
requête SQLpersonnalisée utilisantFIND_IN_SET
pour rechercher dans la liste séparéepar des virgules la valeur demandée.(ceciest similaire à la réponse de Tomas,mais c'est unpeumoinsgourmanden performancespour la requête SQL)
1. Dansfunctions.php:
Dans votrefichierfunctions.php (oupartout où vous configurez laméta-boîte) dans lafonction
yourname_save_post ()
utilisez lafonctionupdate_post_meta ($post- > ID,'checkboxArray',implode (",",$ checkboxArray));//ajout de l'implosion
pour créer letableau contenant des valeurs séparéespar des virgules.
Vous voudrez également changer votre variable de sortie dans lafonction de construction de laméta-boîte admin
yourname_post_meta ()
en$ checkboxArray=exploser (",",get_post_custom ($post- > ID) ["checkboxArray"] [0]);//ajout de l'éclatement
2. Dans lefichier demodèle PHP:
Test: si vousexécutez un
get_post_meta ($id);
vous devriez voircheckboxArray
comme untableau contenant vos valeurs séparéespar des virgules au lieu d'untableau sérialisé.Maintenant,nous construisonsnotre requête SQLpersonnaliséeen utilisant
$wpdb
.global $ wpdb; $ search=$post- > ID; $ query="SELECT * FROM wp_posts WHERE FIND_IN_SET ($ recherche,( 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='publier'); "; $posts=$ wpdb- >get_results ($ query); foreach ($posts comme $post) { //le contenu de votremessageici }
Remarquez le
FIND_IN_SET
,c'est là que lamagie opère.Maintenant ...puisquej'utilise
SELECT *
cela renvoie toutes les données depublication et dans leforeach
vouspouvezfaire écho à ce que que vous voulez de cela (faites unprint_r ($posts);
si vousne savezpas ce quiestinclus. Celane metpasen place "laboucle"pour vous (jepréfère ça comme ça),maisilpeut êtrefacilementmodifiépour configurer laboucle si vouspréférez (jetez un œil àsetup_postdata ($post);
dans le codex,vous devrezprobablement changerSELECT *
pour sélectionner uniquement les ID depublicationet$ wpdb- >get_results
autype$ wpdb
correct - voir le codexpour$ wpdb
égalementpourinformations sur ce sujet).Whelp,cela a demandé unpeu d'effort,mais comme
wp_query
ne prendpasen charge les opérations'compare'=> 'IN'
valeurs sérialisées ou séparéespar des virgules,ce shimest votremeilleure option!J'espère que cela aide quelqu'un.
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
Si vous utilisez l'opérateur de comparaison
like
dans votreméta-requête,cela devraitfonctionner correctementpour regarder à l'intérieur d'untableau sérialisé.$wp_user_search = new WP_User_Query(array( 'meta_query' => array( array( 'key' => 'wp_capabilities', 'value' => 'subscriber', 'compare' => 'not like' ) ) ) );
donne:
[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
Simesmétadonnées sont detypetableau,j'utilise cetteméthodepour les requêtesparméta:
$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);
-
Celapeutentraîner des résultatsindésirables lorsqu'un ID depublication a lamême valeur que l'ID de la chaîne sérialiséeThis 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
J'ai été curieux de connaître les réponses ci-dessus,où la
meta_query
ciblait la clélatitude
au lieu de_coordinates
. J'ai dûtester s'il était vraimentpossible dans lesméta-requêtes de cibler une clé spécifique dans untableau sérialisé. :)Cen'était évidemmentpas le cas.
Alors,notez que labonne clé à ciblerest
_coordinates
au lieu delatitude
.$args = array( 'post_type' => 'my-post-type', 'meta_query' => array( array( 'key' => '_coordinates', 'value' => sprintf(':"%s";', $value), 'compare' => 'LIKE' ) ) );
-
Cette approchepermet uniquement de cibler des correspondancesexactes. Donc,des choses comme toutes les latitudes supérieures à 50 ne sontpaspossibles.
-
Pourinclure les correspondances de sous-chaînes,onpeut utiliser
'value' => sprintf(':"%%%s%%";', $value),
. (pastesté)
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
J'ai lamême question.Peut-être avez-vousbesoin duparamètre «type»?Consultez cette question connexe: Requête de champpersonnalisé - Laméta valeurest Array
Essayezpeut-être:
$ args=tableau ( 'post_type'=> 'mon-type-post', 'meta_query'=>tableau ( tableau ( 'key'=> 'latitude', 'value'=> '50', 'compare'=> '>', 'type'=> 'numérique' ) ) );
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' ) ) );
-
Mercipour la suggestion,mais cen'estpastout àfait ce queje recherche.Leproblèmeest que la valeur quej'essaie defaire correspondrefaitpartie d'untableau quiest sérialisé dans labase de données.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
-
Oui,tu as raison.J'aiessayé cematinet celan'apasfonctionnépourmoinonplus. J'ai lemêmeproblème.Stockage d'une valeur d'une cléméta sousforme detableau.Je commence àpenser que celane peutpas êtrefaitet queje devraispeut-être à laplace les stockeren tant queméta-champs séparés avec lemêmenom ...et simplementgérer leur suppression/mise àjour correctement.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 ... c'estexactement ce queje vaisfaire.J'espérais réduire lenombre de lignes quej'inséreraispour chaquemessage,maisje suppose que cen'estpaspossible.@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
J'ai rencontré quelque chose de similaireen utilisant leplugin Magic Fields.Celapourraitfaire l'affaire
$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' => '>' ) ) );
-
Mercipour la suggestion!Jepense que c'est aussiproche quepossible,mais celane fonctionnerapasparce que comparer untableau sérialisé à un autretableau sérialisén'apas de sens àmoins queje ne cherche une correspondanceexacte.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
-
Ensuite,celane devraitpas êtremarqué comme labonne réponseet ilestirresponsable de votrepart de lefaire.Labonne réponse serait donc `` Non,cen'estpaspossible ''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
-
D'accord,WPgère également la sérialisationpour vous,`serialize ()`n'estpas requis dans cetteinstance ...Agree, also WP handles serialization for you, `serialize()` is not required in this instance...
- 1
- 2012-08-20
- Adam
-
Enfait,la réponse @ seth-stevensonestexcellentepourfaireexactement ce qu'il a dit,en utilisant leplugin "Magic Fields".Comme ceplugin sérialise certainstypes de donnéespar défaut,c'est lameilleurefaçon defaire une correspondance EXACTE.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
-
@TomJNowellterminé!Celam'ajustepris 5mois;)@TomJNowell Done! Just took me 5 months ;)
- 0
- 2013-01-17
- tollmanz
Jetravaille sur unprojet dans lequelje crée untype depublicationpersonnaliséet des donnéespersonnalisées saisies via desméta-boîtes associées àmontype depublicationpersonnalisé. Pour une raison quelconque,j'ai décidé de coder lesméta-boîtes demanière à ce que lesentrées de chaquemétaboxfassentpartie d'untableau. Parexemple,je stocke la longitudeet la latitude:
Pour une raison quelconque,j'ai aimé l'idée d'avoir uneentréepostmeta singulièrepour chaquemétabox. Sur le crochet
save_post
,je sauvegarde les données comme ceci:J'aifait celaparce quej'aitroismétaboxeset j'aime avoirjuste 3 valeurspostmetapour chaquemessage; cependant,j'aimaintenant réalisé unproblèmepotentiel avec ceci. Jepeux utiliser WP_Querypourne retirer que certains articlesbasés sur cesméta-valeurs. Parexemple,je pourrais vouloir obtenirtous lesmessages dont la latitudeest supérieure à 50. Sij'avais ces donnéesindividuellement dans labase de données,peut-êtreen utilisant la clé
latitude
,je ferais quelque chose comme:Puisquej'ai la latitude dans le cadre dupostmeta
_coordinates
,celane fonctionneraitpas.Ma questionest donc: y a-t-il unmoyen d'utiliser
meta_query
pourinterroger untableau sérialisé commeje l'ai dans ce scénario?