Что такое таксономия? Рубрики, метки — это и есть таксономии.
То есть получается, что использовав упомянутую функцию, можно создать абсолютно независимые «рубрики» (или «метки»), с отдельным интерфейсом.
Короче говоря, когда во время разработки сайта начинает не хватать стандартных рубрик и меток — создаём таксономии.
register_taxonomy( $taxonomy, $object_type, $args );
Также рекомендую вам свой видеокурс по натяжке готовой вёрстки на WordPress.
Функцию нужно использовать на хуке init
, примерно так же, как и функцию register_post_type(). Пример использования:
add_action( 'init', 'true_register_taxonomy' ); function true_register_taxonomy() { $args = array( 'labels' => array( 'menu_name' => 'Направления' ), 'public' => true, ); register_taxonomy( 'destination', 'misha_aviatickets', $args ); }
После того, как вы вставили этот код, интерфейс таксономии появится под типами записей, к которым вы её прикрепили.
На что обратить внимание при создании таксономии?
register_taxonomy()
– это название (ярлык) таксономии $taxonomy
, который должен быть не более 32 символов, ну и не забывайте, что не все символы там можно использовать, рекомендую только строчные символы, числа, _
или -
: a-z0-9_-
.array( 'post', 'page' )
. Кроме того, если вы регистрируете таксономию к типу записи, который зарегистрирован через другой плагин или тему, то рекомендуется использовать функцию register_taxonomy_for_object_type() для создания ассоциаций.labels[ 'name' ]
.Ниже – пример заполнения массива $labels
, единственное только не забывайте про локализацию.
$args = array( 'labels' => array( 'name' => 'Направления', // основное название во множественном числе 'singular_name' => 'Направление', // название единичного элемента таксономии 'menu_name' => 'Направления', // Название в меню. По умолчанию: name. 'all_items' => 'Все направления', 'edit_item' => 'Изменить направление', 'view_item' => 'Просмотр направления', // текст кнопки просмотра записи на сайте (если поддерживается типом) 'update_item' => 'Обновить направление', 'add_new_item' => 'Добавить новое направление', 'new_item_name' => 'Название нового направления', 'parent_item' => 'Родительское направление', // только для таксономий с иерархией 'parent_item_colon' => 'Родительское направление:', 'search_items' => 'Искать направления', 'popular_items' => 'Популярные направления', // для таксономий без иерархий 'separate_items_with_commas' => 'Разделяйте направления запятыми', 'add_or_remove_items' => 'Добавить или удалить направления', 'choose_from_most_used' => 'Выбрать из часто используемых направлений', 'not_found' => 'Направлений не найдено', 'back_to_items' => '← Назад к направлениям', ) )
false
.public | false | true |
---|---|---|
show_ui | false | true |
publicly_queryable | false | true |
show_in_nav_menus | false | true |
Иными словами:
$args = array( 'public' => true, // 'show_ui' => true, // 'publicly_queryable' => true, // 'show_in_nav_menus' => true, );
Подробнее о параметрах – ниже.
public
.public
.public
.true
— подпункты в меню будут добавлены к типам записей, ассоциированных с данной таксономией,false
— хоть интерфейс для таксономий и будет доступен по прямой ссылке в админке, в меню он не появится,show_ui
.
show_ui
.show_ui
.post_categories_meta_box()
в файле meta-boxes.php, для меток и других таксономий без иерархии – функция post_tags_meta_box()
. Метабокс не будет отображаться, если вы укажете значение параметра равным false
.false
.Кстати, про создание этих колонок под любую задачу у меня на сайте есть отдельный урок.
false
.false
, то правила для постоянных ссылок создаваться не будут. Передайте true
, тогда в качестве ярлыка в URL будет использоваться название таксономии misha.blog/destination/bali/
.
jfk123
, то урл примет вид misha.blog/jfk123/bali/
$wp_rewite->front
(по умолчанию — true
). Подробнее этот параметр разбирался тут на видео.misha.blog/destination/indonesia/bali/
.new WP_Query( array( 'destination' => $term_name ) )
, кроме того, оно используется в урлах /?destination=$term_name
. Если вы вдруг захотите установить этот параметр в значение false
, то вы отключите вышеперечисленные конструкции, однако у вас по-прежнему будут работать запросы вида WP_Query( array( 'taxonomy'=>'destination', 'term'=>$term_name) )
.false
.array( 'name' => 'Бали', 'slug' => 'bali' )
. Также можно передать и элемент массива description
в качестве описания элемента таксономии.term_order
, которая при указании этого параметра в значении по умолчанию false
будет содержать только нулевые значения.Давайте рассмотрим на примере нашей таксономии – допустим мы хотим создать для неё свои собственные права.
$args = array( 'capabilities' => array( 'manage_terms' => 'manage_destination', 'edit_terms' => 'edit_destination', 'delete_terms' => 'delete_destination', 'assign_terms' => 'assign_destination', ) );
После того, как вы это сделали, вам нужно разметить эти новые права, например:
$admins = get_role( 'administrator' ); $admins->add_cap( 'manage_destination' ); $admins->add_cap( 'edit_destination' ); $admins->add_cap( 'delete_destination' ); $admins->add_cap( 'assign_destination' );
Разметить можно ещё и при помощи плагина кстати.
Более подробно обо всём этом процессе можете почитать тут (там ещё и видео есть).
Также рекомендую свой видеокурс по созданию темы WordPress на основе готовой вёрстки.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
кстати на странице с таксономиями в админке появляется что-то типо облака популярных таксономий. Как его отключить?
Нужно найти в коде что-то типа:
и заменить на:
Привет Миша!), помоги с вопросом..
Возникла такая проблема: есть около 80 таксономий, после того как я все их добавил, сервер выдает такие цифры:
до: 44 queries 0.352 seconds
после: 206 queries 0.703 seconds
Выяснил, что у меня каждая новая таксономия добавляет по 2 запроса. Что делать или так и должно быть?
80 terms or 80 taxonomies?
не знаю как это правильно спросить на русском надеюсь ты поймешь)
Добрый день, Михаил.
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 - для всех актеров.
Доброго времени суток,
во-первых хочу извиниться за долгий ответ, несколько дней не имел доступа в инет.
итак,
есть таксономия актёров - actor, у таксономий актёров полюбому должен быть привязанный тип поста, в данном случае я так понимаю это должен быть - фильм.
То есть создаем тип поста фильм и привязываем к созданной таксономии актёров.
В итоге - заходим в админку, создаем новый фильм, а сбоку выбираем нужных актёров для этого фильма.
Затем в плане файлов -
taxonomy-actor.php
- достаточно добавить обычный цикл без параметров в этот файл и всё будет выводиться как надо.Есть остались неясные моменты - пожалуйста, спрашивайте, буду рад помочь.
Михаил, иногда долгое молчание помогает разобраться самостоятельно)))
Просто сразу не сообразил, что для вывода всех записей конкретного актера можно использовать стандартный цикл.
Все равно, спасибо за ваш ответ.
Михаил, забыл спросить, возможно, поможете.
У меня есть в одном файле цикл - выводит записи.
Мне нужно в него добавить фильтр для вывода самых популярных записей.
Популярные записи определяются плагином 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 - число
Можете подсказать?
Буду очень благодарен)
да, вместо
meta_value
написатьmeta_value_num
, должно помочь) подробности здесь: https://misha.agency/wordpress/wp_query.htmlПривет! У меня вопрос такой...
Вот я создал свою таксономию "Блаблабла" с иерархичностью как категорий...
В ней я создал например элемент "Тутуту" с ярлыком "tututu"...
Создаю запись, выбираю там у записи этот самый элемент "Тутуту" в качестве "какбы" категории (таксономии)...
Теперь я хочу вывести в шаблоне ярлык этого элемента для записи))
То есть чтобы например у записи можно было вывести например под заголовком "tututu"...
Нифига не могу разобраться как вывести slug моего элемента
Привет!
Если я всё правильно понял, то:
Подробнее про эту функцию тут.
Можно ли создать таксономию без slug? Чтобы запись имела адрес сайт/запись?
И если уже существует таксономия с slug, как ее убрать? Сначала убрать ее в коде, а потом заменить адреса в базе данных?
точно не помню, попробуте поэкспериментировать с параметрами rewrite (а в нем slug, hierarchical, with_front).
В базе ничего менять не надо будет - достаточно перейти в настройки постоянных ссылок в админке и нажать кнопку сохранения.
Спасибо! По сути ведь изначальная таксономия wp не имеет slug приставки, видимо можно создавать таксономии без дополнительных слов в адресе.
Михаил, здравствуйте!
Подскажите пожалуйста, как сделать так, чтобы у всех новых юзеров, в редакторе, созданная таксономия по умолчанию была скрыта? Сразу не отображалась, а только кому надо тот и включает её отображение поставив флажок в настройках?
Очень буду благодарен!
Здравствуйте!
Увы, не знаю решения :)
Михаил, здравствуйте. Сильно ли нагружает использование Пользовательской таксономии? Слышал, что нагрузку создает приличную, что скажите по этому поводу?
Здравствуйте!
Если вы не будете создавать сотни таксономий (имеется ввиду не элементов таксономий), то всё будет ок.
Добрый день!
Создал пользовательскую таксономию, но никак не могу вывести свой title для категорий этой таксономии. У меня стоит связка All in One Seo Pack + Category Seo Meta Tags (для тэгов), в обычных рубриках title прописывается нормально, а для пользовательской таксономии не хочет, хотя поля в админке для них есть и они заполнены.
Может вы в курсе, как это исправить?
Добрый день!
Думаю тут нужно проверить файлы, которые отвечают за вывод страниц этой таксономии + header.php.
Можно сделать, чтобы страница таксономии была 2-го уровня вложености? (сейчас 3-го site/tax_name/tax_value)
Об этом в новом посту, который выйдет в свет послезавтра.
В labels не хватает 'not_found' ( Default is __( 'No tags found.' ) or __( 'No categories found.' ) )
Здравствуйте, Михаил. У меня задачка. Нужно вывести к каждому анонсу цену за квартиру и площадь. И что-бы админ уже устанавливал сам из админки при публикации. Вот не нашел ничего кроме как применить таксономии :) Но как можно просто вывести в публикации эти два поля? Не создавая таксономий?
Здравствуйте!
При помощи метабоксов, если я правильно понял задачу)
Точно, а я туплю.
Здравствуйте, Михаил. Помогите решить такую проблему. Есть таксономия объект недвижимости(slug -> properties). Эти объекты разделены на разделы: квартиры, дома и тд. Есть ещё два раздела продажа и аренда. При показе объявлений wordpress пишет ссылку до объявления properties/ имя объявления. Подскажите как мне сделать через wordpress или htaccess ссылки вида prodazha/kvartiri/ имя объявления. Заранее спасибо
Здравствуйте!
А вы пробовали указать в параметре rewrite slug?
спасибо за статью. очень помогла... Особенно совет "Кстати, одно важно замечание, в случае, если вы использовали параметр «rewrite» для пермалинков, вам нужно перейти на страницу редактирования постоянных ссылок в настройках и просто нажать кнопку «Сохранить изменения», либо заюзать один раз flush_rules()". вроди все сделал правильно, а список по таксамонии неотображалось, но нажав кнопку «Сохранить изменения» и все стало на круги своя.
cоздал таксономию country
cоздал в папке файл taxonomy-country.php
а страница детальная термина белая (
что делать?
Просто белая или 404?
Настройки постоянных ссылок обновили?
В файле
taxonomy-country.php
попробуйте вставить какой-нибудь очень простой код, напримерecho 'привет';
и посмотрите, не заработает ли.настройки нет
а что там надо менять?
не заработало
Просто зайдите туда и сохраните без изменений.
Отлично, страница создалась
Скопировал шаблон страницы - echo выводил текст
а если код php другого шаблона то пусто
Значит код не подходит для этого файла :)
Михаил, привет! С праздниками!
Вопрос такой: как можно сделать терм по умолчанию для произвольной таксономии или присваивать любой терм при создании произвольного поста?
Добрый день! С Праздниками!
Хороший вопрос! Первое, что приходит в голову - через JavaScript в админке, либо через хук
save_post
- проверять, если никакой термин посту не присвоен, то присваивать тот, что должен быть по умолчанию (второй вариант наверное более правильный с точки зрения WordPress).Вот про сей хук я запамятовал)) Спасибо!
Подскажите у меня на странице создания записи не появляется блок с выбором элементов новой таксономии в чём может быть проблема не могу понять.
Ого, какая-то жесть, никто из моих знакомых с таким не сталкивался!
Я использовал ваш пример на базовой теме WP и на стартовой underscores
1. Пункт в меню создаётся
2. Страница схожая со страницей создание меток/рубрик создаётся
3. На странице создания записи не появляется блок :(((
Устанавливал wordpress-5.3.2-ru_RU на Open Server
При register_post_type() создании нового типа записи все 3 пункта выводятся но этот вариант мне не подходит
Игровые платформы - PlayStation как эту taxonomy прописать в посте
Привет, у меня такая проблема, создал таксономию, всё работает, только мне надо убрать поле выбора терминов в редакторе, потому что там я вывожу это поле через кастомные поля, а в меню админки оставить, но так у меня не получается оно или убирается везде или нигде не убирается
Привет,
Могу предложить попробовать такой способ.
А если есть кастомный тип записи:
/testimonials/
Я создал ему кастомные таксономии и назвал их:
/mark/
Как сделать чтобы ссылка где будут все посты данной таксономии была не:
/mark/znachenie
А следующего вида:
/testimonials/mark/znachenie
Прочекайте этот урок, там очень похожая ситуация описана
Здравствуйте, Михаил! Помогите пожалуйста решить проблему:
- Создал custom post type как у вас в уроке "Авиабилеты" (misha_aviatickets). \
- После этого зарегистрировал таксономию (register_taxonomy( 'destination', 'misha_aviatickets', $args )). Добавил направления, чтоб было понятней, как у вас - Англия, Индонезия (по сути категории).
Всё работает.
- Далее добавляем пост в авиабилетах (bilet1) - данный пост доступен по адресу site.ru/misha_aviatickets/bilet1/ а категория к которой он относится - site.ru/destination/angliya/
Проблема в том, что никак не могу привести url к виду - site.ru/destination/angliya/bilet1.
Подскажите пожалуйста, как решить проблему?
Добрый день, Сергей,
в предыдущем комментрии :)
Спасибо за быстрый ответ! Я первым делом попробовал этот вариант, но что-то не так делаю наверное, не выходит. Попробую более внимательно :-), Спасибо!
Михаил, попробовал, почти всё работает)) Почти)) Но появляются 2 проблемы:
1. Вылазит ошибка: Undefined array key "attachment"
2. Струтктура ссылок на сайте /%category%/%postname%/, а работает всё только если установить в настройках структуру /%postname%/ (очень важно чтоб на всё сайте было /%category%/%postname%/)
Подскажите, как можно это решить?....
Код с CPT, регистрации таксономии и изменением структуры URL
Пункт 1 скорее всего тоже вытекает из пункта 2. Там придётся переназвать параметры в коде, сходу не смогу подсказать какие, нужно тестировать непосредственно на сайте, увы.
ошибка из первого пункта появляется независимо от второго пункта. В настройках оставляю только %postname%/ и всё равно ошибка Undefined array key "attachment".
Михаил, может у вас есть такая платная услуга - разобраться с этой проблемой?
Вы всегда можете написать через форму. Мы конечно отдаём предпочтение проектам под ключ, но если у ребят будет время, они помогут вам
Спасибо! Написал через форму
Ошибка - Undefined array key "attachment" появляется только на тестовом сайте установленном на OpenServer, может дело в этом. На двух сайтах на хостинге попробовал, нет такой ошибки.
Осталось разобраться, почему при установке в настройке урл /%category%/%postname%/, запись выдает ошибку 404
Михаил, добрый день! Спасибо за ваши статьи, они очень полезны и хотелось бы выразить вам за них огромную благодарность:)
У меня никак не получается назначить шаблон для созданной таксономии продуктов в вукомерц, что не делаю, всегда отдает 404. То есть для term у таксономии site.ru/taxonomy-name/term-name открывается страница с требуемыми товарами, тут всё в порядке. Но для страницы site.ru/taxonomy-name/ возвращает 404, хоть убей!(
Может быть вы сталкивались с таким и есть какое-то правильное с точки зрения кода решение?