Как сделать вывод записей произвольного типа записей по категории?

Ссылка скопирована
PHP
1 ответ

Суть вопроса такова, есть тип записей 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 ... ) ) ));

  • GeKskill, Написал код как пытаюсь сделать вывод
  • redesupar, get_taxonomies это совсем другая функция, почитайте описание. Вам надо:
    $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 ) ));

  • GeKskill, я добавил второй код, а как туда добавить meta_key? я и fields делал но чето не вышло.
    Сделал первый код по вашему ответу так, но тоже ничего
    <?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() ) : ?>

  • GeKskill, поля если что делал через acf
  • redesupar, в переменной $categories у вас уже будет массив id. Зачем вы его через foreach прогоняете? Посмотрите, что в вашем случае получается в $categories, возможно ничего не находит и мета ключ является скрытым т.е начинается с _vyvodit_na_strai. Не помню почему, но бывало, что через 'meta_query' находило, а так нет. На крайняк чрез phpmyadmin посмотрите в таблице wp_termmeta как выглядит ваш ключ и значение, может чекбокс сохраняется не yes, а просто как 1.
  • GeKskill,
    и бд так
    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
  • GeKskill,
    '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

    и пошло, спасибо за наводку

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    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();
            }
        }
    }

    $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;
    }

    $enabled = get_field('vyvodit_na_strai', 'product-cat_' . $term->term_id); if ($enabled !== 'yes') { continue; }

    Если товаров много, не делайте тяжёлый вывод всех категорий и всех товаров на каждой загрузке страницы. Ограничивайте количество записей, добавляйте пагинацию или кэшируйте готовый HTML через transient. И обязательно проверяйте, что slug таксономии указан верно: если в регистрации таксономии написано products_cat, а в запросе product-cat, запрос просто ничего не найдёт.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно