Мой сайт о WordPress и PHP
 
10 октября 2007

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

Читали 4686 раз
Рубрика: Лаборатория
Навигация: Главная » WordPress » Лаборатория

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

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

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

19 комментариев к “Таксономия в WordPress 2.3”

  1. Mixa:

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

  2. Mixa:

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

  3. vladname:

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

  4. Bobik:

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

  5. Максим Мельников:

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

    Фолксономия


    Ну и в css написал такое:
    .folks {
    width: 300px;
    height: 5px;
    margin: 0 0 0 3px;
    padding: 5px 0 25px 0px;
    float: left;
    text-align: center;
    }

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

  6. Максим Мельников:

    Bobik, пардон, основной код не вставился :(
    Вот, что я хотел донести:
    <div class="folks">
    <h2>Фолксономия</h2>
    <?php wp_tag_cloud('smallest=10&largest=22&number=30&format=flat&orderby=count'); ?>
    </div>

  7. Максим:

    2Mixa:

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

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

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

  8. Maximark:

    мдя, скрещиваем ёжика и удава.
    Иерархия и WP это болото еще то...
    Если разработчик с самого начала нахимичил, то чтобы исправить надо извращаться.

  9. levati:

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

  10. N:

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

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

  11. Сергей:

    > Для определения таксономии используется поле «taxonomy». Например для рубрик это «category», для меток - «post_tag», для рубрик ссылок - «link_category»...
    ... теперь можно связывать любые объекты между собой. Например можно сделать еще одни метки, еще одни рубрики или придумать что-то еще. Главное продумать схему и алгоритм. Ну и конечно же нужно его реализовать практически...

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

  12. Сергей:

    Нашел плагин
    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. AK:

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

  14. Максим:

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

  15. Andrey:

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

  16. generator2003:

    Статья отличная !!!
    Качество и сложность статей растут
    Автор Пиши ещё!!!

  17. Андрей:

    Небольшое уточнение:
    для таблицы wp_terms
    # term_id - (auto) - номер термина
    # name - название рубрики, тэга
    могу выслать картинку :smile:

  18. Максим:

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

  19. Maximark:

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


Оставьте комментарий! (Вы согласны с правилами)

 

:mrgreen: :neutral: :twisted: :arrow: :shock: :smile: :???: :cool: :evil: :grin: :idea: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: :!: :?:

При добавлении кода (html, php) заменяйте < на &lt; и > на &gt;.
Внимание: антиспам - зверь! Копируйте своё сообщение перед отправкой. На всякий случай.