Obtendo todos os valores para uma chave de campo personalizada (Post Cruz)
-
-
Parece que vocêestá usandoisso como umataxonomia.Por quenão simplesmente (automaticamente) adicionar umtermo aessesposts ao salvar?Faria consultandomuitomaisfácil.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 Eunãoposso agradecer o suficientepor ser umgênio!@kaiser I can't thank you enough for being a genius!
- 0
- 2016-10-26
- user2128576
-
7 respostas
- votos
-
- 2011-02-15
Uma abordagempossível seria usar um dosmétodos auxiliaresna classe WPDBparafazer uma consulta demetamais refinada. A ressalvapara usar algumas dessasfunções,noentanto,é que vocênormalmentenão retoma uma variedade simples de dadose geralmenteprecisafazer referências desnecessárias àspropriedades do objeto,mesmo que vocêesteja apenas ligandopara uma coluna ou linha.
.Claro,nem todas asfunções são amesmae amesma,e umamençãointencional saipara ométodo wpdb ,
get_col
,que retorna uma simplesmatrizplana do Dados consultadospara,eufaçoessamençãoespecificamenteporque oexemplo seguinte será chamadoestemétodo.wordpress - WPDB Selecionando uma coluna de dados
$ WPDB->get_col ()Aquiestá umafunção deexemplo que consulta obanco de dadosparatodos osposts de umtipo depostescolhido,postar statuse com umametaespecífica (ou campopersonalizadoparamenostecnicamenteminded).
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; }
Então,porexemplo,se vocêgosta de descobrir quaispostagenstêm umameta de classificação ,para otipo depost > e vocêgostaria de armazenaressainformação dentro de uma variável,umexemplo detal chamada seria ..
$movie_ratings = get_meta_values( 'rating', 'movies' );
Se você quisessefazernadamais do queimprimiresses dadospara atela,afunção deimplodo do PHPpode rapidamenteemendaressamatriz simplesem linhas de dados.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
Vocêtambémpode usar os dados retornadospara descobrir quantaspostagenstêmesses valoresmetafazendo um loop simples sobre os dados retornadose construindo umamatriz das contagens,porexemplo.
$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ógicapode ser aplicada a váriostipos de dadose estendidoparatrabalhar qualquernúmero demaneiras diferentes. Entãoespero quemeusexemplostenham sido úteise simples o suficientepara 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.
-
Também é divertidoparafuturosespectadores,se você quiserextrair apenas valoresexclusivos demeta - você digita `Distinct` logo após o` Select`nafunção acima.Poderia 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
-
Eu acho queisso éextremamente útilI think this is extremely useful
- 0
- 2017-05-01
- Pablo S G Pacheco
-
Comofazerissoe retornar os valores classificados?,Eu acho que usando ordempormaseunão consigo descobrir como usá-loHow 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
Eugostaria de adicionar uma coisaminúsculapara t31os 's acima.Eumudei "Select"em "Select Distinct"paraeliminarentradas duplicadas quando useieste 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.
-
Eupossoimaginar casosem que seria válidoter vários valores demeta domesmo valore,portanto,nãofizeramessa adição aomeu código.Se você quer valores distintos,este seria o caminho apercorrer.Além disso,vocêtambémpode adicionarisso como um argumentopara afunção (para que vocêpossa usá-lo ounão,conforme apropriado).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
Não ébom ounecessáriopara usar oglobal $ 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 );
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 seria omeumétodopreferido defazerisso,namaioria dos casos.Faz cinco consultas,em vez de apenas uma,mas,comoestá usando osprocedimentospadrão do WordPressparagerare enviá-los,qualquer cacheespecífico daplataforma (como o cache de objeto domotor WP ou algumplug-in aleatório)irá chutar. Os dadostambém serãoser armazenadono cacheinterno do WordPresspara a duração da solicitação,portantonãoprecisará ser recuperado dobanco de dadosnovamente,senecessário.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
-
Quaisquerfiltrostambém serão aplicados aos dados,quepodem serextremamenteimportantes,porexemplo,um sitemulti-lingual.Porfim,já queestá usando apenasfunçõesnúcleospadrão do WordPress,émenosprovável que seja quebradapor uma atualizaçãofutura.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
-
Issopode serfeitomais desempenho,limitando a consulta ao ID POST? Adicionar: `'Fields'=> 'IDs'` Então,amatriz de consultapareceria: `` `array ( 'post_type'=> $post_type, 'meta_key'=> $meta_key, 'posts_per_page'=> -1, 'Fields'=> '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
-
Cuidado Issotambémfiltra os valores demeta queexistem apenasem postsnãopublicados,portanto,certifique-se de usar o 'post_status' argparatornareste recursonão umbugCaution 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
O caminhomais rápido seria uma consulta SQLpersonalizadae nãotenho certeza,mas vocêpodetentar
$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 ");
Se alguma coisa,então é um começo.
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.
-
Obrigado,masnão deve serevitado dúvidas de 'custo'?Euprefiro usar a camada de abstração WP (éisso que é chamado?) ...mas é claro que seissonãoforpossível ..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
-
Consultaspersonalizadas,seescritas damaneira correta,podem sermelhorese você só deveevitá-los se vocênão sabe o queestáfazendo.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
-
Concordo com as consultas MWB. Custom sãomuito úteise práticas,mas acho queelastambém sãomuitomaispesadasnobanco de dados ..especialmente usandofunções 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 obtertodos os valores demetapor umameta
verificação 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'" );
-
A questão comessa abordagem é afalta deespecificidade,você receberánumerosos resultados detal consulta,o quepoderiaincluir rascunhos,itens ladrados,postos,páginase qualquer outrotipo depostagem queexiste.Vocênunca deve consultar o que vocênãoprecisa,aespecificidade é certamenteexigida aqui.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
-
Embora seja verdade que vocêpode obter valores de outrostipos depostagense status,hámomentosem quetudo o que vocêprecisa são os valorese vocênão usouessemeta_keyem qualquer lugar,mas onde vocêprecisa.Setodos/amaioria dos valoresforem únicos,estapode ser amelhor solução.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
Não há razãopara que vocênãopossamesclar o código T31ose Bainternetparater umainstruçãopreparada reutilizável (estilo WordPress) que retorna a contageme os valoresem uma operaçãoeficiente.
é uma consultapersonalizada,mas aindaestá usando a camada de abstração dobanco de dados do WordPress -então,porexemplo,nãoimporta o que osnomes databela são realmente,ou seelesmudarem,e é uma declaraçãopreparada,então somosmuitomais seguros Ataques sqletc.
Nestainstânciaeunãoestoumais checando otipo depostageme estouexcluindo cordas vazias:
$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;
Nesteparticular é
Isso retornará umamatriz de objetos assim:
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)
-
-
Observe queisso épadronizadopara opost atual,quandonenhumpost_id éespecificado.Note that this defaults to the current post, when no post_id is specified.
- 0
- 2017-07-29
- birgire
-
Eu sei como obter um valor de campopersonalizadopara umpostespecífico.
O queeupreciso é obtertodos os valores associados a uma chave depostpersonalizadaespecífica,em todas aspostagens .
Alguém sabe de umamaneiraeficiente defazerisso?Eunãogostaria de loop através detodas asidentidadespostaisnobanco de dados.
Exemplo:
4 Poststodos com valores diferentespara um campopersonalizado chamado "humor". 2poststêm o valor 'feliz',1posttem 'zangado'e 1posttem 'triste'
Eu queroproduzir: Emtodas aspostagens quetemos: doisfeliz,um raivoe um autor (s)triste (s).
masparamuitosposts.
O queestouprocurando é: