Excluir termos filhos de publicações parentais

4

Como posso excluir as postagens do termo filho da exibição na saída de postagens do termo pai? No momento, ele está duplicando nas saídas de termo pai e filho.

 //Function to display posts grouped by taxonomies
    function display_posts_per_taxonomies($parent_term, $post_type = 'beat_posts', $taxonomy = 'beats'){
    $parent_posts = get_posts(array(
    'tax_query' => array( array(
    'taxonomy' => $taxonomy,
    'field' => 'slug',
    'terms' => $parent_term
        )),
        'post_type' => $post_type
    ));
    echo '<ul>';
    foreach($parent_posts as $post){
        echo "<li>{$post->post_title}</li>"; 
    }
    $children_terms = get_terms($taxonomy, array(
        'parent' => get_term_by('slug', $parent_term, $taxonomy)->term_id
    )); 
    foreach($children_terms as $term){
        echo '<li>';
        display_posts_per_taxonomies($term->slug, $post_type, $taxonomy);
        echo '</li>';
    }
    echo '</ul>';   
}

Abaixo está o que eu estou tentando me livrar.

<ul>
<li>adsf</li>
<li>ergerg</li> <---get rid of this one (duplicate)
<li>asdfasdfsdf</li> <---get rid of this one (duplicate)
<li>rthhdhdfhdhdfhdfg</li>
<li>
<ul>
<li>ergerg</li>
<li>asdfasdfsdf</li>
</ul>
</li>
</ul>
    
por JonnyPlow 01.06.2011 / 06:40

3 respostas

1

Na sua chamada get_terms() , tente definir a opção hierarchical como false :

$children_terms = get_terms($taxonomy, array(
        'parent' => get_term_by('slug', $parent_term, $taxonomy)->term_id,
        'hierarchical' => false
));

Esta opção normalmente é padronizada como true , e é provavelmente por isso que você está recebendo as cópias extras.

    
por Dougal Campbell 01.06.2011 / 15:47
1

Eu lutei com esse problema por três dias, mas no final, ganhei usando uma consulta personalizada. Coloque este código no seu modelo taxonomy.php:

<?php
global $wpdb;
global $post;

$term = get_term_by('slug', $wp_query->get( 'term' ), 'menu');

$querystr = "
SELECT wposts.* 
FROM $wpdb->posts wposts
    LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.taxonomy = 'menu'
    AND $wpdb->term_taxonomy.term_id IN( $term->term_id )
LIMIT 20";

 $pageposts = $wpdb->get_results($querystr, OBJECT); ?>


<?php if( $pageposts ) : ?>

  <?php foreach ( $pageposts as $post ): ?>
  <?php setup_postdata($post); ?>

//Echo post title/content here.

  <?php endforeach; endif; ?>

Eu uso a taxonomia "menu", mas você precisa editar de acordo.

    
por Banago 03.07.2011 / 19:52
1

Em primeiro lugar, como Bainternet diz que sua função é interminável.

Mas, para resolver seu problema original, há um parâmetro não documentado para tax_query para impedir que as postagens em termos filhos sejam buscadas. Ele requer uma versão bastante recente do WordPress (não sei a versão exata em que foi implementado, mas certamente funciona na versão mais recente).

Tente isso, deve fazer o truque:

$parent_posts = get_posts(array(
    'tax_query' => array( 
        array(
            'taxonomy' => $taxonomy,
            'field' => 'slug',
            'terms' => $parent_term,
            'include_children' => 0
        )
    ),
    'post_type' => $post_type
));

Como você notará, a inclusão de 'include_children' => 0 impedirá que as postagens filhas nas taxonomias hierárquicas sejam exibidas.

    
por cheesypeanut 04.08.2011 / 23:55

Tags