Страница списка пользовательской таксономии?

30 янв. 2011 г., 06:09:56
Просмотры: 17.3K
Голосов: 12

Я работаю над сайтом ресторана и создал пользовательский тип записи для блюд:

$args = array(
    'labels'=> $labels,
    'public'=> true,
    'publicly_queryable'=>true,
    'show_ui'=>true,
    'show_in_nav_menus'=>true,
    'query_var'=>'dish',
    'rewrite'=>true,
    'capability_type'=>'post',
    'hierarchicial'=>false,
    'menu_position'=>5,
    'supports'=>array(
        'title',
        'editor',
        'thumbnail',
        'excerpt',
        'custom-fields',
        'revisions'
    )   
);  

register_post_type('dish', $args);

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

register_taxonomy('Main Ingredient', array('dish'), array(
    'hierarchical' => true,
    'label' => 'Основной ингредиент',
    'singular_label' => 'Основной ингредиент',
    'query_var'=>true,
    'rewrite' => true)
);

Пользовательские таксономии корректно работают в админке, и я могу перейти по адресу myurl.com/main-ingredient/pork и увидеть список всех блюд с содержанием свинины.

Я хочу, чтобы при переходе на myurl.com/main-ingredient отображался список всех возможных значений основного ингредиента.

Я нашел эту ссылку, где описано именно то, что я пытаюсь сделать.

Но решение не работает для меня - я все равно получаю 404 ошибку при переходе на myurl.com/main-ingredient

Есть предложения, как лучше это реализовать?

0
Все ответы на вопрос 1
12
20

В WordPress нет встроенной функциональности для создания "индексной" страницы таксономии, как подразумевается в вашем вопросе (и я согласен, такая возможность должна быть! Но её нет.)

Вместо этого вам придется использовать обходное решение, и один из способов — создать страницу с названием "Основной ингредиент" и URL-слагом main-ingredient, а затем назначить ей шаблон страницы для вашей темы, который вам нужно создать (возможно) с названием "Список основных ингредиентов":

Скриншот, показывающий, как установить шаблон страницы в WordPress
(источник: mikeschinkel.com)

Вот отправная точка; можно использовать имя файла page-main-ingredient-list.php для вашего шаблона страницы:

<?php
/*
Template Name: Список основных ингредиентов
*/
get_header();
$main_ingredients = get_terms('main-ingredient');
foreach($main_ingredients as $main_ingredient) {
  $dishes = new WP_Query(array(
    'post_type' => 'dish',
    'post_per_page'=>-1,
    'taxonomy'=>'main-ingredient',
    'term' => $main_ingredient->slug,
  ));
  $link = get_term_link(intval($main_ingredient->term_id),'main-ingredient');
  echo "<h2><a href=\"{$link}\">{$main_ingredient->name}</a></h2>";
  echo '<ul>';
  while ( $dishes->have_posts() ) {
    $dishes->the_post();
    $link = get_permalink($post->ID);
    $title = get_the_title();
    echo "<li><a href=\"{$link}\">{$title}</a></li>";
  }
  echo '</ul>';
}
get_footer();

А вот как выглядит страница с тестовыми данными на моём сайте:

Скриншот индексной страницы таксономии для сайта на WordPress

30 янв. 2011 г. 06:58:10
Комментарии

Привет, Майк, да, я это сделал. Это не помогло.

User User
30 янв. 2011 г. 07:25:36

@Джош - Я добавил этот код в файл functions.php своей темы, затем перешел по адресу http://wp30.dev/main-ingredient/chicken/ (wp30.dev - мой локальный тестовый сайт) и получил этот скриншот. Так что если у тебя не работает, значит у тебя есть какой-то плагин или другой код, который мешает его работе.

MikeSchinkel MikeSchinkel
30 янв. 2011 г. 07:34:12

Спасибо за ответ, Майк. У меня это работает, но это не решает мою проблему. Я пытаюсь получить список основных ингредиентов, переходя на верхний уровень таксономии. Другими словами, если убрать "chicken" из URL, должно появляться сообщение 404. Вот с какой проблемой я столкнулся.

User User
30 янв. 2011 г. 07:48:50

@Josh - Хорошо, теперь я это вижу. Извини, сегодня я ответил на слишком много вопросов. Кстати, в WordPress нет "встроенного" способа обработать то, о чем ты спрашиваешь. Было бы логично, если бы это было там автоматически, но сейчас этого нет. Я напишу обновление с обходным решением.

MikeSchinkel MikeSchinkel
30 янв. 2011 г. 07:53:17

Отлично, спасибо - с нетерпением жду, когда смогу поставить это дело позади. ;-)

User User
30 янв. 2011 г. 08:12:37

@Josh - Думаю, мой обновленный ответ будет для тебя более понятным.

MikeSchinkel MikeSchinkel
30 янв. 2011 г. 08:31:12

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

Надеюсь, WP скоро добавит функционал индексации таксономий.

User User
30 янв. 2011 г. 08:52:32

@Josh - "но мне не хочется терять встроенную функциональность просмотра записей и навигации через термины таксономии": Наверное, я что-то упускаю, потому что не понимаю, что именно ты теряешь с этим подходом?

MikeSchinkel MikeSchinkel
30 янв. 2011 г. 09:04:07

@Jan - Готово. :)

t31os t31os
1 мар. 2011 г. 12:53:56

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

aendra aendra
10 апр. 2011 г. 20:16:52

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

MikeSchinkel MikeSchinkel
15 апр. 2011 г. 14:33:21

Хочу обратить внимание, что автор вопроса использует недопустимое имя для функции register_taxonomy — название таксономии должно быть в нижнем регистре и без пробелов, согласно документации: "Название таксономии. Должно быть в виде слага (не должно содержать заглавных букв или пробелов)". Вопрос старый, но это важно учитывать, если вы используете советы и код из этого вопроса в своих проектах.

Dwayne Charrington Dwayne Charrington
8 мая 2012 г. 06:22:48
Показать остальные 7 комментариев