obteniendo todos los valores para una clave de campo personalizado (publicación cruzada)
-
-
Parece queestás usandoesto comotaxonomía.¿Por quéno agregar (automáticamente) untérmino aestaspublicaciones alguardar?Facilitaríamucho la consulta.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 ¡Nopuedo agradecerte lo suficientepor ser ungenio!@kaiser I can't thank you enough for being a genius!
- 0
- 2016-10-26
- user2128576
-
7 respuestas
- votos
-
- 2011-02-15
Unposibleenfoque sería utilizar uno de losmétodos auxiliaresen la clase WPDBpara hacer unameta consultamás refinada. Sinembargo,la advertenciapara usar algunas deestasfuncioneses que,por logeneral,no obtiene unamatriz simple de datos y,por logeneral,tiene que hacer referenciasinnecesarias a laspropiedades del objeto,incluso si soloestá llamando a una columna ofila.
Por supuesto,notodas lasfunciones soniguales,y se hace unamenciónintencionada almétodo WPDB ,
get_col
que devuelve unamatrizplana simple de la datos consultados,hagoestamenciónespecíficamenteporqueel siguienteejemplo llamará aestemétodo.WordPress - WPDB Seleccionar una columna de datos
$ wpdb->get_col ()Aquí hay unafunción deejemplo que consulta labase de datosparatodas laspublicaciones de untipo depublicaciónelegido,estado depublicación y con unameta claveespecífica (o campopersonalizadopara losmenostécnicamenteinteresados).
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; }
Porejemplo,si desea averiguar quépublicacionestienen unameta clave de rating ,paraeltipo depublicación películas y legustaría almacenaresainformación dentro de una variable,unejemplo detal llamada sería ..
$movie_ratings = get_meta_values( 'rating', 'movies' );
Sino desea hacernadamás queimprimiresos datosen lapantalla,lafunción deimplosión de PHPpuedeempalmar rápidamenteesa simplematrizen líneas de datos.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
Tambiénpuede usar los datos devueltospara calcular cuántaspublicacionestienen estos valoresmeta haciendo unbucle simple sobre los datos devueltos y construyendo unamatriz de recuentos,porejemplo.
$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. */
Esta lógica sepuede aplicar a variostipos de datos y sepuede ampliarpara quefuncione de diferentesformas. Así queespero quemisejemplos hayan sido útiles y lo suficientemente simplespara seguir.
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.
-
Tambiénes un hecho divertidopara losfuturosespectadores,si deseaextraer solo valoresmeta únicos,escriba "DISTINCT"justo después de "SELECT"en lafunción anterior.Podría ser útil.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
-
Creo queestoesextremadamente útilI think this is extremely useful
- 0
- 2017-05-01
- Pablo S G Pacheco
-
¿Cómo haceresto y devolver los valores ordenados? Creo que usar ORDERbyperonopuedo averiguar cómo usarloHow to do this, and return the values sorted?, I think that using ORDER by but I cant figure out how to use it
- 0
- 2018-04-17
- efirvida
-
- 2011-06-05
Megustaría agregar unapequeña cosa al código de t31os anterior.Cambié "SELECT"por "SELECT DISTINCT"paraeliminar lasentradas duplicadas cuando uséeste código.
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.
-
Puedoimaginar casosen los que sería válidotenermúltiples valoresmeta delmismo valor y,por lotanto,no hiceesa adición ami código.Sinembargo,si desea valores distintos,este seríael camino a seguir.Además,tambiénpuede agregareso como un argumentopara lafunción (para quepueda usarlo ono,según corresponda).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
Noesbuenoni necesario usarel $ wpdbglobal:
// 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 );
-
Este seríami métodopreferidopara hacerlo,en lamayoría de los casos.Realiza cinco consultas,en lugar de solo una,pero,como utiliza losprocedimientosestándar de WordPressparagenerarlas yenviarlas,se activará cualquier almacenamientoen cachéespecífico de laplataforma (comoel almacenamientoen caché de objetos de WP Engine o algún complemento aleatorio).almacenarseen el cachéinterno de WordPress durante la duración de la solicitud,por lo queno seránecesario recuperarlo de labase de datosnuevamente,siesnecesario.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
-
Todos losfiltrostambién se aplicarán a los datos,lo quepodría serextremadamenteimportante,porejemplo,en un sitiomultilingüe.Por último,dado que utiliza solofuncionesbásicasestándar de WordPress,esmuchomenosprobable que se rompa con una actualizaciónfutura.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
-
Estopodríamejorarel rendimiento limitando la consulta a laidentificación depublicación. Agregar: `'campos'=> 'ids'` Entonces,lamatriz de consulta se vería así: `` `matriz ( 'post_type'=> $post_type, 'meta_key'=> $meta_key, 'posts_per_page'=> -1, 'campos'=> '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
-
Precaución,estotambiénfiltra losmeta valores queexisten soloen laspublicacionesnopublicadas,así que asegúrese de usarel argumento 'post_status'para queesto sea una característica,no unerrorCaution 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
laformamás rápida sería una consulta sqlpersonalizada ynoestoy seguro,peropuedeintentarlo
$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 ");
Entodo caso,es un comienzo.
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.
-
gracias,pero ¿no deberíanevitarse las consultaspersonalizadas "atoda costa"?Preferiría usar la capa de abstracción WP (¿así se llama?) ...pero,por supuesto,siestonoesposible ...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
-
Las consultaspersonalizadas,si seescriben de lamanera correcta,pueden sermejores y solo debeevitarlas sino sabe lo queestá haciendo.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
-
Estoy de acuerdo conmwb. Las consultaspersonalizadas sonmuy útiles yprácticas,pero creo quetambién sonmuchomáspesadasen labase de datos ..especialmente usandofunciones SRT ..I Agree with mwb .custom queries are very usefull and practical, but I think they are also much heavier on the DB.. especially using SRT functions..
- 1
- 2011-12-10
- krembo99
-
- 2013-09-07
Para obtenertodos los valoresmetamediante una clavemeta
Compruebe 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'" );
-
Elproblema conesteenfoquees lafalta deespecificidad,obtendránumerosos resultados de dicha consulta,quepodríanincluirborradores,elementoseliminados,publicaciones,páginas y cualquier otrotipo depublicación queexista.Nunca debe consultar lo quenonecesita,aquí se requiere sin duda algunaespecificidad.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
-
Sibien es cierto quepuede obtener valores de otrostipos depublicaciones yestados,hay ocasionesen las quetodo lo quenecesita son los valores yno ha usadoesameta_keyen ningún otro lugar queno sea donde lanecesita.Sitodos/lamayoría de los valores son únicos,estapuede ser lamejor solución.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
No hayninguna razónpor la quenopuedafusionart31os yel código de Bainternetparatener una declaraciónpreparada reutilizable (estilo wordpress) que devuelva la cuenta y los valoresen una operacióneficiente.
Es una consultapersonalizada,pero sigue utilizando la capa de abstracción de labase de datos de wordpress;porejemplo,noimporta cuáles sean realmente losnombres de lastablas,o si cambian,yes una declaraciónpreparada,por lo queestamosmuchomás seguros de Ataques SQL,etc.
Eneste caso,yano verificoeltipo depublicación yexcluyo cadenas vacías:
$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;
Enesteparticulares
Esto devolverá unamatriz de objetos comoesta:
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)
-
-
Tengaen cuenta queeste valorpredeterminadoes lapublicación actual,cuandono seespecificapost_id.Note that this defaults to the current post, when no post_id is specified.
- 0
- 2017-07-29
- birgire
-
Sé cómo obtener un valor de campopersonalizadopara unapublicaciónespecífica.
Lo quenecesitoes obtenertodos los valores asociados con una clave depublicaciónpersonalizadaespecífica,en todas laspublicaciones .
¿Alguien conoce unaformaeficaz de haceresto?No quisiera recorrertodos los ID depublicaciónen labase de datos.
Ejemplo:
4publicaciones,todas con valores diferentespara un campopersonalizado llamado 'Estado de ánimo'. 2publicacionestienen el valor "feliz",1publicacióntiene "enojado" y 1publicacióntiene "tristeza"
Quieromostrar:en todas laspublicacionestenemos: dos autoresfelices,unoenojado y unotriste.
Peropara MUCHASpublicaciones.
Lo queestoybuscandoes: