Шаблон архива для терминов таксономии

7 дек. 2012 г., 20:57:46
Просмотры: 21K
Голосов: 3

У меня зарегистрирован произвольный тип записи [equipment] и таксономия [equipment_type], внутри которой есть родительские и дочерние категории. Например:

Equipment (Произвольный тип записи)

Equipment Types (Таксономия)

Cameras (Родительский термин)

  • Camera A (Дочерний термин)

  • Camera B

Я хочу создать страницу архива для терминов таксономии. Чтобы при выборе 'Cameras' или 'Camera A' отображалось, например, 12 записей с заголовком и миниатюрой (ссылки на отдельную запись), а также пагинация.

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

В настоящее время у меня настроен шаблон taxonomy-equipment_types.php для обработки запроса.

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

Пожалуйста, объясните, что вы подразумеваете под Таксономией Категории. Ваш вопрос объединяет понятия таксономии и категории (которая является одним из типов таксономии). Вы имеете в виду, что у вас есть иерархические термины для вашей пользовательской таксономии equipment_type? Также, является ли cameras термином для таксономии equipment_type?

Chip Bennett Chip Bennett
7 дек. 2012 г. 21:00:50

Приношу извинения, возможно, я путаю терминологию. У меня есть таксономия 'equipment_type', и внутри неё находятся 'cameras', 'lenses' и т.д. — это термины?

Они иерархические и ведут себя так же, как категории для записей в стандартной настройке WordPress.

user1833715 user1833715
7 дек. 2012 г. 21:07:36

А, теперь вы поняли! cameras, lenses, camera-a и camera-b — это термины таксономии equipment_type. Термины camera-a и camera-b являются дочерними для термина cameras.

Chip Bennett Chip Bennett
7 дек. 2012 г. 21:45:05
Все ответы на вопрос 3
0

Я хочу задокументировать это, так как недавно нашел ответ.

Проблема с таксономиями заключается в том, что большинство разработчиков ожидают увидеть таксономию внутри URL-адреса post_type в формате:

http://hostname/post_type/taxonomy_term

Однако на самом деле URL будет выглядеть так:

http://hostname/taxonomy_slug/taxonomy_term

Это означает, что мы часто можем создавать шаблон правильно, например:

taxonomy-taxonomy_slug-taxonomy_term.php

Но правильный способ его использования — ожидать его внутри URL-адреса:

http://hostname/taxonomy_slug/taxonomy_term

Чтобы увидеть правильный URL для таксономии, мы можем использовать:

get_the_term_list($post->ID,'taxonomy_slug')

И проверить, куда именно ведет ссылка.

24 июл. 2013 г. 04:31:35
1

Иерархия шаблонов WordPress предоставляет точный файл шаблона, который вам нужен: taxonomy-{taxonomy}-{term}.php.

Таким образом, чтобы создать пользовательский шаблон для термина cameras таксономии equipment_types, вам нужно создать файл с именем taxonomy-equipment_types-cameras.php.

(Примечание: вы также можете создать файл шаблона для самой таксономии; просто опустите слаг {term}: taxonomy-{taxonomy}.php, или taxonomy-equipment_types.php в вашем случае.)

Вы можете условно выводить контент на основе иерархии, запрашивая либо родительский термин через свойства объекта, возвращаемые функцией get_term(), либо дочерние термины через get_term_children().

8 дек. 2012 г. 14:39:54
Комментарии

Спасибо, Chip, я думал, что шаблон WP предоставляет то, что мне нужно, как вы предложили: taxonomy-equipment_types.php

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

Вы предлагаете использовать 'get_term()' для определения, какой контент/записи должны выводиться в цикле?

Я довольно новичок в PHP и сейчас учусь через Lynda.com. Так что мне нужно немного углубиться и попытаться понять процесс.

Не могли бы вы привести примерный пример, чтобы помочь мне понять, что нужно сделать?

user1833715 user1833715
8 дек. 2012 г. 15:10:52
0

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

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

(изначально из этого поста с помощью GhostToast)

<?php get_header(); ?>
  <div id="content">
<div id="main">

  <ul>

<? // Начало запроса архивов терминов таксономий
$post_type = get_post_type(); // получаем название CPT
$taxonomies = get_object_taxonomies($post_type); // Находим таксономии
if($taxonomies){
foreach($taxonomies as $taxonomy){
// нужны только иерархические - без тегов
if(is_taxonomy_hierarchical($taxonomy)){

    $terms = get_terms($taxonomy, array(
'orderby'       => 'name', 
'order'         => 'Asc',
'hide_empty'    => true )); 

 foreach ( $terms as $term ) {  


// пример вывода ниже ?>

<li>

 <h1><a href="<?php echo get_term_link($term->slug, $taxonomy); ?> "><? echo $term->name; ?></a></h1>

   <div class="imgBox">

     <a href="<?php echo get_term_link($term->slug, $taxonomy); ?> " title="<? echo $term->name; ?>" >
     <img src="<?php echo get_template_directory_uri(); ?>/timthumb.php?src=/library/images/dingy-placeholder.png&amp;h=196&amp;w=285&amp;zc=1" alt="<?php the_title(); ?>" /></a>
   </div>

           <div class="the-excerpt">
            <a href="<?php echo get_term_link($term->slug, $taxonomy); ?> "><? echo $term->description; // это можно добавить в админке ?> - нажмите для подробностей</a>
            </div>
 </li>
        <?  

   }
 }
}
}?>

     </ul>


<?php wp_reset_query(); ?>

     </div> <!-- конец #main -->
   </div> <!-- конец #content -->

 <?php get_footer(); ?>

Сохраните приведенный выше код в файле с названием типа archive-mycpt.php, затем в archive.php добавьте после вызова header следующее:

<?php get_header(); ?>

<?php  // это один из наших CPT? Если да, перенаправляем на кастомную страницу архива 
  if ( is_custom_post_type() ){ 
include (TEMPLATEPATH . '/archive-mycpt.php'); 

        // если нет, продолжаем...

    } else {  ?>

               <!-- содержимое archive.php   -->

   <? } ?>
27 июл. 2013 г. 05:13:40