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

Древообразная структура классификаций определенного набора объектов

Таксономия (taxonomy) — одно из понятий, появившихся еще во времена  2.3, но до сих пор вызывающее ужас из-за внутренней реализации.

Вообще говоря, таксономией (с математической точки зрения) называется древообразная структура классификаций определенного набора объектов. По умолчанию пердоставляет три классификации: рубрики записей (post categories), метки записей (post tags) и рубрики ссылок (link categories).

Я не случайно употребил "по умолчанию" — потому что позволяет создавать собственные таксономии.

Таксономия в реализована тремя таблицами:

  1. Таблица термов (wp_terms);
  2. Таблица таксономии термов (wp_term_taxonomy);
  3. Таблица отношений термов, объектов и таксономий (wp_term_relationships).

Рассмотрим данные таблицы подробнее.

Таблица термов (wp_terms)
Поле Описание
term_id Уникальный идентификатор терма
name Имя терма
slug Имя терма, пригодное для использования в URL
term_group В теории используется для группирования схожих термов; на практике я этого ни разу не наблюдал

Сами по себе термы не несут никакой смысловой нагрузки; контекст терма определяется таксономией, заданной в таблице wp_term_taxonomy.

Таблица таксономии термов (wp_term_taxonomy)
Поле Описание
term_taxonomy_id Уникальный идентификатор таксономии терма
term_id Идентификатор терма, относящегося к данной таксономии (связь осуществляется по полю wp_terms.term_id)
taxonomy Таксономия. Как я уже говорил выше, определяет три таксономии: рубрики записей, метки записей и рубрики категорий
parent Родительский терм (а не таксономия, как полагают некоторые). Используется для поддержания иерархической связности термов внутри таксономии
count Количество объектов (записей/ссылок), связанных с данной таксономией. Забегая вперёд, отмечу, что значение данного поля не равно SELECT COUNT(`object_id`) FROM `wp_term_relationships` WHERE `term_taxonomy_id` = 'ID'. Подсчёт количества объектов специфичен для каждой таксономии. Например, в случае с рубриками записей, количество объектов — это количество опубликованных записей



Таблица отношений термов, объектов и таксономий (wp_term_relationships)
Поле Описание
object_id Идентификатор объекта (коим по умолчанию является либо запись, либо ссылка, в зависимости от значения поля taxonomy в таблице wp_term_taxonomy), относящегося к данной таксономии
term_taxonomy_id Идентификатор таксономии терма, относящейся к данному объекту (связь осуществляется по полю wp_term_taxonomy.term_taxonomy_id)
term_order Используется для сортировки

Как я уже говорил (а repetitio est mater studiorum), предоставляет три таксономии. Ниже приведены краткие характеристики каждой из них.

Характеристика таксономий в
Таксономия Объект Иерархичность
category (рубрика) Запись Да (рубрики могут быть вложенными)
post_tag (метка записи) Запись Нет
link_category (рубрика ссылок) Ссылка Нет

Рекомендую к прочтению:

Добавить в закладки

Связанные записи

Автор: Vladimir; опубликовано в: WordPress; метки: WordPress, таксономия
21
Сен
2008

RSS Комментарии к статье «Таксономия в WordPress» (19)  »

  1. [...] что связано с таксономией, авторами, датой и временем (в эту группу относятся [...]

  2. [...] Технически проблема заключается в том, что WordPress не обновляет поле count таблицы таксономий термов. [...]

  3. [...] реализация управления таксономиями в WordPress — это просто кошмар какой-то. Мало того, что код [...]

  4. erty root

    да, чет сложно это у вас както. упростили бы половину.

  5. Здравствуйте, Владимир.

    Спасибо за полезный материал.
    Взгляните, пожалуйста, на сайт http://ferrum.spb.ru
    Не правильно работают метки.
    Может быть что-то с get_tag_link?
    Очень жду Ваших комментариев.
    Спасибо

    • Оксана, get_tag_link() нормально отрабатывает, так как ссылки генерируются корректные (http://ferrum.spb.ru/tag/prodvizhenie-sajtov/),а проблема в том, что выдаётся не то, что надо.

      Вариантов несколько:

      1. неправильно сконфигурированы правила переписывания ссылок в nginx (судя по тестам это маловероятно, но возможно);
      2. мешает какой-нибудь плагин;
      3. ошибка в шаблоне темы (попробуйте сделать копию шаблона category.php в tag.php, так как, судя по всему, у Вас для отображения тэгов берётся шаблон index.php, а в нём The Loop отсутствует).

      Лично я склоняюсь к третьему варианту.

  6. Разбираюсь с таксономией, не могу сообразить как сделать такое:
    адрес /tag/music
    узнать какие категории ипользуют посты с этим тегом
    сгрппировать посты по категориям и вывести на /tag/music
    что то с этой таксономией не пойму как запрос составить. Спасибо

    • Ну если решать задачу средствами MySQL, то так:

      [-]
      View Code MySQL
      SELECT t.term_id, t.name, t.slug, tr.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 = '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.
  7. вот спасибо, я сделал уже так:
    в файле archive.php в loop собираю все посты в массив, группирую как нужно, и вывожу каждую группу через loop

    ps. забыл сказать, если пост идет в подкатегории, нужно поместить его в группу top-level этой категориии, наверно одним mysql все равно такое не решить

  8. AVF

    Не могу сделать универсальный код чтобы wordpress выдавал количество постов в рубрике (/category/рубрика), в таге (/tag/метка) и поиске (/?s=слово).
    За основу брал вот такой код:

    [-]
    View Code PHP
    echo $wpdb->get_var("
        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. Если Вы его не получили, отпишитесь, пожалуйста.

      • AVF

        Владимир, большое спасибо! Я письмо получил, но еще не попробовал. На следующей неделе поэкспериментирую.

  9. Владимир При нажаитии на “Выберите из наиболее популярных меток..” появляется надпись “Неверная таксономия” (скриншот http://floomby.ru/content/hbB9zqamKE/) WP 2.9.1 в чём проблема? на этом же хостинге есть еще один блог версия вордпреса таже, там всё работает. Дело не в теме, менял на дефолтную, проблема сохранилась. Помогите где искать, хотя бы

Оставить комментарий к записи «Таксономия в WordPress»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Изображения должны быть включены!

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя