Таксономия в WordPress 2.3
Четверг, 11 октября 2007 г.
Просмотров: 3061
Подписаться на комментарии по RSS
Таксономия (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'а. Правда следует отметить, что это пригодится разве что для каких-то новых таксономий, поскольку функии для рубрик и меток реализованы на уровне самого «движка».
Один из примеров практического применения описанных алгоритмов можно посмотреть в заметке «Вывод последних записей».



Комментариев: 20
Макс, очень сложная статья. Для профи. А профи и сами могут разобраться.Я же ничео не понял. На практичном примере... Означаэь ли это, что можна теперь определенную метку привязать к категори? Например, новстной блог,есть у нас рубрики с областями Украины. Но автор сайта хочет еще каждому посту присвоить значение населенного пункта или района. Для этого используються метки (теги). Но, поскольку, на Украине 2 Николаева, и несколько Камянок и Гавриловок, каким образом можна разграничить Николаев из Львовськой области, и, собственно, Николаев, который областной центр? Есть ли в версии 2.2.3 привязка меток к категориям? Можно ли реализовать вывод облака тегов, характерных только определенной рубрике?
И еще вопрос, на который тоже хочеться получить ответ. На форуме меня кажись не поняли. Просто я обновил блог, переустановив его ПОЛНОСТЬЮ, НА НОВУЮ БАЗУ, но проблема с рубриками непнятно откуда нарисовлась - при постинге или редактировании выбрасывает на белую страницу с ошибкой, связанной с таблицей post2cat, хотя на самом деле все работает как надо - все постится и редактируется, сохраняются изменения. Просто мне мешает эта страничка... Я просто не могу взять в толк, откуда взялась єта ошибка, если блог поставлен с нуля и про предыдудщие версии движка он знать не должен. На форуме советуют переписать запрос, но я, к сожалению, несведущий, что и как делать... Как можна решитьь проблему белой страницы?
что-то мне здесь напоминает Drupal...
подскажите как сделать обако тегов в wordpress 2.3
Bobik, я так делал:
Фолксономия
Ну и в css написал такое:
.folks {width: 300px;
height: 5px;
margin: 0 0 0 3px;
padding: 5px 0 25px 0px;
float: left;
text-align: center;
}
Основной параметр, правда, здесь только width — ширина облака тегов.
Bobik, пардон, основной код не вставился :(
Вот, что я хотел донести:
<div class="folks">
<h2>Фолксономия</h2>
<?php wp_tag_cloud('smallest=10&largest=22&number=30&format=flat&orderby=count'); ?>
</div>
2Mixa:
Конечно тема сложная, поэтому я и в соответствующую рубрику её поместил. :wink:
По сути же теперь можно связывать любые объекты между собой. Например можно сделать еще одни метки, еще одни рубрики или придумать что-то еще. Главное продумать схему и алгоритм. Ну и конечно же нужно его реализовать практически, например добавить в виде отдельного поля в редактор.
По post2cat скажу только, что в 2.3 такой таблицы нет. Если же было обновление WordPress, значит происходит обращение к старой таблице. Может плагин так работает. Но в любом случае этого не должно быть.
мдя, скрещиваем ёжика и удава.
Иерархия и WP это болото еще то...
Если разработчик с самого начала нахимичил, то чтобы исправить надо извращаться.
2Mixa: Скорее всего проблема post2cat в старом плагине RecentComments. Обнови и почисти кэш. У меня - тоже была, но ушла после этих операций.:smile:
Здравствуйте, Максим.
У меня пара вопросов к вам. Какие плагины вы используете для отображение "Самое читаемое", "Самое комментируемое", а также облака тэгов. Спасибо.
> Для определения таксономии используется поле «taxonomy». Например для рубрик это «category», для меток - «post_tag», для рубрик ссылок - «link_category»...
... теперь можно связывать любые объекты между собой. Например можно сделать еще одни метки, еще одни рубрики или придумать что-то еще. Главное продумать схему и алгоритм. Ну и конечно же нужно его реализовать практически...
Может быть есть готовый плагин для таксономии страниц "page_tag", странно что разработчики не позаботились?
Нашел плагин
Page category plus/
вот с такой функциональностью:
1. It displays the categories list currently only available on the ‘Write > Post’ panel in the ‘Write > Page’ panel and allows category assignment as if the Page were a Post.
2. It updates the Categories count when used on a Page just as happens on Posts.
3. The built in ‘Archive’ view of ‘Posts by Category’ will include any ‘Pages’ that use that category.
4. Template Tags - like wp_list_categories() - will include any categories used by Pages - even if that category is ONLY assigned to Pages.
Нечто подобное требуется. У того же автора имеется "Sub-Page Links". С помощью этих 2 плагинов возможно получится построить древовидные каталоги документов.
Я сейчас живу на версии 2.0.2. Как мне перейти на 2.3?
Ну для начала readme.txt прочитать
а в каких функциях используется term_group? на будущее?
И еще вопрос не в тему..
Раньше была функция, использовлаась в шаблоне count_posts, количество найденных постов. В версии 2.3 не нашел ее. Как отображать количество найденных постов в рубрике, по тегам, в результате поиска?
Статья отличная !!!
Качество и сложность статей растут
Автор Пиши ещё!!!
Небольшое уточнение:
для таблицы wp_terms
# term_id - (auto) - номер термина
# name - название рубрики, тэга
могу выслать картинку :smile:
Андрей, рубрика или тэг - это и есть термин.
Иерархией надо было "с начала" архитектуры заниматься.
Тогда было бы гараздо проще для понимания.
Кароче наконец то я разобрался в этой каше, ну что же мы имеем полный бардак.
Никак не могу въехать зачем тут 3 таблицы wp_terms и wp_term_taxonomy имеют один общий уникальный ключ term_id (идентификатор термина) их прекрасно можно объединить в одну. Зачем их разделили непонятно.