Предлагает ли WordPress возможность найти все категории, в которых нет детей?

Задний план

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

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

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

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

Умм, так что о потомках

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

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

Некоторые Редактирование . Чтобы привести пример для справки в будущем, вот некоторые твердые данные, с которыми я работаю …

WordPress Категория Admin View

категории

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

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

Таблица условий WordPress

Таблица условий WordPress

Таблица WordPress Term_Relationships

Таблица WordPress Term_Relationships

В своем тестовом примере я хочу вернуть обратно:

  • Без
  • Прошивка и встроенные системы
  • Операционные системы
  • Веб-и интернет-приложения
  • аппаратные средства

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

Solutions Collecting From Web of "Предлагает ли WordPress возможность найти все категории, в которых нет детей?"

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

 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'" ); 

Исходный аддон EDIT EDIT

Как работает этот запрос?

Предположим, что префикс таблицы является основным . Во-первых, нам нужно получить все категории, чтобы мы могли начать изучать, у кого нет детей. Это делается путем выбора всего из таблицы 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-запрос затем предоставляет, какие идентификаторы термина должны быть исключены из наших результатов, поскольку они имеют записи в term_taxonomy.parents , указывая, что они являются родителями другой категории.

 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 );