jonnyplow
  • 0
Новичок

Исключить дочерние термины из родительских сообщений

  • 0

Как я могу исключить дочерние сообщения терминов из отображения в выводе родительских сообщений терминов ?? Прямо сейчас он дублируется как в родительских, так и в дочерних выводах терминов.

 //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>
Share
  1. Ваша функция вызывает себя нерекурсивным образом, что приведет к бесконечному циклу.

    • 0
  2. В своем get_terms() звонке попробуйте установить hierarchical параметр false :

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

    Эта опция обычно имеет значение по умолчанию true, поэтому, вероятно, вы получаете дополнительные копии.

    • 0
  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; ?>
    

    Я использую таксономию «меню», но вам нужно соответствующим образом отредактировать.

    • 0
  4. Во-первых, как говорит 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 остановит отображение дочерних сообщений в иерархических таксономиях.

    • 0

Оставить ответ

You must login to add an answer.