Intereting Posts
Деление на нулевую ошибку в image.php Перенаправление на главную страницу, если вы хотите оставить интранет Цикл для сопоставления таксономических терминов для «связанных» постов? Перенаправить на страницу настроек после установки Как включить документацию в WordPress? Как избежать конфликта wp_nav_menu () ID? Изображения, не отображаемые после перемещения сайта (но путь к файлу ОК) удалить панель управления браузером show hide из настроек профиля FitVid не работает для iframes для конкретной темы установки Не удалось установить тему на разработку копии WordPress на Webmatrix Как создать повторяющееся поле в метабоксе, если я следую учебнику wppb.io? Получать информацию о архивах одного сообщения Facebook Share Thumbnail Какие крючки подключаются для автоматической очистки кеша детская тема, показывающая всю эту дополнительную информацию для следующих строк

Предлагает ли 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 );