Предлагает ли WordPress Способ найти все категории, в которых нет детей?
Предыстория
Как обсуждалось в , Существует ли разница между таксономиями и категориями , таксономии относятся к обобщенной системе классификации и организации объектов или данных. В случае WordPress Категории, теги, Формат сообщений (ting) и категории ссылок встроены в таксономии, используемые для классификации и организации сообщений, ссылок и метаданных. Термины являются примерами этих таксономий; возьмем, к примеру, блог WordPress о компьютерное программное обеспечение. Если одна из таксономий является категорией, то одним из терминов будут языки программирования, потому что языки программирования - это тема в компьютерном программном обеспечении, и их можно рассматривать как категориальную таксономию. Кроме того, разработчики WordPress и разработчики плагинов могут использовать функцию register_taxonomy()
для инициализации встроенных таксономий, а также для создания новых таксономий в WordPress.
Работа с категориями WordPress
Хорошо, итак, WordPress предлагает несколько интересных функций в API таксономии (страницы кодекса нет, ссылки на самый последний исходный код). Если я правильно их понимаю, некоторые из перспективных функций, которые я могу использовать для своих целей, следующие:
-
get_terms()
: Кодекс в значительной степени говорит то же самое, что говорится в комментариях к исходному коду; что он извлекает термины в данной таксономии или списке таксономий. Я могу предоставить массив аргументов для изменения того, какие термины возвращаются; для например, чтобы убедиться, что я включаю пустые термины (то есть на них не ссылаются никакие сообщения в случае категорий или тегов), я могу установить аргумент скрыть пустые в0
илиfalse
; -
get_term_heirarchy()
: Возвращает все идентификаторы терминов дочерних элементов данного термина в виде массива. -
term_is_ancestor_of()
: Делает именно то, что сказано; сравните два термина, причем термин один является термином ссылки, а термин два - термином для проверки родословной.
Ммм, Так Что Насчет Потомки
Моя цель здесь - выяснить, в каких категориях нет дочерних категорий (или терминов-потомков, если быть более общим). Я также не хочу игнорировать пустые категории (категории, в которых есть дети, но нет сообщений, которые ссылаются на них).
Есть ли в WordPress простой способ выполнить такой поиск? Если да, то есть ли проблемы с производительностью, о которых мне следует беспокоиться?
Некоторые изменения: Чтобы привести пример для дальнейшего использования, вот некоторые твердые данные, с которыми я работаю...
Просмотр администратора категории WordPress
Таблица таксономии WordPress
Таблица терминов WordPress
Таблица отношений WordPress с терминами
В моем тестовом примере я хочу вернуть следующее:
- Без рубрики
- Встроенное программное обеспечение и встроенные системы
- Операционные системы
- Сеть и Интернет на основе Приложения
- Аппаратное обеспечение
У всех из них нет детей, хотя у некоторых есть пустой счет.
1 answers
Нет простого способа сделать это. Для этого вам нужно сделать прямой запрос. Я предполагаю, что вам нужны только родительские категории, у которых нет потомков, или даже если у них есть потомки, это не используется ни в одном сообщении
global $wpdb;
$categories = $wpdb->query("SELECT $wpdb->terms.*
FROM $wpdb->terms
INNER JOIN $wpdb->term_taxonomy
ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
WHERE $wpdb->terms.term_id NOT IN(
SELECT $wpdb->term_taxonomy.parent
FROM $wpdb->term_taxonomy
)
AND $wpdb->term_taxonomy.taxonomy = 'category'"
);
Редактирование дополнения оригинального плаката
Как Работает Этот Запрос?
Предположим, что префикс таблицы равен main_. Во-первых, нам нужно получить все категории, чтобы мы могли начать изучать, у кого из них нет детей. Этот делается путем выбора всего из таблицы term_taxonomy и использования предложения WHERE
для ограничения результатов, в которых поле таксономии равно категории :
SELECT *
FROM main_terms
WHERE main_term_taxonomy.taxonomy = 'category';
Однако нам также нужны имена категорий, которые хранятся в таблице терминов , поэтому мы объединяем две таблицы вместе с помощью INNER JOIN
, что также гарантирует, что включены только строки данных, общих для обоих столбцов (как в отличие от внешнего соединения). Обе таблицы для соединения вместе нужна общая колонка, чтобы "сшить" их вместе.
SELECT *
FROM main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category';
Наконец, мы исключаем категории, где они отображаются в качестве родительских для другой категории в таблице term_taxonomy. Для этого мы используем ключевые слова NOT IN
и создаем другой SQL-запрос внутри SELECT
ко всему в родительском столбце в term_taxonomy. Этот вложенный SQL-запрос затем указывает, какие идентификаторы терминов следует исключить из наших результатов, поскольку они содержат записи в термин таксономия.родители, указывающий, что они являются родителями другой категории.
SELECT main_term_taxonomy.*
FROM main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category'
AND main_term_taxonomy.term_id NOT IN(
SELECT main_term_taxonomy.parent
FROM main_term_taxonomy
);
Интересно, что это возвращает правильные строки, но не включает название категории. Это происходит потому, что мы выбираем все столбцы из неправильной таблицы, main_term_taxonomy. Поэтому мы должны поменять местами таблицы в нашем SQL, чтобы получить желаемую информацию.
SELECT main_terms.*
FROM main_terms
INNER JOIN main_term_taxonomy
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category'
AND main_term_taxonomy.term_id NOT IN(
SELECT main_term_taxonomy.parent
FROM main_term_taxonomy
);