register_taxonomy() — создание таксономии

Что такое таксономия? Рубрики, метки — это и есть таксономии.

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

Короче говоря, когда во время разработки сайта начинает не хватать стандартных рубрик и меток — создаём таксономии.

Функция register_taxonomy()

register_taxonomy($taxonomy, $object_type, $args);

$taxonomy
(строка) Название таксономии. Не должно содержать пробелов и заглавных букв.

$object_type
(массив/строка) Тип объекта (или объектов), для которых создаётся таксономия. По умолчанию в WordPress существуют следующие типы:

  • post
  • page
  • mediapage
  • attachment
  • revision
  • nav_menu_item

Также допускается возможность создания своего собственного объекта

$args
(массив) Список параметров.

Не хочу простым текстом перечислять все параметры, лучше перейдём к примеру и там сразу же и разберёмся.

function add_new_taxonomies() {	
/* создаем функцию с произвольным именем и вставляем 
в неё register_taxonomy() */	
	register_taxonomy('platform',
		array('post'),
		array(
			'hierarchical' => false,
			/* true - по типу рубрик, false - по типу меток, 
			по умолчанию - false */
			'labels' => array(
				/* ярлыки, нужные при создании UI, можете
				не писать ничего, тогда будут использованы
				ярлыки по умолчанию */
				'name' => 'Игровые платформы',
				'singular_name' => 'Платформа',
				'search_items' =>  'Найти платформу',
				'popular_items' => 'Популярные платформы',
				'all_items' => 'Все платформы',
				'parent_item' => null,
				'parent_item_colon' => null,
				'edit_item' => 'Редактировать платформу', 
				'update_item' => 'Обновить платформу',
				'add_new_item' => 'Добавить новую платформу',
				'new_item_name' => 'Название новой платформы',
				'separate_items_with_commas' => 'Разделяйте платформы запятыми',
				'add_or_remove_items' => 'Добавить или удалить платформу',
				'choose_from_most_used' => 'Выбрать из наиболее часто используемых платформ',
				'menu_name' => 'Платформы'
			),
			'public' => true, 
			/* каждый может использовать таксономию, либо
			только администраторы, по умолчанию - true */
			'show_in_nav_menus' => true,
			/* добавить на страницу создания меню */
			'show_ui' => true,
			/* добавить интерфейс создания и редактирования */
			'show_tagcloud' => true,
			/* нужно ли разрешить облако тегов для этой таксономии */
			'update_count_callback' => '_update_post_term_count',
			/* callback-функция для обновления счетчика $object_type */
			'query_var' => true,
			/* разрешено ли использование query_var, также можно 
			указать строку, которая будет использоваться в качестве 
			него, по умолчанию - имя таксономии */
			'rewrite' => array(
			/* настройки URL пермалинков */
				'slug' => 'platform', // ярлык
				'hierarchical' => false // разрешить вложенность
 
			),
		)
	);
}
add_action( 'init', 'add_new_taxonomies', 0 );

Короче этот код нужно вставить в functions.php, а дальше получится вот что:

1. Пункт в меню для созданной таксономии:

таксономии в меню

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

страница создания элементов таксономии

3. На странице создания записи появляется блок с выбором элементов новой таксономии, в примере — игровых платформ.

выбор элементов таксономии

