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

👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

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

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

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

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

Создай свой первый сайт на WordPress

vitall
Оцените автора
Добавить комментарий

  1. tiaurus

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

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

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

    Ответить
  2. vitall автор

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

    Ответить
  3. vitall автор

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

    Ответить
  4. vitall автор

    ну что, есть у кого-то мысли как это сделать?

    Ответить
    1. Apathetic

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

      Ответить
  5. vitall автор

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

    Ответить
    1. Apathetic

      Протестирую код и, если всё ок, выложу сюда ближе к вечеру =)

      Ответить
    2. Apathetic

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

      <?php
      $par_cats = get_terms( 'category' );
      foreach ( $par_cats as $par_cat )
      {
      	if ( $par_cat->parent < 1 ) // Определяем категории, у которых нет дочерних категорий
      	{
      		$par_catname = $par_cat->name;
      		echo "<h2>Родительская категория $par_catname</h2>"; // Выводим название родительской категории
      		$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 "<h3>Дочерняя категория $child_catname</h3>"; // Выводим название дочерней категории
      			while ($productquery->have_posts()) : $productquery->the_post(); ?>
      				<!-- ЗДЕСЬ РАЗМЕЩАЕМ КОД ОДНОЙ ПОЗИЦИИ - НАЧАЛО -->
      				<div>
      					<?php if ( has_post_thumbnail() ) {
      						the_post_thumbnail();
      					} ?>
      					<h4><?php the_excerpt(); ?></h4>
      				</div>
      				<!-- ЗДЕСЬ РАЗМЕЩАЕМ КОД ОДНОЙ ПОЗИЦИИ - КОНЕЦ -->				
      			<?php endwhile; endif;
      		}
      	}
      }
      ?>

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

      Ответить
      1. vitall автор

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

        Ответить
        1. Apathetic

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

          Ответить
        2. Apathetic

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

          <?php
          $ctax = 'category';
          function product_template() {
          ?>
          	<!-- ЗДЕСЬ РАЗМЕЩАЕМ КОД ОДНОЙ ПОЗИЦИИ - НАЧАЛО -->
          	<div>
          		<?php if ( has_post_thumbnail() ) {
          			the_post_thumbnail();
          		} ?>
          		<h4><?php the_excerpt(); ?></h4>
          	</div>
          	<!-- ЗДЕСЬ РАЗМЕЩАЕМ КОД ОДНОЙ ПОЗИЦИИ - КОНЕЦ -->				
          <?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 "<h2>$par_catname</h2>"; // Выводим название родительской категории
          		$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 "<h3>$child_catname</h3>"; // Выводим название дочерней категории
          			while ($productquery->have_posts()) : $productquery->the_post(); 
          				product_template();
          			endwhile; endif;
          		} 
          	}
          }
          ?>
          
          Ответить
          1. vitall автор

            да, конечно название таксономии менял в двух местах и в этом новом примере — Опять же — дочерние пункты меню невыводятся.
            Вводил имя таксономии — в моём случае это «products». Эта таксономия включает в себя две родительские категории «Для детей» и «Для взрослых» которые имею свои подкатегории. Посты в этих категориях берутся из произвольных записей «Товары».

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

            Ответить
            1. Apathetic

              пишите apathetic20

              Ответить
            2. vitall автор

              :) все норма! Сайт не раз помагал решить вопросы по WP. А конечный результат я обязательно опубликую.

              Ответить
  6. vitall автор

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

    <?php
    $ctax = 'category';
    $posts_per_page = '-1';
    function product_template() { // Здесь можно использовать любые template tags
    ?>
        <div>
            <?php the_title(); ?>
        </div>
    <?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 "<h2>$par_catname</h2>"; // Выводим название родительской категории
            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 "<h3>$child_catname</h3>"; // Выводим название дочерней категории
    			while ( have_posts() ) : the_post();
    				product_template();
    			endwhile;
    			wp_reset_query();
            } 
        }
    }
    ?>
    

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

    Ответить
    1. 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 "<h2>$par_catname</h2>"; // Выводим название родительской категории
      		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 "<h3>$child_catname</h3>"; // Выводим название дочерней категории
      			while ( have_posts() ) : the_post();
      				echo(types_render_field("main_img_product", array("raw"=>"true")));
      				echo '<br>';
      			endwhile; endif; wp_reset_query();
              } 
          }
      }
      ?>
      Ответить
  7. Михалыч

    Apathetic, спасибо за решение. Но возникла такая проблема. Есть страница, куда вывожу кастомные записи разделенные на кастомные рубрики. Заметил, что когда редактирую название кастомной рубрики уже после её создания, то кастомные записи из неё исчезают. Приходится удалять рубрику и создавать заново. Потом привязываю к ней записи и все снова отображается.

    Ответить