Moyen le plus efficace pour obtenir des messages avec postmeta
-
-
Jene saispas si vous voulezmêmefaire lesjointures.la combinaison deget_posts ()et get_post_meta () vous renvoie lesmêmes données.Enfait,ilestmoinsefficace d'utiliser lesjointures car vous récupérezpeut-être des données que vousn'utiliserezpasplustard.I'm not sure if you even want to do the joins. the combination of get_posts() and get_post_meta() gives you the same data back. In fact, it's less efficient using the joins since you might be retrieving data you won't use later.
- 0
- 2012-01-10
- rexposadas
-
Lesmétadonnées depublicationne sont-ellespas automatiquementmisesen cache detoutefaçon?Isn't post meta data cached automatically anyway?
- 2
- 2012-01-11
- Manny Fleurmond
-
@rxn,sij'aiplusieurs centaines demessages qui reviennent (c'est untype demessagepersonnalisé),c'est sûrement une charge debase de données assez lourdepour `get_posts ()`,puis `get_post_meta ()`pour chacun d'entreeux? @MannyFleurmond,ilest difficile detrouver desinformationsprécises sur lamiseen cacheintégrée de WP,mais AFAIKmettraiten cache des élémentspar requête.L'appel au serveurpour récupérer ces donnéesest un appel AJAX,et jene pensepas que quoi que ce soit d'autre récupérera des choses avant lui.@rxn, if I have several hundred posts coming back (they're a custom post type), surely it's quite a heavy DB load to `get_posts()`, then `get_post_meta()` for every one of those? @MannyFleurmond, it's hard to find hard info on WP's built-in caching, but AFAIK it would cache stuff per request. The call to the server to grab this data is an AJAX call, and I don't think anything else will be grabbing stuff before it.
- 0
- 2012-01-11
- Steve Taylor
-
Enfait,je vaispourplusieurs requêteset mettreen cache les résultats.Il s'avère quenousn'avonspas seulementbesoin deméta depublication,y compris des champs qui ontplusieurs valeurs,nous avons égalementbesoin de données sur les utilisateurs connectés auxmessages via desméta-champs (deuxensembles de ceux-ci),plus desméta utilisateur sureux.Pure SQLest définitivement hors de lafenêtre!Actually, I'm going for multiple queries and caching the results. It turns out we not only need post meta, including fields that have multiple values, we also need data on users connected to the posts via meta fields (two sets of these), plus user meta on them. Pure SQL is definitely out of the window!
- 0
- 2012-01-11
- Steve Taylor
-
7 réponses
- votes
-
- 2012-01-24
Lesméta-informations depublication sont automatiquementmisesen cacheen mémoirepour une
WP_Query
standard (et la requêteprincipale),à moins que vousne lui disiez spécifiquement dene pas lefaireen utilisant leparamètreupdate_post_meta_cache
.Par conséquent,vousne devriezpas écrire vospropres requêtespour cela.
Commentfonctionne lamiseen cachemétapour les requêtesnormales:
Si leparamètre
update_post_meta_cache
duWP_Query
n'estpas défini surfalse,alors unefois que lesmessages sontextraits de labase de données,alors leupdate_post_caches()
sera appelée,qui à sontour appelleupdate_postmeta_cache()
.Lafonction
update_postmeta_cache()
est un wrapperpourupdate_meta_cache()
,et elle appelleessentiellement un simpleSELECT
avectous lesidentifiants dumessages récupérés. Cela luipermettra d'obtenirtous lespostmeta,pourtous lesmessages de la requête,et de sauvegarder ces données dans le cache d'objets (en utilisantwp_cache_add()
).Lorsque vousfaites quelque chose comme
get_post_custom()
,il vérifie d'abord ce cache d'objets. Ilne s'agit doncpas defaire de requêtes supplémentairespour obtenir laméta depublication à ce stade. Si vous avez reçu lemessage dans uneWP_Query
,alors lamétaest déjàen mémoireet elle l'obtient directement àpartir de là.Les avantagesici sontbien plusgrands que ceux d'une requête complexe,mais leplusgrand avantage vient de l'utilisation du cache d'objets. Si vous utilisez une solution demiseen cache demémoirepersistante comme XCache ou Memcached ou APC ou quelque chose comme ça,et que vous avez unplugin quipeut y lier votre cache d'objets (W3 Total Cache,parexemple),alorstout votre cache d'objetsest stocké dans unemémoire rapide déjà. Dans ce cas,il y a zéro requêtesnécessairespour récupérer vos données; c'est déjàen mémoire. Lamiseen cache d'objetspersistantsestgéniale àbien des égards.
En d'autrestermes,votre requête se chargeet se chargeprobablementplus lentement que d'utiliser une requête appropriéeet une simple solution demémoirepersistante. Utilisez le
WP_Query
normal. Épargnez-vous quelquesefforts.Supplémentaire:
update_meta_cache()
estintelligent,BTW. Ilne récupérerapas lesméta-informationspour lespublications dont lesméta-informations sont déjàmisesen cache. Iln'obtientpas deuxfois lamêmeméta,en gros. Superefficace.Supplémentaire supplémentaire: "Donnez autant detravail quepossible à labase de données." ... Non,c'est le Web. Des règles différentes s'appliquent. Engénéral,vous vouleztoujours donner le peu travailpossible à labase de données,si celaestfaisable. Lesbases de données sont lentes oumal configurées (si vousne les avezpas configurées spécifiquement,vouspouvezparier que c'est vrai). Souvent,ils sontpartagésentre denombreux siteset surchargés dans une certainemesure. Vous avezgénéralementplus de serveurs Web que debases de données. Engénéral,vous voulez simplementextraire les données que vous voulez de labase de données aussi rapidementet simplement quepossible,puisfaites letrien utilisant le code côté serveur Web. En règlegénérale,bien sûr,différents cas sonttous différents.
Post meta information is automatically cached in memory for a standard
WP_Query
(and the main query), unless you specifically tell it not to do so by using theupdate_post_meta_cache
parameter.Therefore, you should not be writing your own queries for this.
How the meta caching works for normal queries:
If the
update_post_meta_cache
parameter to theWP_Query
is not set to false, then after the posts are retrieved from the DB, then theupdate_post_caches()
function will be called, which in turn callsupdate_postmeta_cache()
.The
update_postmeta_cache()
function is a wrapper forupdate_meta_cache()
, and it essentially calls a simpleSELECT
with all the ID's of the posts retrieved. This will have it get all the postmeta, for all the posts in the query, and save that data in the object cache (usingwp_cache_add()
).When you do something like
get_post_custom()
, it's checking that object cache first. So it's not making extra queries to get the post meta at this point. If you've gotten the post in aWP_Query
, then the meta is already in memory and it gets it straight from there.Advantages here are many times greater than making a complex query, but the greatest advantage comes from using the object cache. If you use a persistent memory caching solution like XCache or memcached or APC or something like that, and have a plugin that can tie your object cache to it (W3 Total Cache, for example), then your whole object cache is stored in fast memory already. In which case, there's zero queries necessary to retrieve your data; it's already in memory. Persistent object caching is awesome in many respects.
In other words, your query is probably loads and loads slower than using a proper query and a simple persistent memory solution. Use the normal
WP_Query
. Save yourself some effort.Additional:
update_meta_cache()
is smart, BTW. It won't retrieve meta information for posts that already have their meta information cached. It doesn't get the same meta twice, basically. Super efficient.Additional additional: "Give as much work as possible to the database."... No, this is the web. Different rules apply. In general, you always want to give as little work as possible to the database, if it's feasible. Databases are slow or poorly configured (if you didn't configure it specifically, you can bet good money that this is true). Often they are shared among many sites, and overloaded to some degree. Usually you have more web servers than databases. In general, you want to just get the data you want out of the DB as fast and simply as possible, then do the sorting out of it using the web-server-side code. As a general principle, of course, different cases are all different.
-
- 2012-01-24
Je recommanderais une requêtepivot.En utilisant votreexemple:
SELECT p.ID, p.post_title, MAX(CASE WHEN wp_postmeta.meta_key = 'first_field' then wp_postmeta.meta_value ELSE NULL END) as first_field, MAX(CASE WHEN wp_postmeta.meta_key = 'second_field' then wp_postmeta.meta_value ELSE NULL END) as second_field, MAX(CASE WHEN wp_postmeta.meta_key = 'third_field' then wp_postmeta.meta_value ELSE NULL END) as third_field, FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID) GROUP BY wp_posts.ID,wp_posts.post_title
I would recommend a pivot query. Using your example:
SELECT p.ID, p.post_title, MAX(CASE WHEN wp_postmeta.meta_key = 'first_field' then wp_postmeta.meta_value ELSE NULL END) as first_field, MAX(CASE WHEN wp_postmeta.meta_key = 'second_field' then wp_postmeta.meta_value ELSE NULL END) as second_field, MAX(CASE WHEN wp_postmeta.meta_key = 'third_field' then wp_postmeta.meta_value ELSE NULL END) as third_field, FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID) GROUP BY wp_posts.ID,wp_posts.post_title
-
Cette réponse doit êtremarquée correcte.This answer should be marked correct.
- 0
- 2012-03-13
- Luke
-
Si vous recherchez une requête debase de données,c'est labonne réponseIf you are looking for a database query this is the correct answer
- 0
- 2015-04-08
- Alex Popov
-
Cette requête a réduitmontemps lorsquej'utilisais WP_Query de ~ 25 secondes à ~ 3 secondes.Monexigence était dene déclencher cela qu'une seulefois,donc aucunemiseen cachen'étaitnécessaire.This query reduced my time when I was using WP_Query from ~25 secs to ~3 secs. My requirement was to fire this only once so no caching was needed.
- 0
- 2018-06-03
- Kush
-
- 2012-10-07
J'ai rencontré un cas oùje souhaite également récupérer rapidement denombreuxmessages avec leursméta-informations associées. J'aibesoin de récupérer lesmessages O (2000).
Je l'aiessayéen utilisant la suggestion d'Otto -exécuter WP_Query :: querypourtous les articles,puisfaire uneboucleet exécuterget_post_custompour chaque article. Cette opération a duréen moyenneenviron 3 secondes .
J'aiensuiteessayé la requêtepivot d'Ethan (même sije n'aimaispas avoir à demandermanuellement chaquemeta_key quim'intéressait). Je devaisencoreparcourirtous lesmessages récupéréspour désérialiser lameta_value. Cette opération a duréen moyenne 1,3 secondeenviron .
J'aiensuiteessayé d'utiliser lafonction GROUP_CONCAT,et j'aitrouvé lemeilleur résultat. Voici le code:
global $wpdb; $wpdb->query('SET SESSION group_concat_max_len = 10000'); // necessary to get more than 1024 characters in the GROUP_CONCAT columns below $query = " SELECT p.*, GROUP_CONCAT(pm.meta_key ORDER BY pm.meta_key DESC SEPARATOR '||') as meta_keys, GROUP_CONCAT(pm.meta_value ORDER BY pm.meta_key DESC SEPARATOR '||') as meta_values FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm on pm.post_id = p.ID WHERE p.post_type = 'product' and p.post_status = 'publish' GROUP BY p.ID "; $products = $wpdb->get_results($query); // massages the products to have a member ->meta with the unserialized values as expected function massage($a){ $a->meta = array_combine(explode('||',$a->meta_keys),array_map('maybe_unserialize',explode('||',$a->meta_values))); unset($a->meta_keys); unset($a->meta_values); return $a; } $products = array_map('massage',$products);
Cela aprisen moyenne 0,7 seconde . Cela représenteenviron un quart dutemps de la solution WPget_post_custom ()et environ lamoitié de la solution de requêtepivot.
Peut-être que celaintéressera quelqu'un.
I've come across a case where I want also want to quickly retrieve lots of posts with their associated meta information. I need to retrieve O(2000) posts.
I tried it using Otto's suggestion - running WP_Query::query for all posts, and then looping through and running get_post_custom for each post. This took, on average, about 3 seconds to complete.
I then tried Ethan's pivot query (though I didn't like having to manually ask for each meta_key I was interested in). I still had to loop through all retrieved posts to unserialize the meta_value. This took, on average, about 1.3 seconds to complete.
I then tried using the GROUP_CONCAT function, and found the best result. Here's the code:
global $wpdb; $wpdb->query('SET SESSION group_concat_max_len = 10000'); // necessary to get more than 1024 characters in the GROUP_CONCAT columns below $query = " SELECT p.*, GROUP_CONCAT(pm.meta_key ORDER BY pm.meta_key DESC SEPARATOR '||') as meta_keys, GROUP_CONCAT(pm.meta_value ORDER BY pm.meta_key DESC SEPARATOR '||') as meta_values FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm on pm.post_id = p.ID WHERE p.post_type = 'product' and p.post_status = 'publish' GROUP BY p.ID "; $products = $wpdb->get_results($query); // massages the products to have a member ->meta with the unserialized values as expected function massage($a){ $a->meta = array_combine(explode('||',$a->meta_keys),array_map('maybe_unserialize',explode('||',$a->meta_values))); unset($a->meta_keys); unset($a->meta_values); return $a; } $products = array_map('massage',$products);
This took on average 0.7 seconds. That's about a quarter of the time of the WP get_post_custom() solution and about half of the pivot query solution.
Maybe this will be of interest to someone.
-
Je seraisintéressépar les résultats que vous obtenez avec une solution de cache d'objetspersistants.Le cache d'objets seraparfoisplus lentpour le cas debase,en fonction de votrebase de donnéeset de votre configuration,mais les résultats réels avec unemajorité d'hôtes donneront des résultatstrès variables.Lamiseen cachebasée sur lamémoireest ridiculement rapide.I would be interested in what results you get with a persistent object cache solution. The object cache will sometimes be slower for the base case, depending on your database and configuration, but real world results with a majority of hosts will give widely varying results. Memory based caching is ridiculously fast.
- 0
- 2012-10-13
- Otto
-
Salut @Otto.Quelle que soit laméthode quej'utilisepour obtenir les données,je souhaite absolumentmettreen cache le résultat.J'aiessayé d'utiliser l'APItransitoirepour lefaire,maisje rencontre desproblèmes demémoire.La chaîne sérialiséepourmes 2000 objets horloges à ~ 8Met set_transient () échoue (mémoire épuisée).Vous devez égalementmodifier leparamètre MySQLmax_allowed_packet.Je vais chercher à lemettreen cache dans unfichier,maisje ne suispasencore sûr de laperformance là-bas.Existe-t-il unmoyen demettreen cache lamémoire quipersiste àtravers les demandes?Hey @Otto. Regardless of which method I use to get the data, I definitely want to cache the result. I've tried using the transient API to do it, but I'm hitting memory problems. The serialized string for my 2000 objects clocks at ~8M and set_transient() fails (memory exhausted). Also, have to change the max_allowed_packet MySQL setting. I'll look into caching it to file, but I'm not sure yet of the the performance there. Is there a way to cache to memory that persists across requests?
- 0
- 2012-10-29
- Trevor Mills
-
Oui,si vous avez un cachemémoirepersistant (XCache,Memcached,APC,etc.)et que vous utilisez unplugin demiseen cache d'objets (W3 Total Cacheprenden charge denombreuxtypes de cachesmémoire),alorsil stocketout le cache d'objetsen mémoire,vous donnant unaccélération deplusieursfois depresquetout.Yes, if you have a persistent memory cache (XCache, memcached, APC, etc), and use an object caching plugin (W3 Total Cache supports many types of memory caches), then it stores all the object cache in memory, giving you a many-fold speedup of pretty much everything.
- 0
- 2012-11-10
- Otto
-
Je retourne 6000 éléments à utiliser dans un schéma defiltragejsbackbone/underscore.Cela apris une requêtepersonnalisée 6s queje nepouvaismêmepasexécuteren tant que WP_Query carelle avaitexpiréet en afait une requête 2s.Bien que le array_map le ralentisse unpeu ...I am returning 6000 items to use in a backbone/underscore js filtering scheme. This took a 6s custom query that I couldn't even run as a WP_Query because it timed out, and made it a 2s query. Although the array_map slows it back down quite a bit...
- 0
- 2013-12-14
- Jake
-
Existe-t-il unepriseen charge de la création d'unepriseen charge hauteperformancepour le renvoi detoutes lesmétadonnées dans un WP_Query?Is there any support for building high performance support for returning all meta data within a WP_Query?
- 0
- 2014-09-12
- atwellpub
-
Jetravaillais sur une solution similaire,dommage que SQLne semblepaspouvoir renvoyer destableaux degroupe ou des objets.Vouspouvezessayer une sélectionimbriquée,mais d'aprèsmonexpérienceprécédente avec SQL,ils semblent ralentir considérablement la demande.I was working on a similar solution, shame SQL doesn't seem to be able to return group arrays or objects. You could try nested select, but from my earlier experience with SQL, they seem to slow the request down way to much.
- 0
- 2014-09-24
- Jonathan Joosten
-
- 2015-09-09
Jeme suis retrouvé dans une situation oùje devaiseffectuer cettetâchepourfinalement créer un document CSV àpartir de,j'aifini partravailler directement avecmysqlpour cefaire. Mon code rejoint lapublicationet lesméta-tablespour récupérer lesinformations detarification de woocommerce,la solutionprécédemmentpubliéeexigeait quej'utilise des alias detable dans le sqlpourfonctionner correctement.
SELECT p.ID, p.post_title, MAX(CASE WHEN pm1.meta_key = '_price' then pm1.meta_value ELSE NULL END) as price, MAX(CASE WHEN pm1.meta_key = '_regular_price' then pm1.meta_value ELSE NULL END) as regular_price, MAX(CASE WHEN pm1.meta_key = '_sale_price' then pm1.meta_value ELSE NULL END) as sale_price, MAX(CASE WHEN pm1.meta_key = '_sku' then pm1.meta_value ELSE NULL END) as sku FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID) WHERE p.post_type in('product', 'product_variation') AND p.post_status = 'publish' GROUP BY p.ID, p.post_title
Attention cependant,woocommerce a crééplus de 300 000 lignes dansmaméta-table,doncelle étaittrès volumineuseet donctrès lente.
I found myself in a situation that I needed to do this task to ultimately create a CSV document from, I ended up working directly with mysql to do this. My code joins the post and meta tables to retrieve woocommerce pricing information, the previously posted solution required that I use table aliases in the sql to work properly.
SELECT p.ID, p.post_title, MAX(CASE WHEN pm1.meta_key = '_price' then pm1.meta_value ELSE NULL END) as price, MAX(CASE WHEN pm1.meta_key = '_regular_price' then pm1.meta_value ELSE NULL END) as regular_price, MAX(CASE WHEN pm1.meta_key = '_sale_price' then pm1.meta_value ELSE NULL END) as sale_price, MAX(CASE WHEN pm1.meta_key = '_sku' then pm1.meta_value ELSE NULL END) as sku FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID) WHERE p.post_type in('product', 'product_variation') AND p.post_status = 'publish' GROUP BY p.ID, p.post_title
Do be warned though, woocommerce created 300K+ rows in my meta table, so it was very large, and therefore very slow.
-
- 2017-01-31
PAS DE VERSION SQL:
Obteneztous les articleset toutes leurs valeursméta (métas) sans SQL:
Supposons que vous ayez une liste d'identifiants depublication stockés sousforme detableau d'identifiants,quelque chose comme
$post_ids_list=[584,21,1,4,...];
Ilest désormaisimpossible d'obtenirtous lesmessageset toutes lesmétasen une seule requête sans utiliser aumoins unpeu de SQL, ilfaut doncfaire 2 requêtes (toujoursjuste 2):
1. Obteneztous les articles (en utilisant WP_Query )
$ request=new WP Query ([ 'post__in'=> $post_ids_list, 'ignore_sticky_posts'=>true,//si vous voulezignorer la "viscosité" ]);
(N'oubliezpas d'appeler
wp_reset_postdata ();
si vouseffectuez une "boucle" par la suite ;))2. Mettre àjour leméta-cache
//ne soyezpas confonduici: "post" signifie letype de contenu (post X utilisateur X ...),PAS letype depublication;) update_meta_cache ('post',$post_ids_list);
Pour obtenir lesmétadonnées,utilisez simplement le code standard
get_post_meta () >
qui,comme @Otto l'a souligné:
regarde d'abord dans le cache :)Remarque: Si vousn'avezpas réellementbesoin d'autres donnéesprovenant des articles (comme letitre,le contenu,...) vousne pouvezen faire que 2. :-)
NO SQL VERSION:
Get all posts and all of their meta values (metas) with no SQL:
Let's say you have a list of post IDs stored as an array of IDs, something like
$post_ids_list = [584, 21, 1, 4, ...];
Now getting all posts and all metas in 1 query is not possible without using at least a bit of SQL, so we must do 2 queries (still just 2):
1. Get all the posts ( using WP_Query )
$request = new WP Query([ 'post__in' => $post_ids_list, 'ignore_sticky_posts' => true, //if you want to ignore the "stickiness" ]);
(Don't forget to call
wp_reset_postdata();
if you are doing a "loop" afterwards ;) )2. Update meta cache
//don't be confused here: "post" means content type (post X user X ...), NOT post type ;) update_meta_cache('post', $post_ids_list);
To get the meta data just use the standard
get_post_meta()
which, as @Otto pointed out:
looks into cache first :)Note: If you don't actually need other data from the posts (like title, content, ... ) you can do just 2. :-)
-
- 2014-09-24
en utilisant leformulaire de solutiontrevoret en lemodifiantpour qu'ilfonctionne avec du SQLimbriqué. Celan'apas ététesté.
global $wpdb; $query = " SELECT p.*, (select pm.* From $wpdb->postmeta AS pm WHERE pm.post_id = p.ID) FROM $wpdb->posts p WHERE p.post_type = 'product' and p.post_status = 'publish' "; $products = $wpdb->get_results($query);
using the solution form trevor and modifying it to work with nested SQL. This is not tested.
global $wpdb; $query = " SELECT p.*, (select pm.* From $wpdb->postmeta AS pm WHERE pm.post_id = p.ID) FROM $wpdb->posts p WHERE p.post_type = 'product' and p.post_status = 'publish' "; $products = $wpdb->get_results($query);
-
- 2012-04-23
J'ai également rencontré leproblème desméta-champs à valeursmultiples. Leproblème vient de WordPress lui-même. Regardez dans wp-includes/meta.php. Recherchez cette ligne:
$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
Leproblème vient de l'instruction CAST. Dans une requête de valeursméta,la variable $meta_typeest définie sur CHAR. Jene connaispas les détails sur lafaçon dont CASTing la valeur de CHAR affecte la chaîne sérialisée,maispour le corriger,vouspouvez supprimer le cast afin que le SQL ressemble à ceci:
$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "$alias.meta_value {$meta_compare} {$meta_compare_string})", $meta_value );
Maintenant,même si celafonctionne,vous vousenlevez avec les composantsinternes de WordPress,donc d'autres chosespourraient casser,et cen'estpas une solutionpermanente,en supposant que vous ayezbesoin demettre àniveau WordPress.
Lafaçon dontje l'ai corrigéest de copier le SQLgénérépar WordPresspour laméta-requête queje veux,puis d'écrire du PHPpour ajouter desinstructions AND supplémentairespour lesméta_values queje rechercheet d'utiliser $ wpdb->get_results ($ sql)pour la sortiefinale. Hacky,mais çamarche.
I ran into the multiple value meta fields problem as well. The problem is with WordPress itself. Look in wp-includes/meta.php. Look for this line:
$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
The problem is with the CAST statement. In a query for meta values, the $meta_type variable is set to CHAR. I don't know the details on how CASTing the value to CHAR affects the serialized string, but to fix it, you can remove the cast so the SQL looks like this:
$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "$alias.meta_value {$meta_compare} {$meta_compare_string})", $meta_value );
Now, even though that works, you're mucking with the WordPress internals, so other things might break, and it's not a permanent fix, assuming you'll need to upgrade WordPress.
The way I've fixed it is to copy the SQL generated by WordPress for the meta query I want and then write some PHP to tack on extra AND statements for the meta_values I'm looking for and use $wpdb->get_results($sql) for the final output. Hacky, but it works.
-
Jene l'aipasessayé,maistirerparti dufiltre `get_meta_sql` qui suit cette ligne seraitbien sûrpréférable aupiratage du codeprincipal.I've not tried it, but leveraging the `get_meta_sql` filter that follows this line would of course be preferable to hacking core code.
- 0
- 2012-04-25
- Steve Taylor
J'aibesoin d'obtenir untas demessages avec leursmétadonnées. Bien sûr,vousne pouvezpas obtenir demétadonnées avec une requête depublication standard,vous devez doncgénéralementfaire un
get_post_custom()
pour chaquemessage.J'essaie avec une requêtepersonnalisée,comme celle-ci:
Semblefonctionner. Il se déclenche si vous utilisez l'un de ces champsméta d'unemanière qui autoriseplusieursméta valeurspour celui-ci sur lemêmemessage. Jene peuxpaspenser à unejointurepourfaire ça.
Alors,question 1: y a-t-il unejointure,une sous-requête ou autrepourimporter des champsméta à valeursmultiples?
Mais question 2: celaen vaut-il lapeine? Combien dejointures detable
postmeta
dois-je ajouter avant qu'une approche à 2 requêtes deviennepréférable? Jepourrais saisirtoutes les données depublication dans une requête,puis saisirtoutes lespostmetapertinentes dans une autreet combiner laméta avec les données depublication dans unensemble de résultatsen PHP. Celafinirait-ilpar êtreplus rapide qu'une seule requête SQL deplusen plus complexe,si c'estencorepossible?Jepensetoujours: "Donnez autant detravail quepossible à labase de données." Pas sûr sur celui-ci!