• Добрый день.
    Столкнулся с проблемой.
    Нужно вывести все таксономии с постами относящихся к ним.
    У меня выходит вывести список таксономий с записями, но запись которая относиться к таксономии «А», почему-то выводиться и для таксономии «Б».
    В чем проблема, и как нужно поправить код для корректной работы?
    Спасибо!

    Вот мой код:

      <?php
         $terms = get_terms( 'partners_category', array(
            'orderby'    => 'count',
            'hide_empty' => 0
         ) );
    
        foreach( $terms as $term ) {
         
            $args = array(
                'post_type' => 'partners_type',
                'partner_cat' => $term->slug
            );
            $query = new WP_Query( $args );
                     
             echo'<h2>' . $term->name . '</h2>';
             
            echo '<ul>';
             
              
                while ( $query->have_posts() ) : $query->the_post(); ?>
         
                <li id="post-<?php the_ID(); ?>">
                    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                </li>
                 
                <?php endwhile;
             
            echo '</ul>';
             
            wp_reset_postdata();
        } ?>
Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Модератор Юрій

    (@yube)

    но запись которая относиться к таксономии «А», почему-то выводиться и для таксономии «Б».

    В коде я вижу только одну таксономию partners_category.
    Взялись за программирование — называйте вещи своими именами. Иначе трудно понять, Вы не так назвали или не то накодили.

    И вообще, запись не может относиться к таксономии. К таксономии может относиться тип записи, а сами записи — к термам таксономии.

    ` $args = array(
    ‘post_type’ => ‘partners_type’,
    ‘partner_cat’ => $term->slug
    );
    `

    Что это за ‘partner_cat’? Откуда? У объекта класса WP_Query нет такого. А потому это просто игнорируется. На выходе получается N записей типа partners_type, где N — настраиваемое в админке кол-во записей на страницу, если никакой плагин не изменил дефолтное значение.

    Матчасть: https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters

    По поводу «partner_cat» понял.
    Таксономию при регистрации в «function.php» я назвал «product_category».
    В админке WP, создал для нее «категории»(если не правильно называю, просьба поправить:) )
    Назвал их: «one_cat», «two_cat».
    На странице «product_category» мне нужно вывести все «категории»(«one_cat», «two_cat») с записями которые относятся к определенной категории в формате:

    «one_cat»
    Запись №1 которая относиться к «one_cat»
    Запись №2 которая относиться к «one_cat»
    Запись №3 которая относиться к «one_cat»

    «two_cat»
    Запись №1 которая относиться к «two_cat»
    Запись №2 которая относиться к «two_cat»
    Запись №3 которая относиться к «two_cat»

    Модератор Юрій

    (@yube)

    «категории»(если не правильно называю, просьба поправить:)

    «Категория» является неофициальным и устаревшим переводом встроенной таксономии «category» (сейчас это «рубрика»). Поэтому формально как бы можно использовать «свободное слово», но оно может вводить в заблуждение. Лучше использовать слово term и/или его перевод. Я пишу «терм» по привычке, оставшейся с тех времен, когда в Кодексе не было официального перевода разделов, касающихся таксономий (не знаю, есть ли сейчас).

    Я не придираюсь, просто в этой непростой в общем-то бодяге очень просто можно использовать не то значение, если нет кристально чистого понимания что есть что, а использование неправильного названия не способствует ясности понимания. Даже для себя. К сожалению, понимание не гарантирует получение правильного результата с первой попытки. Это уже из личного опыта.

    Переделенный пример из мануала:

    
    $args = array(
        'post_type' => 'partners_type',
        'post_status' => 'publish',
        'tax_query' => array(
            array(
                'taxonomy' => 'partners_category',
                'field'    => 'slug',
                'terms'    => $term->slug,
            ),
        ),
        'posts_per_page' => 3,
    );
    $query = new WP_Query( $args );
    
    

    Воспользовался кодом:

    
    					<?php 
    						$args = array(
    					    'post_type' => 'partners_type',
    					    'post_status' => 'publish',
    					    'tax_query' => array(
    					        array(
    					            'taxonomy' => 'partners_category',
    					            'field'    => 'slug',
    					            'terms'    => $term->slug,
    					        ),
    					    ),
    					    'posts_per_page' => 3,
    					);
    					$query = new WP_Query( $args );
    
    					 while ( $query->have_posts() ) : $query->the_post(); ?>
    			            
    			                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                 
                <?php endwhile;
    					 ?>
    					

    Ничего не вывело, хотя для этой таксономии созданы записи. В какую сторону двигаться, подскажите. Что может быть не правильно?
    Спасибо.

    Модератор Юрій

    (@yube)

    Воспользовался кодом:

    Прямо так или в цикле?

         $terms = get_terms( 'partners_category', array(
            'orderby'    => 'count',
            'hide_empty' => 0
         ) );
    
        foreach( $terms as $term ) {
    # тут код
        }
    

    Юрий, лед вроде тронулся 🙂
    Вот код который я на данный момент использую.

    <?php 
                    $query = new WP_Query( array(
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'one_taxonomy',
                'field'    => 'slug',
                'terms'    => array( 'dlja-mostiv', 'mastilni-materiali', 'olivi-v-dvigun', 'servisni-ridini-dlja-galmivnih-sistem', 'servisni-ridini-dlja-oholodzhujuchih-sistem' ),
            )
        )
    ) );
                    while ( $query->have_posts() ) : $query->the_post(); ?>
                                <h3><?php the_category(); ?></h3>
                                <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
                 
                <?php endwhile;
             ?>

    Выводит вроде как все правильно. Но если одна запись относится к двум терминам, то она выводиться только для термина который задан первым в массиве ‘terms’. Как это можно решить?
    Можно ли как-то автоматизировать добавление терминов в массив ‘terms’? Или это можно сделать только вручную?
    И как вывести термин записи?
    Спасибо.

    Модератор Юрій

    (@yube)

    Можно ли как-то автоматизировать добавление терминов в массив ‘terms’?

    Вы же это (ну, почти) делали. Как-то так можно получить массив слагов

    
    $all_terms = get_terms( 'partners_category', array( 'hide_empty' => 0 ) );
    foreach (  $all_terms as $term ) {
            $terms[] = $term->slug;
    }
    

    и затем использовать в качестве аргумента
    'terms' => $terms,

    Модератор Юрій

    (@yube)

    И как вывести термин записи?

    ТермЫ 🙂 Их может быть более одного. Функия get_the_terms() возвращает массив термов из указанной таксономии для указанной записи. (_the_ в именах функций почти всегда указывает на то, что функция работает с одной конкретной записью)

    Home

    К сожалению пока что так и получается "ну, почти" :)
    Вывод всех термов автоматически осуществил благодаря Вашему коду. Спасибо большое! 🙂
    С get_the_terms() ознакомился. Спасибо! 🙂
    Я уже честно говоря закипаю, и путаться начинаю)
    Вывод всех постов из термов определенной таксономии Мы сделали.
    Вывод всех термов определенной таксономии Я сделал благодаря функции get_the_terms() .
    Код у меня теперь выглядит так:

    <?php 
            $all_terms = get_terms( 'category_product', array( 'hide_empty' => 0 ) );
    foreach (  $all_terms as $term ) {
            $terms[] = $term->slug;
    }
                    $query = new WP_Query( array(
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'one_taxonomy',
                'field'    => 'slug',
                'terms'    => $terms,
            )
        )
    ) );
        
     $categories = get_terms('one_taxonomy', 'orderby=name&hide_empty=0');
               
       if($categories){
    
                 foreach ($categories as $cat){
                  echo "<p>{$cat->name}</p>";
                               
                   }
                            
       }
                 
             while ( $query->have_posts() ) : $query->the_post(); ?>
    
                    <h3></h3>
                    <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
                 
        <?php endwhile;
        ?>

    Вопрос: Как теперь сделать выборку? В виде:

    Терм1
    запись Терм1
    запись Терм1
    запись Терм1
    
    Терм2
    запись Терм2
    запись Терм2
    запись Терм2

    и в таком духе?
    Цикл while добавлял внутрь цикла foreach. В итоге все созданные посты выводилить под каждым термом.

    Модератор Юрій

    (@yube)

    Вложенные циклы — вот как это называется 🙂
    В наружном (внешнем) получаем термы таксономии ‘one_taxonomy’ (если неправильно, поменяйте на нужную, я тоже запутался) и выводим имя терма, во внутреннем цикле для каждого терма выводим списком все записи (заголовки-ссылки)

    
    <?php 
    $all_terms = get_terms( 'one_taxonomy', array( 'hide_empty' => 0 ) );
    foreach (  $all_terms as $term ) { # внешний цикл
        echo "<h3>$term->name</h3>";
        echo "<ul>";
        $query = new WP_Query( array(
            'post_status' => 'publish',
            'posts_per_page' => -1,
            'tax_query' => array(
                array(
                    'taxonomy' => 'one_taxonomy',
                    'field'    => 'slug',
                    'terms'    => $term->slug,
                )
            )
        ));
        $query = new WP_Query( $args );
        while ( $query->have_posts() ) { # внутренний цикл
            $query->the_post();
            echo "<li><a href='" . $query->the_permalink() . "'>". $query->the_title() . "</a></li>";
        } # конец внутреннего
        echo "</ul>";
    } # конец наружного
    

    Юрий. Вам код не выводил записи.
    Немного поправив его все вышло!!!!

    <?php 
    $all_terms = get_terms( 'one_taxonomy', array( 'hide_empty' => 0 ) );
    foreach (  $all_terms as $term ) { # внешний цикл
        echo "<h3>$term->name</h3>";
        echo "<ul>";
        $query = new WP_Query( array(
            'post_status' => 'publish',
            'posts_per_page' => -1,
            'tax_query' => array(
                array(
                    'taxonomy' => 'one_taxonomy',
                    'field'    => 'slug',
                    'terms'    => $term->slug,
                )
            )
        ));
        
        while ( $query->have_posts() ) { # внутренний цикл
            $query->the_post();
            ?>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            <?php  
        } # конец внутреннего
        echo "</ul>";
    } # конец наружного
    ?>

    Юрий, большое спасибо за Вашу помощь!!!!!
    Без Вас, я даже не знаю сколько бы времени потратил на решение этой проблемы…

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Проблема вывода всех таксономий и постов относящихся к ним.» закрыта для новых ответов.