Предлагает ли WordPress Способ найти все категории, в которых нет детей?


Предыстория

Как обсуждалось в , Существует ли разница между таксономиями и категориями , таксономии относятся к обобщенной системе классификации и организации объектов или данных. В случае WordPress Категории, теги, Формат сообщений (ting) и категории ссылок встроены в таксономии, используемые для классификации и организации сообщений, ссылок и метаданных. Термины являются примерами этих таксономий; возьмем, к примеру, блог WordPress о компьютерное программное обеспечение. Если одна из таксономий является категорией, то одним из терминов будут языки программирования, потому что языки программирования - это тема в компьютерном программном обеспечении, и их можно рассматривать как категориальную таксономию. Кроме того, разработчики WordPress и разработчики плагинов могут использовать функцию register_taxonomy() для инициализации встроенных таксономий, а также для создания новых таксономий в WordPress.

Работа с категориями WordPress

Хорошо, итак, WordPress предлагает несколько интересных функций в API таксономии (страницы кодекса нет, ссылки на самый последний исходный код). Если я правильно их понимаю, некоторые из перспективных функций, которые я могу использовать для своих целей, следующие:

  • get_terms(): Кодекс в значительной степени говорит то же самое, что говорится в комментариях к исходному коду; что он извлекает термины в данной таксономии или списке таксономий. Я могу предоставить массив аргументов для изменения того, какие термины возвращаются; для например, чтобы убедиться, что я включаю пустые термины (то есть на них не ссылаются никакие сообщения в случае категорий или тегов), я могу установить аргумент скрыть пустые в 0 или false;
  • get_term_heirarchy(): Возвращает все идентификаторы терминов дочерних элементов данного термина в виде массива.
  • term_is_ancestor_of(): Делает именно то, что сказано; сравните два термина, причем термин один является термином ссылки, а термин два - термином для проверки родословной.

Ммм, Так Что Насчет Потомки

Моя цель здесь - выяснить, в каких категориях нет дочерних категорий (или терминов-потомков, если быть более общим). Я также не хочу игнорировать пустые категории (категории, в которых есть дети, но нет сообщений, которые ссылаются на них).

Есть ли в WordPress простой способ выполнить такой поиск? Если да, то есть ли проблемы с производительностью, о которых мне следует беспокоиться?

Некоторые изменения: Чтобы привести пример для дальнейшего использования, вот некоторые твердые данные, с которыми я работаю...

Просмотр администратора категории WordPress

Categories

Таблица таксономии WordPress

Table of WordPress Taxonomy

Таблица терминов WordPress

Table of WordPress Terms

Таблица отношений WordPress с терминами

Table of WordPress Term_Relationships

В моем тестовом примере я хочу вернуть следующее:

  • Без рубрики
  • Встроенное программное обеспечение и встроенные системы
  • Операционные системы
  • Сеть и Интернет на основе Приложения
  • Аппаратное обеспечение

У всех из них нет детей, хотя у некоторых есть пустой счет.

Author: Community, 2014-08-21

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
);
 3
Author: sakibmoon, 2017-05-23 12:40:05