Таксономия в WordPress
Древообразная структура классификаций определенного набора объектов
Таксономия (taxonomy) — одно из понятий, появившихся еще во времена WordPress 2.3, но до сих пор вызывающее ужас из-за внутренней реализации.
Вообще говоря, таксономией (с математической точки зрения) называется древообразная структура классификаций определенного набора объектов. По умолчанию WordPress пердоставляет три классификации: рубрики записей (post categories), метки записей (post tags) и рубрики ссылок (link categories).
Я не случайно употребил "по умолчанию" — потому что WordPress позволяет создавать собственные таксономии.
Таксономия в WordPress реализована тремя таблицами:
- Таблица термов (
wp_terms); - Таблица таксономии термов (
wp_term_taxonomy); - Таблица отношений термов, объектов и таксономий (
wp_term_relationships).
Рассмотрим данные таблицы подробнее.
| Поле | Описание |
|---|---|
term_id |
Уникальный идентификатор терма |
name |
Имя терма |
slug |
Имя терма, пригодное для использования в URL |
term_group |
В теории используется для группирования схожих термов; на практике я этого ни разу не наблюдал |
Сами по себе термы не несут никакой смысловой нагрузки; контекст терма определяется таксономией, заданной в таблице wp_term_taxonomy.
| Поле | Описание |
|---|---|
term_taxonomy_id |
Уникальный идентификатор таксономии терма |
term_id |
Идентификатор терма, относящегося к данной таксономии (связь осуществляется по полю wp_terms.term_id) |
taxonomy |
Таксономия. Как я уже говорил выше, WordPress определяет три таксономии: рубрики записей, метки записей и рубрики категорий |
parent |
Родительский терм (а не таксономия, как полагают некоторые). Используется для поддержания иерархической связности термов внутри таксономии |
count |
Количество объектов (записей/ссылок), связанных с данной таксономией. Забегая вперёд, отмечу, что значение данного поля не равно SELECT COUNT(`object_id`) FROM `wp_term_relationships` WHERE `term_taxonomy_id` = 'ID'. Подсчёт количества объектов специфичен для каждой таксономии. Например, в случае с рубриками записей, количество объектов — это количество опубликованных записей |
| Поле | Описание |
|---|---|
object_id |
Идентификатор объекта (коим по умолчанию является либо запись, либо ссылка, в зависимости от значения поля taxonomy в таблице wp_term_taxonomy), относящегося к данной таксономии |
term_taxonomy_id |
Идентификатор таксономии терма, относящейся к данному объекту (связь осуществляется по полю wp_term_taxonomy.term_taxonomy_id) |
term_order |
Используется для сортировки |
Как я уже говорил (а repetitio est mater studiorum
), WordPress предоставляет три таксономии. Ниже приведены краткие характеристики каждой из них.
| Таксономия | Объект | Иерархичность |
|---|---|---|
category (рубрика) |
Запись | Да (рубрики могут быть вложенными) |
post_tag (метка записи) |
Запись | Нет |
link_category (рубрика ссылок) |
Ссылка | Нет |
Рекомендую к прочтению:
Связанные записи
Автор: Vladimir; опубликовано в: WordPress; метки: WordPress, таксономияСен
2008


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.






[...] что связано с таксономией, авторами, датой и временем (в эту группу относятся [...]
[...] Технически проблема заключается в том, что WordPress не обновляет поле count таблицы таксономий термов. [...]
[...] реализация управления таксономиями в WordPress — это просто кошмар какой-то. Мало того, что код [...]
да, чет сложно это у вас както. упростили бы половину.
Здравствуйте, Владимир.
Спасибо за полезный материал.
Взгляните, пожалуйста, на сайт
http://ferrum.spb.ruНе правильно работают метки.
Может быть что-то с get_tag_link?
Очень жду Ваших комментариев.
Спасибо
Оксана,
get_tag_link()нормально отрабатывает, так как ссылки генерируются корректные (http://ferrum.spb.ru/tag/prodvizhenie-sajtov/),а проблема в том, что выдаётся не то, что надо.Вариантов несколько:
category.phpвtag.php, так как, судя по всему, у Вас для отображения тэгов берётся шаблонindex.php, а в нёмThe Loopотсутствует).Лично я склоняюсь к третьему варианту.
Благодарю.
Действительно, третий вариант.
Все работает.
Разбираюсь с таксономией, не могу сообразить как сделать такое:
адрес /tag/music
узнать какие категории ипользуют посты с этим тегом
сгрппировать посты по категориям и вывести на /tag/music
что то с этой таксономией не пойму как запрос составить. Спасибо
Ну если решать задачу средствами MySQL, то так:
FROM wp_term_taxonomy AS tt
INNER JOIN wp_terms AS t USING(term_id)
INNER JOIN wp_term_relationships AS tr USING(term_taxonomy_id)
WHERE
tt.taxonomy = 'category'
AND tr.object_id IN (
SELECT DISTINCT object_id
FROM wp_term_taxonomy AS tt
INNER JOIN wp_terms AS t USING(term_id)
INNER JOIN wp_term_relationships AS tr USING(term_taxonomy_id)
WHERE
tt.taxonomy = 'post_tag'
AND t.slug = 'music'
)
GROUP BY tr.object_id
ORDER BY NULL
t.term_id— ID категории;t.name— имя категории;t.slug— slug категории;tr.object_id— ID записи из таблицыwp_posts.вот спасибо, я сделал уже так:
в файле archive.php в loop собираю все посты в массив, группирую как нужно, и вывожу каждую группу через loop
ps. забыл сказать, если пост идет в подкатегории, нужно поместить его в группу top-level этой категориии, наверно одним mysql все равно такое не решить
Не могу сделать универсальный код чтобы wordpress выдавал количество постов в рубрике (/category/рубрика), в таге (/tag/метка) и поиске (/?s=слово).
За основу брал вот такой код:
SELECT COUNT(*)
FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE
$wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->term_taxonomy.term_id = '$cat'
AND post_type = 'post'
AND post_status = 'publish'
");
он только выводит количество записей в рубрике, а по остальным показателям выдает 0.
<?php global $wp_query; echo $wp_query->found_posts; ?>Ваш запрос работает исключительно с категориями — Вы сами прописали условие
$wpdb->term_taxonomy.taxonomy = 'category'Александр, я Вам отправил письмо по поводу меток в WordPress. Если Вы его не получили, отпишитесь, пожалуйста.
Владимир, большое спасибо! Я письмо получил, но еще не попробовал. На следующей неделе поэкспериментирую.
Владимир При нажаитии на “Выберите из наиболее популярных меток..” появляется надпись “Неверная таксономия” (скриншот
http://floomby.ru/content/hbB9zqamKE/) WP 2.9.1 в чём проблема? на этом же хостинге есть еще один блог версия вордпреса таже, там всё работает. Дело не в теме, менял на дефолтную, проблема сохранилась. Помогите где искать, хотя быАбсолютно без понятия. Попробуйте отключить все плагины и попробовать на голом WordPress. Если получится — проблема в каком-то плагине. Если нет, то тогда нужно смотреть на запросы, которые идут на сервер.
Проблема в том что на обоих блогах стоят абсолютно идентичные плагины. Хотя сейчас попробую отключить все и посмотреть запросы
Кстати не подскажите какой скрипт отвечает за метки?
wp-includes/taxonomy.php