Как сделать вывод записей произвольного типа записей по категории?
Суть вопроса такова, есть тип записей products, сделал таксономию категории и добавил к таксономии checkbox "vibor"
"Выводить на странице X"? где сделала один выбор yes : да.
И вот хочу выводить определенные категории и товары внутри этой категории если стоит эта галочка на чекбоксе в самой категории?
Как сделать правильный запрос? вообще в ступор зашел
Пытался делать так
<?php //НАЧАЛО СПИСКА $arg_cat = array( 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => 1, 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes', ); $categories = get_taxonomies( $arg_cat ); if( $categories ){ foreach( $categories as $cat ){ $arg_posts = array( 'post_type' => 'product', 'posts_per_page' => 3, 'tax_query' => array( array( 'taxonomy' => 'product-cat', 'field' => 'term_id', 'terms' => array( $cat->cat_ID ) ) ) ); $query = new WP_Query($arg_posts); if ($query->have_posts() ) : ?> <a href="<?php echo get_category_link( $cat->term_id ); ?>"><h2><?php echo $cat->name; ?></h2></a> <ul> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <li> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><h3><?php the_title(); ?></h3></a> </li> <?php endwhile; wp_reset_postdata(); ?> </ul> <?php endif; } } // КОНЕЦ ?> |
<?php //НАЧАЛО СПИСКА $arg_cat = array( 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => 1, 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes', ); $categories = get_taxonomies( $arg_cat ); if( $categories ){ foreach( $categories as $cat ){ $arg_posts = array( 'post_type' => 'product', 'posts_per_page' => 3, 'tax_query' => array( array( 'taxonomy' => 'product-cat', 'field' => 'term_id', 'terms' => array( $cat->cat_ID ) ) ) ); $query = new WP_Query($arg_posts); if ($query->have_posts() ) : ?> <a href="<?php echo get_category_link( $cat->term_id ); ?>"><h2><?php echo $cat->name; ?></h2></a> <ul> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <li> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><h3><?php the_title(); ?></h3></a> </li> <?php endwhile; wp_reset_postdata(); ?> </ul> <?php endif; } } // КОНЕЦ ?>
UPD
Сначала вывел по разделенным таксономиям
<?php $terms = get_terms( 'product-cat', array( 'orderby' => 'name', 'hide_empty' => 1 ) ); // теперь выполняется запрос для каждого семейства животных foreach( $terms as $term ) { // Определение запроса $args = array( 'post_type' => 'product', 'product-cat' => $term->slug ); $query = new WP_Query( $args ); // вывод названий записей в тегах заголовков echo'<h2>' . $term->name . '</h2>'; // вывод списком заголовков записей echo '<ul>'; // Начало цикла while ( $query->have_posts() ) : $query->the_post(); ?> <li class="animal-listing" id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </li> <?php endwhile; echo '</ul>'; // используем сброс данных записи, чтобы восстановить оригинальный запрос wp_reset_postdata(); } ?> |
<?php $terms = get_terms( 'product-cat', array( 'orderby' => 'name', 'hide_empty' => 1 ) ); // теперь выполняется запрос для каждого семейства животных foreach( $terms as $term ) { // Определение запроса $args = array( 'post_type' => 'product', 'product-cat' => $term->slug ); $query = new WP_Query( $args ); // вывод названий записей в тегах заголовков echo'<h2>' . $term->name . '</h2>'; // вывод списком заголовков записей echo '<ul>'; // Начало цикла while ( $query->have_posts() ) : $query->the_post(); ?> <li class="animal-listing" id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </li> <?php endwhile; echo '</ul>'; // используем сброс данных записи, чтобы восстановить оригинальный запрос wp_reset_postdata(); } ?>
вывелось прекрасно, но вот когда добавляю пользовательское поле(через ACF) то невыводит
$terms = get_terms( 'product-cat', array( 'orderby' => 'name', 'hide_empty' => 1, 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes' ) ); |
$terms = get_terms( 'product-cat', array( 'orderby' => 'name', 'hide_empty' => 1, 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes' ) );
Дополнительно:
Перечитал несколько раз, ничего не понял. Что за чекбок? Кастомное поле у термина таксономии?
Если так, то сначала берете термины с meta_key = 'vibor', это функция get_terms();
Затем просто подставляете id полученных терминов категории в 'tax_query' любой функции получения постов, например:
get_posts( 'tax_query' => array( array( 'taxonomy' => 'product_category', 'terms' => array( id1, id2 ... ) ) )); |
get_posts( 'tax_query' => array( array( 'taxonomy' => 'product_category', 'terms' => array( id1, id2 ... ) ) ));
$categories = get_terms( [ 'taxonomy' => 'тут ваша таксономия категории', 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes', 'fields' => 'ids', ] ); get_posts( 'tax_query' => array( array( 'taxonomy' => 'product_category', 'terms' => $categories ) )); |
$categories = get_terms( [ 'taxonomy' => 'тут ваша таксономия категории', 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes', 'fields' => 'ids', ] ); get_posts( 'tax_query' => array( array( 'taxonomy' => 'product_category', 'terms' => $categories ) ));
Сделал первый код по вашему ответу так, но тоже ничего
<?php //НАЧАЛО СПИСКА $categories = get_terms( [ 'taxonomy' => 'product-cat', 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes', 'fields' => 'ids', ] ); if( $categories ){ foreach( $categories as $cat ){ $arg_posts = array( 'post_type' => 'product', 'posts_per_page' => 3, 'tax_query' => array( array( 'taxonomy' => 'product-cat', 'terms' => $categories ) ) ); $query = new WP_Query($arg_posts); if ($query->have_posts() ) : ?> |
<?php //НАЧАЛО СПИСКА $categories = get_terms( [ 'taxonomy' => 'product-cat', 'meta_key' => 'vyvodit_na_strai', 'meta_value' => 'yes', 'fields' => 'ids', ] ); if( $categories ){ foreach( $categories as $cat ){ $arg_posts = array( 'post_type' => 'product', 'posts_per_page' => 3, 'tax_query' => array( array( 'taxonomy' => 'product-cat', 'terms' => $categories ) ) ); $query = new WP_Query($arg_posts); if ($query->have_posts() ) : ?>
и бд так
meta_id term_id meta_key meta_value
1 16 vyvodit_na_strai a:1:{i:0;s:3:"yes";}
2 16 _vyvodit_na_strai field_647893a7897b2
'orderby' => 'name', 'meta_key' => '_vyvodit_na_strai', 'meta_value' => 'field_647893a7897b2', 'hide_empty' => 1 |
'orderby' => 'name', 'meta_key' => '_vyvodit_na_strai', 'meta_value' => 'field_647893a7897b2', 'hide_empty' => 1
и пошло, спасибо за наводку
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В вашем коде главная ошибка в том, что
get_taxonomies()возвращает таксономии, а не термины категорий. Вам нужны термины таксономииproduct-cat, отфильтрованные по term meta, а потом отдельныйWP_Queryпо каждому термину.Пример:
$terms = get_terms([ 'taxonomy' => 'product-cat', 'hide_empty' => true, 'orderby' => 'name', 'order' => 'ASC', 'meta_query' => [ [ 'key' => 'vyvodit_na_strai', 'value' => 'yes', ], ], ]); if (! is_wp_error($terms) && $terms) { foreach ($terms as $term) { echo '<h2>' . esc_html($term->name) . '</h2>'; $query = new WP_Query([ 'post_type' => 'products', 'posts_per_page' => 3, 'tax_query' => [ [ 'taxonomy' => 'product-cat', 'field' => 'term_id', 'terms' => $term->term_id, ], ], ]); if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); echo '<a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a>'; } wp_reset_postdata(); } } }
Проверьте точные имена: post type у вас в тексте
products, а в попытке запроса былproduct. Это разные значения. Также у термина нетcat_IDдля произвольной таксономии; используйте$term->term_id.Обратите внимание ещё на два момента. Если чекбокс сделан через ACF для термина, ключ мета-поля может храниться именно у термина, а не у записи. Тогда проверять его нужно через
get_field('vyvodit_na_strai', 'product-cat_' . $term->term_id)или черезget_term_meta(), в зависимости от того, как поле создано. Для ACF чаще удобнее так:$enabled = get_field('vyvodit_na_strai', 'product-cat_' . $term->term_id); if ($enabled !== 'yes') { continue; }
Если товаров много, не делайте тяжёлый вывод всех категорий и всех товаров на каждой загрузке страницы. Ограничивайте количество записей, добавляйте пагинацию или кэшируйте готовый HTML через transient. И обязательно проверяйте, что slug таксономии указан верно: если в регистрации таксономии написано
products_cat, а в запросеproduct-cat, запрос просто ничего не найдёт.