Все таксономии и записи в них на одной странице

Подскажите, как написать правильный запрос на вывод списка произвольных иерархических таксономий и списка записей в них. Таким образом хочу вывести список товаров в таком виде:

Название таксономии 1
Название товара 1, фотка, описание, инфа из дополнительных полей.
Название товара 2, фотка, описание, инфа из дополнительных полей.
ит д.

Название таксономии 2
Название товара 1, фотка, описание, инфа из дополнительных полей.
Название товара 2, фотка, описание, инфа из дополнительных полей.
ит д.

Возможно ли это?

17 Комментарии

  1. Насколько я понимаю,
    название товара – это название поста,
    фотка – это миниатюра поста,
    описание – это цитата (excerpt) поста,
    инфа из дополнительных полей – это вывод текста из произвольного поля поста.

    Какую таксономию вы имеете ввиду? Любую? Пользовательскую? Теги? Категории?

    Судя по вашему описанию, все сводится к выводу всех постов (название + миниатюра + цитата + содержимое произвольного поля) с группировкой по таксономии.

  2. Совершенно верно – но для самих товаров, я создал произвольный тип записей, но в целом вы правильно описали. Под таксономией я имею ввиду Пользовательскую таксономию, причем эта таксономия иерархическая (такая как обычные рубрики WP). Да, интересует именно такой вывод.

  3. Пример вывода
    вот пример вывода. Тоесть, выводится название таксономии, название вложенной таксономии и посты в ней.

    • Сколько всего этих категорий? Их число ограничено или нет? Планируется ли добавлять на страницу новые?

  4. около 20 подкатегорий в 5-ти категориях. Планируется добавлять в них только товары. Интересно как такое сделать на WP.

    • Вот как-то так:

      < ?php
      $par_cats = get_terms( 'category' );
      foreach ( $par_cats as $par_cat )
      {
      	if ( $par_cat->parent < 1 ) // Определяем категории, у которых нет дочерних категорий
      	{
      		$par_catname = $par_cat->name;
      		echo "

      Родительская категория $par_catname

      "; // Выводим название родительской категории $par_catid = $par_cat->term_id; $child_cats = get_terms( 'category', array ( 'parent' => $par_catid ) ); // Добываем дочерние категории foreach ( $child_cats as $child_cat) { $child_catname = $child_cat->name; $child_catid = $child_cat->term_id; $productquery = new WP_Query("cat=$child_catid"); if ($productquery->have_posts()) : echo "

      Дочерняя категория $child_catname

      "; // Выводим название дочерней категории while ($productquery->have_posts()) : $productquery->the_post(); ?>
      < ?php if ( has_post_thumbnail() ) { the_post_thumbnail(); } ?>

      < ?php the_excerpt(); ?>

      < ?php endwhile; endif; } } } ?>

      Примечания:
      1) Во второй и десятой строках нужно поменять слово category на имя своей кастомной таксономии.
      2) Несмотря на внешнюю легкость кода, он производит довольно-таки большую нагрузку. К сожалению, в WP нет встроенного механизма сортировки записей по категориям, в таком случае код был бы легче, но что есть, то есть, и других вариантов я придумать не смог.
      3) Из второго пункта следует третий: настоятельно советую установить какой-нибудь плагин кэширования.
      4) У кода есть следующие недостатки:
      а) Названия верхних категорий выводятся, даже если у них нет дочерних категорий и в них нет постов (устранимо)
      б) Не выводятся записи из родительских категорий (устранимо)
      5) Код я протестировал – он работает, как надо. Единственное, что протестировать не могу, так это тамбнейлы, но, вроде бы, должно работать.

      • Отлично! Спасибо!! Затестил данный код: итак, если использовать со стандартными рубриками, то отображается все правильно. Если прописать имя кастомной таксономии, то отображаются только названия родительских рубрик, а ни названий дочерних, ни постов нет :(. Кстати, выводятся только те рубрики, в которых есть или записи, или вложенные рубрики с записями…

        • В десятой строке тоже название таксономии прописали? Других причин, из-за чего одно отображается, другое нет, придумать не могу. Можно узнать, что вы прописываете?

        • Подновил: теперь пустые категории не показываются. В случае, если в родительской категории есть посты – они показываются. Во второй строке подставьте свою таксономию.

          < ?php
          $ctax = 'category';
          function product_template() {
          ?>
          	
          	
          < ?php if ( has_post_thumbnail() ) { the_post_thumbnail(); } ?>

          < ?php the_excerpt(); ?>

          < ?php } $par_cats = get_categories( array ( 'taxonomy' => $ctax ) ); foreach ( $par_cats as $par_cat ) { if ( $par_cat->parent < 1 ) // Определяем категории, у которых нет дочерних категорий { $par_catname = $par_cat->name; $par_catid = $par_cat->term_id; $child_cats = get_categories( array ( 'taxonomy' => $ctax, 'child_of' => $par_catid ) ); // Добываем дочерние категории echo "

          $par_catname

          "; // Выводим название родительской категории $par_productquery = new WP_Query("cat=$par_catid"); if ($par_productquery->have_posts()) : while ($par_productquery->have_posts()) : $par_productquery->the_post(); product_template(); endwhile; endif; foreach ( $child_cats as $child_cat) { $child_catname = $child_cat->name; $child_catid = $child_cat->term_id; $productquery = new WP_Query("cat=$child_catid"); if ($productquery->have_posts()) : echo "

          $child_catname

          "; // Выводим название дочерней категории while ($productquery->have_posts()) : $productquery->the_post(); product_template(); endwhile; endif; } } } ?>
          • да, конечно название таксономии менял в двух местах и в этом новом примере – Опять же – дочерние пункты меню невыводятся.
            Вводил имя таксономии – в моём случае это “products”. Эта таксономия включает в себя две родительские категории “Для детей” и “Для взрослых” которые имею свои подкатегории. Посты в этих категориях берутся из произвольных записей “Товары”.

            Мы можем по icq или skype пообщаться?

  5. Вот итоговый рабочий код:

    < ?php
    $ctax = 'category';
    $posts_per_page = '-1';
    function product_template() { // Здесь можно использовать любые template tags
    ?>
        
    < ?php the_title(); ?>
    < ?php } $par_cats = get_categories( array ( 'taxonomy' => $ctax ) ); foreach ( $par_cats as $par_cat ) { if ( $par_cat->parent < 1 ) // Определяем категории, у которых нет дочерних категорий { $par_catname = $par_cat->name; $par_catid = $par_cat->term_id; $child_cats = get_categories( array ( 'taxonomy' => $ctax, 'child_of' => $par_catid ) ); // Добываем дочерние категории echo "

    $par_catname

    "; // Выводим название родительской категории query_posts("category__in=$par_catid&posts_per_page=$posts_per_page"); while ( have_posts() ) : the_post(); product_template(); endwhile; wp_reset_query(); foreach ( $child_cats as $child_cat) { $child_catname = $child_cat->name; $child_catid = $child_cat->term_id; query_posts("cat=$child_catid&posts_per_page=$posts_per_page"); echo "

    $child_catname

    "; // Выводим название дочерней категории while ( have_posts() ) : the_post(); product_template(); endwhile; wp_reset_query(); } } } ?>

    За помощь огромное спасибо Apathetic!

    • Чего-то ты какой-то старый вариант опубликовал. Финальный выглядит так:

      < ?php
      function product_template() {
       the_title();
      }
      $ctax = 'products';
      $ptype = 'product';
      $par_cats = get_categories( array ( 'taxonomy' => $ctax ) );
      foreach ( $par_cats as $par_cat )
      {
          if ( $par_cat->parent < 1 ) // Определяем категории, у которых нет дочерних категорий
          {       
              $par_catname = $par_cat->name;
              $par_catid = $par_cat->term_id;
              echo "

      $par_catname

      "; // Выводим название родительской категории query_posts( array( 'post_type' => $ptype, $ctax => $par_catname ) ); if ( have_posts() ) : while ( have_posts() ) : the_post(); product_template(); endwhile; endif; wp_reset_query(); $child_cats = get_categories( array ( 'taxonomy' => $ctax, 'child_of' => $par_catid ) ); // Добываем дочерние категории foreach ( $child_cats as $child_cat) { $child_catname = $child_cat->name; query_posts( array( 'post_type' => $ptype, $ctax => $child_catname ) ); if ( have_posts() ) : echo "

      $child_catname

      "; // Выводим название дочерней категории while ( have_posts() ) : the_post(); echo(types_render_field("main_img_product", array("raw"=>"true"))); echo '
      '; endwhile; endif; wp_reset_query(); } } } ?>
  6. Apathetic, спасибо за решение. Но возникла такая проблема. Есть страница, куда вывожу кастомные записи разделенные на кастомные рубрики. Заметил, что когда редактирую название кастомной рубрики уже после её создания, то кастомные записи из неё исчезают. Приходится удалять рубрику и создавать заново. Потом привязываю к ней записи и все снова отображается.

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*