Eu tenho dois tipos de postagem personalizados 'country' e 'city' e uma taxonomia compartilhada 'flag'.
Se eu usar:
<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');
Eu recebo uma lista de todos os termos na taxonomia, mas quero limitar a lista ao tipo de postagem 'país'.
Como eu posso fazer isso?
Usando a nova solução
<?php
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
$childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($childTerms as $childTerm) {
echo $childTerm->name.'<br />';
}
}
?>
Não consigo repetir o nome $ childTerm->. Por quê?
custom-post-types
taxonomy
terms
user1443216
fonte
fonte
Respostas:
Receio que isso não seja possível nativamente (ainda?). Veja este trac: http://core.trac.wordpress.org/ticket/18106
Da mesma forma, na página de administração de taxonomia, a contagem de postagens reflete todos os tipos de postagens. (
Tenho certeza de que também existe um tíquete trac) http://core.trac.wordpress.org/ticket/14084Veja também este post relacionado .
Nova solução
Depois de escrever o texto abaixo, lancei uma maneira muito melhor (pelo menos no sentido de que você pode fazer mais) é usar os filtros fornecidos na
get_terms()
chamada. Você pode criar uma função de wrapper que useget_terms
e (condicionalmente) adicione um filtro para manipular a consulta SQL (para restringir por tipo de postagem).A função usa os mesmos argumentos que
get_terms($taxonomies, $args)
.$args
utiliza o argumento adicional,post_types
que utiliza uma matriz | de tipos de postagem.Mas não posso garantir que tudo funcione 'conforme o esperado' (estou pensando em preencher a contagem). Parece funcionar usando apenas o padrão
$args
paraget_terms
.Uso
Solução alternativa original
Inspirado no tíquete trac acima, (testado e funciona para mim)
Uso
ou
fonte
$args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);
. Vou editar isso para permitir seqüências de consulta ...$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
:?wpse57444_get_terms()
$args
é o segundo argumento. Lá você acabou de colocarwpse57444_get_terms( 'flag', array( 'country', 'city' ) );
A resposta de @ stephen-harris acima funcionou apenas para mim parcialmente. Se eu tentasse usá-lo duas vezes na página, não funcionaria. Além disso, a idéia de enterrar consultas mysql como essa me preocupa - acho que é melhor prática usar métodos principais para obter uma solução, evitar conflitos com futuras atualizações do WP. Aqui está a minha solução, com base em algum comentário nº 7 sobre o bilhete do Trac que ele faz referência
Uso:
Isso funciona apenas para um tipo de postagem e uma taxonomia, porque é disso que eu precisava, mas não seria muito difícil modificar isso para aceitar vários valores.
Houve alguma menção nesse segmento do Trac que pode não ter uma boa escala, mas estou trabalhando em uma escala bem pequena e não tive problemas com a velocidade.
fonte
Dois tipos de postagem personalizados 'country' e 'city' e uma taxonomia compartilhada 'flag'. Você deseja limitar a lista ao tipo de postagem 'país'.
Aqui está uma solução mais simples:
fonte
[editar] Este é um comentário sobre a excelente resposta de Stephen Harris.
Ele não retorna nenhum termo se usado com vários tipos de postagem como este
$flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));
. Isso ocorre porque $ wpdb-> prepare limpa a string $ post_types_str parap.post_type IN('country,city')
enquanto deveriap.post_type IN('country','city')
. Veja este ingresso: 11102 . Use a solução deste tópico para contornar isso: /programming//a/10634225fonte
Também tentei usar a resposta de @Stephen Harris, mas a consulta que eu precisava era bastante difícil de escrever como uma única consulta e usando as partes do filtro.
Além disso, eu também precisava usar essa função várias vezes na mesma página e resolvi o problema declarando a
wpse_filter_terms_by_cpt
função fora da função wrapper.De qualquer forma, a resposta de @Mark Pruce se encaixa melhor, pelas mesmas razões que ele disse, mesmo que seja necessário fazer mais uma consulta (e o loop relacionado) para preparar os argumentos para a
wp_get_object_terms
função.fonte