Отображение текущей подкатегории

У меня есть проблема.

<?php query_posts('category_name=events&posts_per_page=2&offset=1'); ?> <?php while (have_posts()) : the_post(); ?> <div> <?php $children = get_categories('child_of=3'); foreach ($children as $child) { $child = get_category($child); echo $child->cat_name; }; ?> </div> <?php endif; ?> <?php endwhile; ?> 

Я хотел бы показать текущее имя подкатегории из любой родительской категории.

При этом мне удастся выводить все имена подкатегорий из указанного родителя …

Я не использовал the_category() потому что он выводит имена подката, завернутые в список, и я бы хотел, чтобы они были без разметки.

Solutions Collecting From Web of "Отображение текущей подкатегории"

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

Я подозреваю, что вы это сделали:

скриншот с родительскими и дочерними категориями, выбранными одновременно

Это плохо, и предполагает отсутствие понимания того, как работают категории. Это также вызовет проблемы в вашем коде, если ваши предположения не соответствуют реальности вещей. Но не беспокойтесь, каждый делает эту ошибку (включая меня).

Например, мы не говорим людям, что дом также является зданием, они уже знают, что дома – это тип здания, и мы не должны упомянуть людей, что кошки и собаки – животные, чтобы они знали, в так же, как вам не нужно указывать WordPress, что ваш пост находится в категории «событие», если он уже находится в подкатегории «конференция» или «группа интересов», поскольку он уже знает, что категория «событие» содержит те ,

Что нужно сделать, так это:

скриншот, показывающий только категорию детей

Здесь, хотя я только отмечен дочерней категорией, любые записи под дочерним элементом также будут отображаться внутри архивов родительских категорий, потому что «parent» содержит «child» .

Категории детей не являются потомками родительских категорий. Категории детей содержатся в родительских категориях.

Поэтому в вашем случае вы захватываете текущую категорию сообщения, столкнувшись с этими проблемами:

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

Что тебе необходимо сделать:

  • Прекратите использовать query_posts , серьезно, сделайте, чтобы ваш редактор кричал клингон на вас, когда вы вводите его, у вас есть USB-игрушка с огневой пеной, сделайте обои для рабочего стола пустым кровью, никогда не используйте его . У вас нет оправданий для его использования. Никто.
  • Перестаньте проверять каждый термин по всей иерархии, просто проверьте подкатегорию, которую вы хотите. Категории содержат все их подкатегории, а не только те, которые проверяют этот конкретный ящик.
  • Сообщения имеют несколько категорий, даже без родительской / подкатегории, будьте осторожны
  • для циклов foreach не требуется точка с запятой на конце

Итак, код

Это текущий код:

 $children = get_categories('child_of=3'); foreach ($children as $child) { $child = get_category($child); echo $child->cat_name; } 

В этом списке перечислены все имена категорий. В нашем примере с проверенными родительскими и дочерними категориями он распечатает это:

 parentchild 

Сначала давайте использовать более эффективную функцию, которая является более общей, и обрабатывает теги и пользовательские таксономии:

 $categories = wp_get_object_terms( get_the_ID(), 'cat'); 

Затем вы должны проверить, что сообщение действительно имеет категории:

 if(!empty($categories)){ 

И это не было ошибкой:

  if(!is_wp_error( $categories )){ 

Итак, перейдем к вашим условиям, давайте разместим их в хорошем списке:

  echo '<ul>'; foreach($product_terms as $term){ 

Распечатайте их:

  echo '<li><a href="'.get_term_link($term->slug, 'product').'">'.$term->name.'</a></li>'; 

и закройте цикл:

  } echo '</ul>'; } } 

Это дает вам полный список всех категорий в сообщении. Теперь для части, с которой у вас проблемы. Вы хотите показывать только подкатегории. Поэтому нам нужно проверить, есть ли категория подкатегория, прежде чем показывать ее, чего вы не делаете.

Так:

 echo the term 

