web-dev-qa-db-ja.com

親の投稿から子の用語を除外する

どのようにして子用語の投稿を親用語の投稿の出力に表示しないようにすることができますか?現時点では、親と子の両方の用語の出力に重複しています。

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

以下は私が取り除こうとしているものです。

<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

get_terms()呼び出しで、hierarchicalオプションをfalseに設定してみます。

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

このオプションは通常デフォルトでtrueです。

1
Dougal Campbell

私は3日間この問題と戦いましたが、結局私はカスタムクエリを使うことで勝ちました。このコードを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; ?>

私は「メニュー」分類法を使用しますが、それに応じて編集する必要があります。

1
Banago

まず、Bainternetが言っているように、あなたの機能は終わらない。

しかし、元々の問題を解決するために、tax_queryには子の条件で投稿が取得されないようにするための文書化されていないパラメータがあります。それはかなり最近のバージョンのWordPressを必要とします(私はそれが実装された正確なバージョンを知りませんが、それは確かに最新のリリースで動作します)。

これを試してください、それはトリックをするべきです:

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

お気づきのとおり、'include_children' => 0を含めると、階層分類法の子投稿が表示されなくなります。

1
cheesypeanut