Таксономия в WordPress 2.3
Таксономия (taxonomy) - новое понятие, которое появилось в WordPress 2.3. Её внедрение породило довольно серьезную проблему совместимости тех плагинов, которые использовали собственные запросы к базе данных. Прежде всего это касается рубрик. Всё дело в том, что старые таблицы рубрик больше не используются. Вместо этого нужно использовать таксономию.
Само понятие таксономии означает иерархию, упорядочивание. В принципе это тоже самое, что и рубрификация, но если раньше она была жестко завязана на записи, то теперь можно связывать и группировать любые объекты.
Помимо переделанных рубрик, «таксономически» созданы и метки. Если функции меток новы, то с рубриками приходится повозится, поскольку полностью меняются SQL-запросы.
Для таксономии в WordPress используются три таблицы. Рассмотрим их:
wp_term_taxonomy (связка терминов)
- term_taxonomy_id - (auto) - номер связки
- term_id - номер термина
- taxonomy - таксономия/тип термина (например «category»)
- description - описание таксономии
- parent - родитель
- count - количество элементов
wp_terms (определение термина)
- term_id - (auto) - номер термина/рубрики/тэга/чего угодно
- name - название термина
- slug - короткая ссылка
- term_group - группа
wp_term_relationships (объекты)
- object_id - номер объекта
- term_taxonomy_id - номер из связки терминов
Для определения таксономии используется поле «taxonomy». Например для рубрик это «category», для меток - «post_tag», для рубрик ссылок - «link_category».
У каждой таксономии можно задать описание («description») и родителя («parent»). Последний параметр позволяет задавать иерарию самих таксономий.
После того, как мы определились с таксономией, рассмотрим термины («terms»).
Я не совсем уверен в правильности перевода слова «terms».
Термином может быть название рубрики, метки - в общем что угодно. Например мы задаём метку «а» - это и есть конкретный термин. Для любого термина можно задать название (они могут повторяться), а также короткую ссылку (slug).
Короткая ссылка должна быть уникальной и это порождает определенные проблемы. Например если задать одинаковые рубрику и метку, то короткие ссылки у них обязательно будут разными. Задумка разработчиков в том, что короткая ссылка в пределах системы должна быть уникальной. Но с другой стороны для рубрик и меток используется разный базис ссылок, поэтому они и так не смогут повториться. Так что этот вопрос недостаточно продуман.
На мой взгляд для ссылок нужно было сделать отдельную таблицу, где по term_id (номеру термина) можно указать короткие ссылки. Таким образом можно не только решить проблему уникальности короткой ссылки, но и разрешить одному и тому же материалу иметь синонимы ссылок.
Другим недостатком текущей таблицы терминов является невозможность указать порядковый номер.
Удивительно, проблема указания порядкового номера рубрик существует, наверное с момента зарождения WordPress, и к версии 2.3, можно было бы её решить раз и навсегда. Однако стандартно можно выполнить сортировку только по существующим полям, а именно названию, короткой ссылке и номеру. Совершенно очевидное решение добавить еще и поле «order» до сих пор не реализованно.
Правда судя по roadmap в версию 2.4 всё-таки внесено это изменение. На данный же момент это можно сделать с помощью последней версии плагина My Category Order.
Теперь перейдем к практической части. Поскольку для нас наибольший интерес представляет работа с рубриками, попробую обрисовать основные моменты.
Я не привожу SQL-запросы, потому что они будут различаться в каждом конкретном случае. Поэтому речь идет только про алгоритмы. Думаю, что для тех, кому адресована эта статья, не составит большого труда составить SQL-запрос по своим потребностям.
Предположим у нас есть номер рубрики X. Чтобы получить данные этой рубрики нужно выполнить запрос к wp_terms, где указать условия «(term_id = X)». ПО этой выборке мы получаем название рубрики и её короткую ссылку.
Для того, чтобы получить дополнительные данные, нужно выполнить запрос к wp_term_taxonomy с тем же условием (только ещё указать taxonomy='category'). По этой выборке можно увидеть описание рубрики, её родителя, количество элементов, которым присвоена данная рубрика.
Теперь усложним задачу. Получим по номеру записи (X) все её рубрики.
1. Выполняем запрос к wp_term_relationships с условием object_id = X. В результате получаем значение поля term_taxonomy_id (Y).
2. Теперь выполняем запрос к wp_term_taxonomy с условиями «(term_taxonomy_id = Y) AND (taxonomy='category')». В результате получаем все нужные значения по данной таксономии. Поле term_id теперь указывает на номер термина (Z).
3. Последний запрос выполняется к wp_terms с условием term_id = Z. В результате получаем остальные данные рубрики.
Понятно, что всё это делается одним запросом, просто мне хотелось показать основной принцип по этапам.
Теперь получим все записи определенной рубрики (X).
1. Выполняем запрос к wp_term_taxonomy с условием term_id = X. Получаем term_taxonomy_id (Y).
2. Этот номер указываем в запросе к wp_term_relationships. Условие: term_taxonomy_id = Y. В результате получаем список объектов/записей в поле object_id.
Думаю, что эти алгоритмы помогут лучше разобраться в механизме таксономии WordPress'а. Правда следует отметить, что это пригодится разве что для каких-то новых таксономий, поскольку функии для рубрик и меток реализованы на уровне самого «движка».
Один из примеров практического применения описанных алгоритмов можно посмотреть в заметке «Вывод последних записей».
Постоянная ссылка: http://maxsite.org/?p=293
Версия для печати
