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>
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.
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.
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.