Кстати, одно важно замечание, в случае, если вы использовали параметр «rewrite» для пермалинков, вам нужно перейти на страницу редактирования постоянных ссылок в настройках и просто нажать кнопку «Сохранить изменения», либо заюзать один раз flush_rules()

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

  • Миша21 марта 2012 в 08:03 #

    кстати на странице с таксономиями в админке появляется что-то типо облака популярных таксономий. Как его отключить?
    Нужно найти в коде что-то типа:

    'popular_items' => 'Популярные платформы',

    и заменить на:

    'popular_items' => NULL,
  • Timur12 сентября 2012 в 12:09 #

    Привет Миша!), помоги с вопросом..
    Возникла такая проблема: есть около 80 таксономий, после того как я все их добавил, сервер выдает такие цифры:
    до: 44 queries 0.352 seconds
    после: 206 queries 0.703 seconds
    Выяснил, что у меня каждая новая таксономия добавляет по 2 запроса. Что делать или так и должно быть?

    • Миша14 сентября 2012 в 23:09 #

      80 terms or 80 taxonomies?
      не знаю как это правильно спросить на русском надеюсь ты поймешь)

  • Олег22 октября 2013 в 17:10 #

    Добрый день, Михаил.
    Custom taxonomy - отличная вещь, но - все хорошо, за исключением: не могу нигде найти описание функции вывода связанных одной таксономией (точнее - term) на странице taxonomy.php.
    Точнее, выглядит так:
    1. Есть таксономия - actor
    По клику на фамилии актера открываем taxonomy-actor.php и любуемся его фотографией и описанием через term_description.
    Но очень хочется привязать список фильмов этого актера.
    Пересмотрел Доки wordpress.org - не могу найти похожего примера
    Тоже и через Google.
    Если есть пара минут подсказать с примером - буду благодарен.
    В качестве основы теории делал все как написано здесь -
    http://justintadlock.com/archives/2009/06/04/using-custom-taxonomies-to-create-a-movie-database
    Но вот с созданием страницы шаблона - не очень разобрался.
    Точнее, страница работает корректно, но как вывести в ней список фильмов актера? Файл taxonomy-actor.php - для всех актеров.

    • Миша26 октября 2013 в 09:10 #

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

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

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

      В итоге - заходим в админку, создаем новый фильм, а сбоку выбираем нужных актёров для этого фильма.

      Затем в плане файлов - taxonomy-actor.php - достаточно добавить обычный цикл без параметров в этот файл и всё будет выводиться как надо.

      Есть остались неясные моменты - пожалуйста, спрашивайте, буду рад помочь.

  • Олег26 октября 2013 в 18:10 #

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

  • Олег26 октября 2013 в 19:10 #

    Михаил, забыл спросить, возможно, поможете.
    У меня есть в одном файле цикл - выводит записи.
    Мне нужно в него добавить фильтр для вывода самых популярных записей.
    Популярные записи определяются плагином WP-PostViews.
    Есть такой файл - http://pastebin.com/Z6AsYpZ4
    Мне надо добавить фильтр, и как я понимаю, в строке 8.
    Что-то типа:
    $post_query = 'cat='.$carousel_cat_id.'&posts_per_page=10&meta_key=views&meta_value=???';
    Я нигде не могу найти, как правильно написать значение meta_value для отображения списка записей, у которых - больше 10 просмотров?
    У плагина WP-PostViews (автор - http://lesterchan.net/site/donation/ ) есть два поля:
    meta_key - views
    meta_value - число
    Можете подсказать?
    Буду очень благодарен)

  • Евгений22 июля 2014 в 18:07 #

    Привет! У меня вопрос такой...
    Вот я создал свою таксономию "Блаблабла" с иерархичностью как категорий...
    В ней я создал например элемент "Тутуту" с ярлыком "tututu"...
    Создаю запись, выбираю там у записи этот самый элемент "Тутуту" в качестве "какбы" категории (таксономии)...
    Теперь я хочу вывести в шаблоне ярлык этого элемента для записи))
    То есть чтобы например у записи можно было вывести например под заголовком "tututu"...
    Нифига не могу разобраться как вывести slug моего элемента

  • Евгений5 августа 2014 в 16:08 #

    Можно ли создать таксономию без slug? Чтобы запись имела адрес сайт/запись?
    И если уже существует таксономия с slug, как ее убрать? Сначала убрать ее в коде, а потом заменить адреса в базе данных?

    • Миша5 августа 2014 в 17:08 #

      Можно ли создать таксономию без slug? Чтобы запись имела адрес сайт/запись?

      точно не помню, попробуте поэкспериментировать с параметрами rewrite (а в нем slug, hierarchical, with_front).

      И если уже существует таксономия с slug, как ее убрать? Сначала убрать ее в коде, а потом заменить адреса в базе данных?

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

      • Евгений5 августа 2014 в 18:08 #

        Спасибо! По сути ведь изначальная таксономия wp не имеет slug приставки, видимо можно создавать таксономии без дополнительных слов в адресе.

  • Павел14 октября 2014 в 00:10 #

    Михаил, здравствуйте!
    Подскажите пожалуйста, как сделать так, чтобы у всех новых юзеров, в редакторе, созданная таксономия по умолчанию была скрыта? Сразу не отображалась, а только кому надо тот и включает её отображение поставив флажок в настройках?
    Очень буду благодарен!

  • Дмитрий13 января 2015 в 20:01 #

    Михаил, здравствуйте. Сильно ли нагружает использование Пользовательской таксономии? Слышал, что нагрузку создает приличную, что скажите по этому поводу?

    • Миша14 января 2015 в 09:01 #

      Здравствуйте!
      Если вы не будете создавать сотни таксономий (имеется ввиду не элементов таксономий), то всё будет ок.

  • Виталий13 марта 2015 в 16:03 #

    Добрый день!
    Создал пользовательскую таксономию, но никак не могу вывести свой title для категорий этой таксономии. У меня стоит связка All in One Seo Pack + Category Seo Meta Tags (для тэгов), в обычных рубриках title прописывается нормально, а для пользовательской таксономии не хочет, хотя поля в админке для них есть и они заполнены.
    Может вы в курсе, как это исправить?

    • Миша14 марта 2015 в 16:03 #

      Добрый день!
      Думаю тут нужно проверить файлы, которые отвечают за вывод страниц этой таксономии + header.php.

  • SaW20 мая 2015 в 21:05 #

    Можно сделать, чтобы страница таксономии была 2-го уровня вложености? (сейчас 3-го site/tax_name/tax_value)

  • Никита24 мая 2015 в 09:05 #

    В labels не хватает 'not_found' ( Default is __( 'No tags found.' ) or __( 'No categories found.' ) )

  • Егор21 августа 2015 в 04:08 #

    Здравствуйте, Михаил. У меня задачка. Нужно вывести к каждому анонсу цену за квартиру и площадь. И что-бы админ уже устанавливал сам из админки при публикации. Вот не нашел ничего кроме как применить таксономии :) Но как можно просто вывести в публикации эти два поля? Не создавая таксономий?

  • Егор21 августа 2015 в 10:08 #

    Точно, а я туплю.

  • Андрей5 октября 2015 в 17:10 #

    Здравствуйте, Михаил. Помогите решить такую проблему. Есть таксономия объект недвижимости(slug -> properties). Эти объекты разделены на разделы: квартиры, дома и тд. Есть ещё два раздела продажа и аренда. При показе объявлений wordpress пишет ссылку до объявления properties/ имя объявления. Подскажите как мне сделать через wordpress или htaccess ссылки вида prodazha/kvartiri/ имя объявления. Заранее спасибо

  • виктор8 ноября 2015 в 11:11 #

    спасибо за статью. очень помогла... Особенно совет "Кстати, одно важно замечание, в случае, если вы использовали параметр «rewrite» для пермалинков, вам нужно перейти на страницу редактирования постоянных ссылок в настройках и просто нажать кнопку «Сохранить изменения», либо заюзать один раз flush_rules()". вроди все сделал правильно, а список по таксамонии неотображалось, но нажав кнопку «Сохранить изменения» и все стало на круги своя.

  • Роман13 января 2016 в 22:01 #

    cоздал таксономию country
    cоздал в папке файл taxonomy-country.php
    а страница детальная термина белая (
    что делать?

    • Миша14 января 2016 в 05:01 #

      Просто белая или 404?

      Настройки постоянных ссылок обновили?

      В файле taxonomy-country.php попробуйте вставить какой-нибудь очень простой код, например echo 'привет'; и посмотрите, не заработает ли.

  • Артем6 января 2017 в 11:01 #

    Михаил, привет! С праздниками!
    Вопрос такой: как можно сделать терм по умолчанию для произвольной таксономии или присваивать любой терм при создании произвольного поста?

    • Миша7 января 2017 в 07:01 #

      Добрый день! С Праздниками!

      Хороший вопрос! Первое, что приходит в голову - через JavaScript в админке, либо через хук save_post - проверять, если никакой термин посту не присвоен, то присваивать тот, что должен быть по умолчанию (второй вариант наверное более правильный с точки зрения WordPress).

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • alex morozov: Добрый вечер! у меня возникла следующая проблема. Я делаю фотоальбомы, чтобы они выглядели "как в контакте". Так вот, та...

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

  • Миша: Либо размеры изображений вам помогут, либо CSS. И строку 14 гляньте, там муть какая-то.

  • Vladislav: Подправил имеющийся у меня код, по вашим рекомендациям, миниатюры начали отображаться, но они стали очень огромными, что...

  • Миша: Лишь предложил решение. Думаю можно нашаманить и так, чтобы чисто для рубрик было, не уверен только, что обойдётся без и...