Проблема вывода всех таксономий и постов относящихся к ним.
-
Добрый день.
Столкнулся с проблемой.
Нужно вывести все таксономии с постами относящихся к ним.
У меня выходит вывести список таксономий с записями, но запись которая относиться к таксономии «А», почему-то выводиться и для таксономии «Б».
В чем проблема, и как нужно поправить код для корректной работы?
Спасибо!Вот мой код:
<?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(); } ?>
-
но запись которая относиться к таксономии «А», почему-то выводиться и для таксономии «Б».
В коде я вижу только одну таксономию 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»«категории»(если не правильно называю, просьба поправить:)
«Категория» является неофициальным и устаревшим переводом встроенной таксономии «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; ?>
Ничего не вывело, хотя для этой таксономии созданы записи. В какую сторону двигаться, подскажите. Что может быть не правильно?
Спасибо.Воспользовался кодом:
Прямо так или в цикле?
$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’? Или это можно сделать только вручную?
И как вывести термин записи?
Спасибо.Можно ли как-то автоматизировать добавление терминов в массив ‘terms’?
Вы же это (ну, почти) делали. Как-то так можно получить массив слагов
$all_terms = get_terms( 'partners_category', array( 'hide_empty' => 0 ) ); foreach ( $all_terms as $term ) { $terms[] = $term->slug; }
и затем использовать в качестве аргумента
'terms' => $terms,
И как вывести термин записи?
ТермЫ 🙂 Их может быть более одного. Функия get_the_terms() возвращает массив термов из указанной таксономии для указанной записи. (_the_ в именах функций почти всегда указывает на то, что функция работает с одной конкретной записью)
К сожалению пока что так и получается
"ну, почти" :)
Вывод всех термов автоматически осуществил благодаря Вашему коду. Спасибо большое! 🙂
С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. В итоге все созданные посты выводилить под каждым термом.Вложенные циклы — вот как это называется 🙂
В наружном (внешнем) получаем термы таксономии ‘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>"; } # конец наружного ?>
Юрий, большое спасибо за Вашу помощь!!!!!
Без Вас, я даже не знаю сколько бы времени потратил на решение этой проблемы…
- Тема «Проблема вывода всех таксономий и постов относящихся к ним.» закрыта для новых ответов.