становится:

 if the term has no parent echo the term 

Вы можете проверить, имеет ли член родительский счет:

 if ( $term->parent != 0 ) { 

У вас также есть проблема, о которой вы не знаете, что, если у меня есть 3 уровня категорий, а не 2? Что относительно под-подкатегорий? Чтобы справиться с этим, возможно, вы хотите показать только самый нижний уровень или показывать только подкатегории, а не под-подкатегории. Для этого вам нужно знать, есть ли у категории термин «дети».

Вы также можете проверить, имеет ли этот термин детей:

 if ( !empty( $term->children ) ) { 

Я оставляю сборку окончательного кода как задачу для читателя, но если вы поймете сказанное, вы поймете, что нужно сделать (и какие строки копировать вставить).

Это не будет определять пользователей, проверяющих обе категории, поэтому вы должны следить за этим. Способы обойти это включают предотвращение проверки пользователями родительской категории с помощью пользовательского интерфейса пользовательского интерфейса, а не стандартного пользовательского интерфейса.

Вот почему архив категорий также содержит все сообщения в подкатегориях.

глоссарий

  • Таксономия – система классификации вещей, например категория, тег, цвет, каста, форма
  • Термин – классификатор в таксономии, например, «красный» – это термин в «цветной» таксономии, «брюки» – это термин в таксономии «одежды», «кошка» – это термин в таксономии «животного», pop "- это термин в таксономии« музыкального жанра ». Обратите внимание, что термин не сам по себе, например, поп-песни принадлежат к «поп-термину» таксономии «музыкального жанра»
  • Категория и теги – две встроенные таксономии, которые поставляются с WordPress
  • Объект – что-то, что вписывается в термин таксономии, обычно публикуется, но пользователи и комментарии также могут быть помещены в термины и таксономии

Прежде всего, вы не должны использовать query_posts для запуска пользовательских запросов. Из самого кода

Примечание. Эта функция не предназначена для использования плагинами или темами. Как поясняется ниже, есть более эффективные, более эффективные варианты для изменения основного запроса. query_posts () является слишком упрощенным и проблематичным способом изменения основного запроса страницы путем замены его новым экземпляром запроса. Он неэффективен (повторно запускает SQL-запросы), и в некоторых случаях он будет неудачным (особенно часто при работе с разбивкой по страницам). Любой современный WP-код должен использовать для этого более надежные методы, например, использование hook_posts.

Вы должны использовать WP_Query для этого пользовательского запроса

 $args = array( 'category_name' => 'events', 'posts_per_page' => 2, 'offset' => 1 ); $myquery = new WP_Query( $args ); while ($myquery->have_posts()) : $myquery->the_post(); <-----YOUR LOOP CONTENTS-----> endwhile; wp_reset_postdata(); 

EDIT 1 & EDIT 2

–SCRAPPED–

ИЗМЕНИТЬ 3

Вот работа кода из wp_list_categories() .

Сначала вам нужно получить идентификатор родительской категории, используя get_the_category()

 $categories = get_the_category(); $parentid = $categories[0]->category_parent; 

Этот родительский идентификатор затем можно передать обратно в wp_list_categories() чтобы показывать только дочерние категории этого конкретного родителя. Если ни одна дочерняя категория не существует, она возвращает имя родительской категории, иначе, если родитель имеет дочерние элементы, будут возвращены дочерние категории

Вот полная функция

 <?php $taxonomy = 'category'; // get the term IDs assigned to post. $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) ); // separator between links $separator = ', '; $categories = get_the_category(); $parentid = $categories[0]->category_parent; if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) { $term_ids = implode( ',' , $post_terms ); $terms = wp_list_categories( 'title_li=&style=none&echo=0&child_of=' . $parentid . '&taxonomy=' . $taxonomy . '&include=' . $term_ids ); $terms = rtrim( trim( str_replace( '<br />', $separator, $terms ) ), $separator ); // display post categories echo $terms; } ?>