web-dev-qa-db-fra.com

Exclure les termes enfants des messages parents

Comment puis-je exclure les posts de terme enfant d'apparaître dans la sortie de posts de terme parent ?? À l’heure actuelle, cela fait double emploi dans les sorties terminales parent et enfant.

 //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>';   
}

Ci-dessous est ce que j'essaie de me débarrasser.

<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>
4
JonnyPlow

Dans votre appel get_terms(), essayez de définir l’option hierarchical sur false:

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

La valeur par défaut de cette option est true, ce qui explique probablement pourquoi vous obtenez des copies supplémentaires.

1
Dougal Campbell

Je me suis battu avec ce problème pendant trois jours, mais à la fin j'ai gagné en utilisant une requête personnalisée. Mettez ce code dans votre template 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; ?>

J'utilise la taxonomie "menu", mais vous devez modifier en conséquence.

1
Banago

Tout d'abord, comme le dit Bainternet, votre fonction est sans fin.

Mais pour résoudre votre problème initial, il existe un paramètre non documenté pour tax_query afin d'empêcher l'extraction de publications en termes enfants. Il nécessite une version assez récente de WordPress (je ne connais pas la version exacte dans laquelle il a été implémenté, mais cela fonctionne certainement dans la dernière version).

Essayez ceci, cela devrait faire l'affaire:

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

Comme vous le remarquerez, l'inclusion de 'include_children' => 0 empêchera l'affichage des publications enfants dans les taxonomies hiérarchiques.

1
cheesypeanut