Может ли дочерняя категория иметь несколько родительских?

15 авг. 2014 г., 22:18:50
Просмотры: 15.5K
Голосов: 5

Я изучаю функцию get_categories() в кодексе WordPress, чтобы понять, как можно получить всех потомков для каждой "корневой родительской категории" (категорий без родителей). Например, если мне нужны дочерние элементы для нескольких "корневых родителей", хочу знать, может ли один и тот же дочерний элемент встречаться под разными "корневыми родителями".

Это приводит меня к вопросу:

Могут ли дочерние категории в WordPress иметь несколько разных родительских категорий?

0
Все ответы на вопрос 2
11

Нет, термин может иметь множество дочерних элементов, но только одного родителя. Поле parent в базе данных может содержать только одно значение.

Это иерархическое отношение "один ко многим", а не "многие ко многим".

То же самое верно и для записей. Запись может иметь только 1 родителя, но много дочерних элементов. Чтобы обойти это ограничение, следует использовать таксономии.

Примечание о wp_term_taxonomy и неопровержимые доказательства

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

Вот схема базы данных:

Схема базы данных wp_term_taxonomy

Как видите, если бы один и тот же термин и таксономия упоминались несколько раз, но с разными родителями, возможно, термин мог бы иметь несколько родителей?

Нет, term_id и taxonomy_id являются уникальными, такая ситуация невозможна в этой таблице без изменения её схемы. Чтобы продемонстрировать это, я открыл Sequel Pro.

Вот термин из локальной копии моего блога:

Пример термина в базе данных

У него родитель с ID 4, попробуем назначить ему второго родителя с ID 5:

INSERT INTO `tjn2_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`)
VALUES
    (13, 13, 'category', '', 5, 0);

При выполнении этот запрос выдаёт следующую ошибку:

Ошибка дублирования записи

Таким образом, термин не может иметь более одного родителя. Но даже если бы мог, в API не было бы механизмов для обнаружения этого без использования сырых SQL-запросов, поэтому такой термин был бы бесполезен и непригоден для использования в интерфейсах

15 авг. 2014 г. 23:32:41
Комментарии

Здесь есть тонкость, о которой нужно быть осторожным. Вы должны указать дочерний элемент по идентификатору таксономии, потому что один и тот же термин может встречаться в нескольких местах иерархической таксономии. Другими словами, термин, рассматриваемый как строка, может иметь несколько родительских элементов, но на самом деле этот термин не является одним элементом таксономии, а соответствует нескольким элементам таксономии с одинаковым строковым значением.

User User
16 авг. 2014 г. 00:11:48

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

Tom J Nowell Tom J Nowell
16 авг. 2014 г. 00:18:57

В иерархической таксономии один и тот же термин может встречаться в нескольких местах. Рассмотрим иерархию автомобилей с первым уровнем - GM, Ford, Chrysler. На втором уровне у каждого может быть подкатегория седан, грузовик, т.е. GM->седан и Ford->седан, где "седан" будет одним и тем же термином, но не тем же элементом таксономии. Если вы посмотрите на структуру баз данных WordPress, там есть таблицы wp_terms и wp_term_taxonomy, чтобы позволить совместное использование терминов. Записи структурированы по-другому. Они используют одну таблицу с полем post_parent. Кроме того, совместное использование происходит в рамках одной таксономии.

User User
16 авг. 2014 г. 00:36:02

Другими словами, существует причина, по которой есть term_id и term_taxonomy_id. Обратите внимание, что таблица wp_posts имеет только столбец ID, поэтому её структура действительно отличается.

User User
16 авг. 2014 г. 00:43:59

Нет, нет возможности настроить это через интерфейс или API, и эти поля уникальны в схеме базы данных. Попробуйте выполнить SQL-запрос, и он завершится ошибкой.

Tom J Nowell Tom J Nowell
16 авг. 2014 г. 01:39:53

Смотрите мои правки, чтобы понять, почему это невозможно.

Tom J Nowell Tom J Nowell
16 авг. 2014 г. 01:45:37

Конечно, term_taxonomy_ids уникальны, но два разных term_taxonomy_id могут иметь одинаковый term_id. Попробуйте заменить первую 13 в вашем INSERT на несуществующий term_taxonomy_id, оставив вторую 13 без изменений, а также измените parent на другой существующий parent.

User User
16 авг. 2014 г. 01:58:04

Все равно выдает ошибку "Duplicate entry '13-category' for key 'term_id_taxonomy'". Это невозможно, если вы не согласны, я предлагаю вам продемонстрировать это. Но даже если бы это было возможно, это бесполезно и совершенно не относится к исходному вопросу.

Tom J Nowell Tom J Nowell
16 авг. 2014 г. 09:55:45

Могу я увидеть ваш фактический INSERT запрос?

User User
16 авг. 2014 г. 10:20:43

Вы правы, а я совершенно не прав. Но сейчас я действительно не понимаю, зачем нужны и term_id, и term_taxonomy_id. В любом случае, мне искренне жаль, что доставил вам эти хлопоты.

User User
16 авг. 2014 г. 10:34:23

Действительно, это странная структура, и основная команда рассматривает возможность изменить ее в будущем. Эта статья Эндрю Нацина подробно описывает план по работе с метаданными терминов и таблицами таксономий: http://make.wordpress.org/core/2013/07/28/potential-roadmap-for-taxonomy-meta-and-post-relationships/

Tom J Nowell Tom J Nowell
16 авг. 2014 г. 11:32:39
Показать остальные 6 комментариев
0

Попробуйте организовать ваши категории с помощью класса tax-meta-class http://en.bainternet.info/wordpress-taxonomies-extra-fields-the-easy-way/.

Вы сможете добавлять мета-поля в ваши таксономии (категории, метки, пользовательские таксономии).

15 авг. 2014 г. 22:36:38