Suporte » Desenvolvendo com WordPress » Mostrar apenas uma vez a taxonomia com get_the_terms

  • Resolvido sdcom

    (@sdcom)


    Boa tarde pessoal,

    Preciso de uma ajuda, tentarei explicar o mais breve possível:

    Eu tenho um CPT chamado (Catálogo). Nele tenho as categorias (Alfa-Romeo, BMW, Citroen…) e um Custom Taxonomy chamado (Modelo). O que acontece é o seguinte, dentro do arquivo category.php eu chamo para listar o Custom Taxonomy o seguinte código:

    
    $terms = get_the_terms( $post->ID , 'modelo' );
    if ( $terms != null ){
    foreach( $terms as $term ) {
    $term_link = get_term_link( $term, 'modelo' );
    echo '<div class="col-md-3 col-sm-12">';
    echo '<div class="product-box">';
    echo '<div class="product-info">';
    echo '<span class="price"><ins>MODELO</ins></span>';
    echo '<h5 itemprop="headline"><a href="' . $term_link . '">' . $term->name . '</a></h5>';
    echo '</div>';
    echo '</div>';
    echo '</div>';
    unset($term); } }
    

    Está funcionando em partes, explico o porque. Se existe apenas 1 Post com determinada Custom Taxonomy, fica perfeito, ele mostra apenas 1 vez o nome da Custom Taxonomy na lista no front-end. Mas se eu tenho por exemplo, 2 Posts com a mesma Custom Taxonomy, ele repete no front-end duas vezes o nome da Custom Taxonomy na lista. Eu preciso que mostre apenas 1 vez o nome da Custom Taxonomy.

    • Este tópico foi modificado 1 mês atrás por  Felipe Elia. Motivo: edição de código
Visualizando 15 respostas - 1 até 15 (de um total de 25)
  • Moderador Felipe Elia

    (@felipeelia)

    Olá,

    Você quer listar todos os termos dessa custom taxonomy, independente de a quais posts eles pertençam? Se sim, você não deve usar get_the_terms (que lista os termos de um post) e sim get_terms, que lista todos os termos da taxonomia.

    Seu código vai ficar parecido com isso aqui:

    
    $terms = get_terms(
    	[
    		'taxonomy' => 'modelo',
    	]
    );
    if ( false !== $terms ) {
    	foreach ( $terms as $term ) {
    		$term_link = get_term_link( $term, 'modelo' );
    		echo '<div class="col-md-3 col-sm-12">';
    		echo '<div class="product-box">';
    		echo '<div class="product-info">';
    		echo '<span class="price"><ins>MODELO</ins></span>';
    		echo '<h5 itemprop="headline"><a href="' . $term_link . '">' . $term->name . '</a></h5>';
    		echo '</div>';
    		echo '</div>';
    		echo '</div>';
    	}
    }
    

    Outra coisa: de qualquer forma você não precisa chamar o unset dentro do foreach. O próprio PHP vai sobrescrever a variável a cada iteração.

    Não se esqueça de voltar caso tenha mais alguma dúvida ou, se for o caso, para marcar seu tópico como “resolvido”.

    sdcom

    (@sdcom)

    Olá Felipe,

    Ainda não é isso que preciso.

    Veja a imagem:
    https://uploaddeimagens.com.br/imagens/chrome_2019-08-14_10-11-36-png

    Note que tenho no caso, 3 carros modelo A3 (esta é a taxonomia), e ele está listando com meu código os 3 modelos. Porém, preciso que ele mostre apenas uma vez o modelo A3 e não repetir a quantidade de carros dentro dessa taxonomia. Ai quando eu clicar sim ele vai mostrar todos os carros A3. Do jeito que está, quando clica ele lista certo todos os carros A3. Então meu problema seria mesmo ele mostrar apenas uma vez como citado anteriormente.

    Obrigado

    Moderador Felipe Elia

    (@felipeelia)

    Você pode, por favor, subir o seu código inteiro no pastebin e colocar o link aqui? Se não houver problema em divulgar, saber o link do site também vai ajudar.

    sdcom

    (@sdcom)

    Felipe,

    O projeto está em localhost.
    Abaixo segue o link do código inteiro:

    https://pastebin.com/BgLmCrL5

    Obrigado

    Moderador Felipe Elia

    (@felipeelia)

    Obrigado.

    Ele está mostrando uma vez para cada post porque seu código está dentro do while (have_posts()). Se há 3 posts, o WordPress vai passar 3 vezes dentro desse while e mostrar um link para cada vez que passar.

    Ainda não está muito claro pra mim o que você pretende fazer, mas se entendi bem, esse código aqui pode te ajudar (substituindo da linha 25 a 40 do seu código):

    
    $displayed_terms = [];
    if ( have_posts() ) :
    	while ( have_posts() ) :
    		the_post();
    		$terms = get_the_terms( $post->ID, 'modelo' );
    		if ( false !== $terms ) {
    			foreach ( $terms as $term ) {
    				if ( ! in_array( $term->term_id, $displayed_terms ) ) {
    					$displayed_terms[] = $term->term_id;
    
    					$term_link = get_term_link( $term, 'modelo' );
    					echo '<div class="col-md-3 col-sm-12">';
    					echo '<div class="product-box">';
    					echo '<div class="product-info">';
    					echo '<span class="price"><ins>MODELO</ins></span>';
    					echo '<h5 itemprop="headline"><a href="' . $term_link . '">' . $term->name . '</a></h5>';
    					echo '</div>';
    					echo '</div>';
    					echo '</div>';
    				}
    			}
    		}
    	endwhile;
    endif;
    wp_reset_postdata();
    
    sdcom

    (@sdcom)

    Caro Felipe, funcionou perfeitamente!

    Muito obrigado.

    • Esta resposta foi modificada 1 mês atrás por  sdcom.
    sdcom

    (@sdcom)

    Felipe, me desculpe reabrir o tópico, mas surgiu uma dúvida:

    É possível ordenar por Nome ou Titulo da Taxonomia?

    Fiz um teste, porém não surtiu efeito:

    $terms = get_the_terms( $post->ID, ‘modelo’, array(‘orderby’ => ‘name’) );

    Moderador Felipe Elia

    (@felipeelia)

    Sem problemas. A get_the_terms não tem terceiro parâmetro.

    Você pode criar uma array vazio iterar pelos termos (sem exibi-los) e salvá-los nesse array. Depois então ordenar o array e só então exibir os termos.

    sdcom

    (@sdcom)

    Essa seria a única solução?
    Ou teriamos outra alternativa?

    Moderador Felipe Elia

    (@felipeelia)

    Essa seria a opção mais “curta”. Até seria possível usar get_terms (ao invés de get_the_terms) e passar os IDs dos posts, mas daria mais trabalho. Você chegou a tentar criar o código? Se precisar de ajuda em algum trecho pode deixar aqui que tentamos ajudar na medida do possível.

    sdcom

    (@sdcom)

    Entendi Felipe. Na verdade, não sei nem por onde começar. Poderia me ajudar?

    Moderador Felipe Elia

    (@felipeelia)

    Eu não testei, mas esse código aqui pode ser um começo para você. Avise se tiver alguma dúvida.

    
    $all_terms = [];
    if ( have_posts() ) {
    	while ( have_posts() ) {
    		the_post();
    		$terms = (array) get_the_terms( $post->ID, 'modelo' );
    		foreach ( $terms as $term ) {
    			$all_terms[ $term->name ] = get_term_link( $term, 'modelo' );
    		}
    	}
    }
    wp_reset_postdata();
    
    ksort( $all_terms );
    
    foreach ( $all_terms as $term_name => $term_link ) {
    	?>
    	<div class="col-md-3 col-sm-12">
    		<div class="product-box">
    			<div class="product-info">
    				<span class="price"><ins>MODELO</ins></span>
    				<h5 itemprop="headline"><a href="<?php echo $term_link; ?>"><?php echo $term_name; ?></a></h5>
    			</div>
    		</div>
    	</div>
    	<?php
    }
    
    sdcom

    (@sdcom)

    Show Felipe, funcionando 100%.

    Muito obrigado!

    Olá Felipe,

    Novamente venho pedir uma ajuda.
    Comecei a fazer o cadastro dos produtos e estou com um problema na exibição dos termos.

    Temos no exemplo abaixo:

    Modelo Aircross (esse possui 2 produtos)
    Modelo Berlingo (esse possui 1 produto)
    Modelo C3 (esse possui 4 produtos)
    Modelo C4 (esse possui 4 produtos)

    Totalizando 11 produtos cadastrados em 4 custom taxonomias.

    O problema está acontecendo quando cadastro o 11º produto.
    Seguindo essa ordem do exemplo, ao cadastrar o 11º produto, ele faz com que desapareça no frontend o Modelo Berlingo. Ai só mostra o Aircross, C3 e C4 respectivamente.

    Existe um limite para mostrar no frontend assim como limitamos quando utilizamos o wp_query (‘showposts’ => 4) por exemplo?

    OBS IMPORTANTE: isso começou a acontecer, depois que instalei o plugin Duplicate Posts. Já removi, mas o problema continua.

    • Esta resposta foi modificada 4 semanas, 1 dia atrás por  sdcom.

    Resolvido:

    $args = array_merge( $wp_query->query_vars, [‘posts_per_page’ => 10000 ] );
    query_posts( $args );

    Agora ele mostra todos.

Visualizando 15 respostas - 1 até 15 (de um total de 25)
  • Você deve estar conectado para responder a este tópico.