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

Нет, термин может иметь множество дочерних элементов, но только одного родителя. Поле parent в базе данных может содержать только одно значение.
Это иерархическое отношение "один ко многим", а не "многие ко многим".
То же самое верно и для записей. Запись может иметь только 1 родителя, но много дочерних элементов. Чтобы обойти это ограничение, следует использовать таксономии.
Примечание о 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-запросов, поэтому такой термин был бы бесполезен и непригоден для использования в интерфейсах

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

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

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

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

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

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

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

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

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

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