Eu tenho dois tipos de postagem personalizados 'bookmarks' e 'snippets' e uma taxonomia compartilhada 'tag'. Posso gerar uma lista de todos os termos na taxonomia com get_terms (), mas não consigo descobrir como limitar a lista ao tipo de postagem. O que eu estou procurando basicamente é algo como isto:
get_terms(array('taxonomy' => 'tag', 'post_type' => 'snippet'));
Existe uma maneira de conseguir isso? As ideias são muito apreciadas !!
Ah, eu estou no WP 3.1.1
custom-post-types
custom-taxonomy
terms
Gavin Hewitt
fonte
fonte
print_r(get_terms_by_post_type(array('category') , array('event') ));
mostraWarning: Missing argument 2 for wpdb::prepare()
Acontece que eu precisava de algo parecido para um projeto em que estou trabalhando. Eu simplesmente escrevi uma consulta para selecionar todas as postagens de um tipo personalizado e depois verifico quais são os termos reais da minha taxonomia que eles estão usando.
Então eu peguei todos os termos dessa taxonomia
get_terms()
e depois usei apenas aqueles que estavam nas duas listas, envolvi-os em uma função e acabei.Mas então eu precisava de mais do que apenas os IDs: precisava dos nomes, então adicionei um novo argumento nomeado
$fields
para poder dizer à função o que retornar. Então imaginei queget_terms
aceita muitos argumentos e minha função era limitada a simplesmente termos que estão sendo usados por um tipo de post, então adicionei mais umaif
instrução e pronto:A função:
Uso:
Se você precisar apenas de uma lista de IDs de termos, então:
Se você precisar apenas de uma lista de nomes de termos, então:
Se você precisar apenas de uma lista de objetos de termos, então:
E se você precisar usar argumentos extras de get_terms como: orderby, order, hierarchical ...
Desfrutar!
Atualizar:
Para corrigir a contagem de termos para uma alteração específica do tipo de postagem:
para:
fonte
(array) $args
vez de uma lista de 4 $ vars? Isso permitiria que você não se importasse com a ordem em que lançou os argumentos, então algo comoget_terms_by_post_type( $args = array( 'taxonomies', 'args', 'post_type', 'fields' => 'all') )
e os chame dentro da função with$args['taxonomies']
. Isso ajudaria você a não adicionar valores vazios e a lembrar a ordem dos seus argumentos. Eu também sugeriria usar aspas simples em vez de duplas. Eu os vi sendo até cinco vezes mais rápidos.'this is my mood: '.$value
mais"this is my mood: $value"
, por causa da legibilidade. Quando se trata de velocidade: não é um pouco - eu medi até cinco vezes. E quando você usa aspas duplas em todo o tema em todos os lugares, elas são resumidas rapidamente quando você recebe muitos pedidos. Seja como for, você deixou isso claro."
vs.'
e estava errado. A diferença está longe de qualquer coisa que alguém possa notar.Eu escrevi uma função que permite passar
post_type
o$args
array para aget_terms()
função:HT para @braydon por escrever o SQL.
fonte
Ótima pergunta e respostas sólidas.
Gostei muito da abordagem do @jessica usando o filtro terms_clauses, porque ele estende a função get_terms de uma maneira bastante razoável.
Meu código é uma continuação da ideia dela, com algum sql do @braydon para reduzir duplicatas. Também permite uma matriz de post_types:
Como get_terms não possui uma cláusula para GROUPY BY, tive que adicioná-la ao final da cláusula WHERE. Observe que eu tenho a prioridade do filtro muito alta, na esperança de que ela sempre dure.
fonte
Não consegui fazer com que os argumentos get_terms funcionassem com a versão do código de Gavin acima, mas finalmente fiz alterando
para
como estava na função original de Bainternet.
fonte
@Bainternet: Obrigado! Eu tive que alterar ligeiramente a função porque não estava funcionando (alguns erros de digitação). O único problema agora é que a contagem de termos está desativada. A contagem não está levando em consideração o tipo de postagem, então acho que você não pode usar get_terms () nisso.
EDIT: Adicionadas as correções. Mas de alguma forma ainda não está funcionando para mim. A contagem ainda mostra o valor incorreto.
fonte
print_r(get_terms_by_post_typea(array('event','category','',array()));
este dáWarning: Invalid argument supplied for foreach()
para a linhaforeach ($current_terms as $t){
Evite duplicatas:
fonte