Таксономия в WordPress 2.3

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

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

]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>

Комментариев: 20

Вы можете получать новые комментарии к этой записи по RSS или оформить подписку на все комментарии сайта. Или даже на все новые записи сайта. Не знаете, как это сделать?
  1. 2007-10-12 в 16:38:32 | Mixa

    Макс, очень сложная статья. Для профи. А профи и сами могут разобраться.Я же ничео не понял. На практичном примере... Означаэь ли это, что можна теперь определенную метку привязать к категори? Например, новстной блог,есть у нас рубрики с областями Украины. Но автор сайта хочет еще каждому посту присвоить значение населенного пункта или района. Для этого используються метки (теги). Но, поскольку, на Украине 2 Николаева, и несколько Камянок и Гавриловок, каким образом можна разграничить Николаев из Львовськой области, и, собственно, Николаев, который областной центр? Есть ли в версии 2.2.3 привязка меток к категориям? Можно ли реализовать вывод облака тегов, характерных только определенной рубрике?

  2. 2007-10-12 в 16:42:59 | Mixa

    И еще вопрос, на который тоже хочеться получить ответ. На форуме меня кажись не поняли. Просто я обновил блог, переустановив его ПОЛНОСТЬЮ, НА НОВУЮ БАЗУ, но проблема с рубриками непнятно откуда нарисовлась - при постинге или редактировании выбрасывает на белую страницу с ошибкой, связанной с таблицей post2cat, хотя на самом деле все работает как надо - все постится и редактируется, сохраняются изменения. Просто мне мешает эта страничка... Я просто не могу взять в толк, откуда взялась єта ошибка, если блог поставлен с нуля и про предыдудщие версии движка он знать не должен. На форуме советуют переписать запрос, но я, к сожалению, несведущий, что и как делать... Как можна решитьь проблему белой страницы?

  3. 2007-10-12 в 18:51:03 | vladname

    что-то мне здесь напоминает Drupal...

  4. 2007-10-12 в 20:35:19 | Bobik

    подскажите как сделать обако тегов в wordpress 2.3

  5. 2007-10-12 в 21:18:48 | Максим Мельников

    Bobik, я так делал:

    Фолксономия

    Ну и в css написал такое:

    .folks {
    width: 300px;
    height: 5px;
    margin: 0 0 0 3px;
    padding: 5px 0 25px 0px;
    float: left;
    text-align: center;
    }

    Основной параметр, правда, здесь только width — ширина облака тегов.

  6. 2007-10-12 в 21:22:16 | Максим Мельников

    Bobik, пардон, основной код не вставился :(

    Вот, что я хотел донести:

    <div class="folks">

    <h2>Фолксономия</h2>

    <?php wp_tag_cloud('smallest=10&largest=22&number=30&format=flat&orderby=count'); ?>

    </div>

  7. 2007-10-13 в 13:47:06 | Максим

    2Mixa:

    Конечно тема сложная, поэтому я и в соответствующую рубрику её поместил. :wink:

    По сути же теперь можно связывать любые объекты между собой. Например можно сделать еще одни метки, еще одни рубрики или придумать что-то еще. Главное продумать схему и алгоритм. Ну и конечно же нужно его реализовать практически, например добавить в виде отдельного поля в редактор.

    По post2cat скажу только, что в 2.3 такой таблицы нет. Если же было обновление WordPress, значит происходит обращение к старой таблице. Может плагин так работает. Но в любом случае этого не должно быть.

  8. 2007-10-15 в 11:58:53 | Maximark

    мдя, скрещиваем ёжика и удава.

    Иерархия и WP это болото еще то...

    Если разработчик с самого начала нахимичил, то чтобы исправить надо извращаться.

  9. 2007-10-18 в 12:15:27 | levati

    2Mixa: Скорее всего проблема post2cat в старом плагине RecentComments. Обнови и почисти кэш. У меня - тоже была, но ушла после этих операций.:smile:

  10. 2007-10-18 в 13:22:43 | N

    Здравствуйте, Максим.

    У меня пара вопросов к вам. Какие плагины вы используете для отображение "Самое читаемое", "Самое комментируемое", а также облака тэгов. Спасибо.

  11. 2007-10-23 в 14:08:17 | Сергей

    > Для определения таксономии используется поле «taxonomy». Например для рубрик это «category», для меток - «post_tag», для рубрик ссылок - «link_category»...

    ... теперь можно связывать любые объекты между собой. Например можно сделать еще одни метки, еще одни рубрики или придумать что-то еще. Главное продумать схему и алгоритм. Ну и конечно же нужно его реализовать практически...

    Может быть есть готовый плагин для таксономии страниц "page_tag", странно что разработчики не позаботились?

  12. 2007-10-23 в 17:55:37 | Сергей

    Нашел плагин

    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 плагинов возможно получится построить древовидные каталоги документов.

  13. 2007-10-24 в 19:01:42 | AK

    Я сейчас живу на версии 2.0.2. Как мне перейти на 2.3?

  14. 2007-10-24 в 21:18:14 | Максим

    Ну для начала readme.txt прочитать

  15. 2007-11-06 в 18:29:12 | Andrey

    а в каких функциях используется term_group? на будущее?

    И еще вопрос не в тему..

    Раньше была функция, использовлаась в шаблоне count_posts, количество найденных постов. В версии 2.3 не нашел ее. Как отображать количество найденных постов в рубрике, по тегам, в результате поиска?

  16. 2008-01-18 в 05:28:52 | generator2003

    Статья отличная !!!

    Качество и сложность статей растут

    Автор Пиши ещё!!!

  17. 2008-04-03 в 07:40:53 | Андрей

    Небольшое уточнение:

    для таблицы wp_terms

    # term_id - (auto) - номер термина

    # name - название рубрики, тэга

    могу выслать картинку :smile:

  18. 2008-04-03 в 12:49:40 | Максим

    Андрей, рубрика или тэг - это и есть термин.

  19. 2008-04-03 в 13:18:06 | Maximark

    Иерархией надо было "с начала" архитектуры заниматься.

    Тогда было бы гараздо проще для понимания.

  20. 2009-02-21 в 13:16:02 | stur

    Кароче наконец то я разобрался в этой каше, ну что же мы имеем полный бардак.

    Никак не могу въехать зачем тут 3 таблицы wp_terms и wp_term_taxonomy имеют один общий уникальный ключ term_id (идентификатор термина) их прекрасно можно объединить в одну. Зачем их разделили непонятно.

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

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)