Что такое таксономия и термы и как это работает в WordPress. Выводим категории из Базы Данных с помощью SQL запроса. Хуки из функции

Получает данные об элементе таксономии (термине) по переданному ID.

Функция имеет два хука:

  1. get_term - срабатывает всегда;
  2. get_$taxonomy - срабатывает для определенного элемента таксономии.

Оба хука в качестве параметров получают объект (массив) элемента и название таксономии. Оба хука должны вернуть объект (массив) элемента.

Второй хук term_$taxonomy динамический, т.е. в нем $taxonomy должно быть заменено на название таксономии. Например для категорий, название таксономии у которых "category", название фильтра будет таким: "get_category". Может пригодится для произвольных таксономий.

get_term() кэширует результат и при повторном получении того же термина, запроса к БД уже не происходить - результат просто возвращается из кэша.

Использует: sanitize_term() . Чистит элемент на основе правил фильтра указанного в параметре $filter

✈ 1 раз = 0.000125с = быстро | 50000 раз = 0.42с = очень быстро | PHP 7.1.2, WP 4.7.3

Хуки из функции
Возвращает

Объект/массив/null/WP_Error.

  • WP_Term (объект термина) или данные из БД.
  • null, если термина нет.
  • WP_Error (объект), если таксономии не существует.

Использование

$term = get_term($term, $taxonomy, $output, $filter); $term(число/объект) (обязательный) Если передан ID, то данные будут получены из БД. Если передан объект, то будут применены фильтры и возвращен переданный объект.
По умолчанию: нет $taxonomy(строка) Название таксономии, к которой принадлежит элемент $term .
С версии 4.4. параметр стал необязательным.
По умолчанию: "" $output(строка)

Каким видом массива возвращать данные:

  • OBJECT - объект;
  • ARRAY_A - ассоциативный массив;
  • ARRAY_N - индексированный массив.

По умолчанию: OBJECT

$filter(строка) Как очищать поля массива перед возвращением.
По умолчанию: "raw"

Примеры

#1. Получим данные об элементе таксономии из БД:

$term_id = 65; $taxonomy = "my_taxonomy"; // С версии 4.4. параметр стал не обязательным. $term = get_term($term_id, $taxonomy); // Теперь, переменная содержит данные о элементе таксономии. // Альтернативное название элемента находится здесь $slug = $term->slug; // Название элемента $name = $term->name; // А так мы получим описание элемента таксономии $desc = $term->description;

#2 Получение элемента таксономии без указания таксономии

С версии 4.4. стало возможными не указывать параметр $taxonomy:

$term = get_term(562); print_r($term); /* Выведет: WP_Term Object ( => 562 => Записи => zapisi => 0 => 582 => my_taxonomy_name => => 0 => 1 => raw) */

Код get term : wp-includes/taxonomy.php VER 5.1.1

filter) || "raw" === $term->filter) { $_term = sanitize_term($term, $taxonomy, "raw"); $_term = new WP_Term($_term); } else { $_term = WP_Term::get_instance($term->term_id); } } else { $_term = WP_Term::get_instance($term, $taxonomy); } if (is_wp_error($_term)) { return $_term; } elseif (! $_term) { return null; } // Ensure for filters that this is not empty. $taxonomy = $_term->taxonomy; /** * Filters a taxonomy term object. * * @since 2.3.0 * @since 4.4.0 `$_term` is now a `WP_Term` object. * * @param WP_Term $_term Term object. * @param string $taxonomy The taxonomy slug. */ $_term = apply_filters("get_term", $_term, $taxonomy); /** * Filters a taxonomy term object. * * The dynamic portion of the filter name, `$taxonomy`, refers * to the slug of the term"s taxonomy. * * @since 2.3.0 * @since 4.4.0 `$_term` is now a `WP_Term` object. * * @param WP_Term $_term Term object. * @param string $taxonomy The taxonomy slug. */ $_term = apply_filters("get_{$taxonomy}", $_term, $taxonomy); // Bail if a filter callback has changed the type of the `$_term` object. if (! ($_term instanceof WP_Term)) { return $_term; } // Sanitize term, according to the specified filter. $_term->filter($filter); if ($output == ARRAY_A) { return $_term->to_array(); } elseif ($output == ARRAY_N) { return array_values($_term->to_array()); } return $_term; }

При создании сайтов очень важно роль играет правильная группировка материалов и записей, для дальнейшей выборки или фильтрации по определённым признакам.

Все объекты в мире мы можем сгруппировать по определённым признакам.

К примеру возьмем обычный Магазин, который продаёт товары такие как: одежда и обувь. В этом случае, мы можем разбить все товары по таким группам: летние и зимние, мужские и женские, производитель, материал, цвет, размер и таких признаков может быть очень много с группами и подгруппами.

Понятие “Таксономия” существует уже достаточно давно. Данное определение зачастую используется в Биологии, Географии, Геологии и других естественных науках. Иными словами, термин Таксономия(Taxonomy) – это классификация, группировка или же систематизация объектов, по определенным признакам и характеристикам. В свою очередь, Терм – это объект, который лежит в определенной Таксономии. Таксономия держит в себе целый набор таких термов. Соответственно, отдельно функционировать данная форма(терм) не может.

Таксономия материалов в блогах и магазинах сайтов.

Таксономия стала применяться и в работе с базами данных, что в свою очередь привело к абсолютному порядку и организации объектов. С помощью таксономии сложные системы можно разбить на более простые классы, группы и исходя из этого, поделить группы на подгруппы.

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

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

Самые распостраненные виды таксономии это Категории(Caregorys) и Метки(tags), которые группируют ваши страницы по определенным признакам. Как добавить на своем сайте новую рубрику(категорию) или метку знает практически каждый начинающий специалист. Но я напишу, на всякий случай. Заходим под админом в Консоль->Рубрики->Добавить Новую, идентичную операцию проворачиваем и с Метками. Все очень просто,поэтому поехали дальше.

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

В БД WordPress таксономия разделена на три таблицы. Для упрощения выборки соединяются только их ID (уникальный идентификатор).

Как эти таблицы выглядят в WordPress:

1 таблица wp_term_relationships
Из первой таблицы выбираются все id к которым относится объект, в нашем случае это post или page (Записи, Страницы, Вложения и т.д.).

2 таблица wp_term_
Во второй таблице мы расшифровываем к какой именно группе относятся по переданному id term_taxonomy_id category, teg или другое название группы и получаем ид другой связанной таблицы.Теперь мы сможем подробнее указать к какой именно категории или тегу относится данный объект через(term_id).

3 таблица wp_terms
Эта таблица получает id термов и может указать нам конкретно название категории или метки.

Схематически это выглядит так:

Выводим категории из Базы Данных с помощью SQL запроса

Вот пример, как можно выбрать все категории , из базы данных WordPress , и вывести их с количеством записей, и с дополнительным условием чтобы записей было больше одной (wp_term_taxonomy.count > 1)

Для работы с БД в WordPress нужно глобализировать переменную $wpdb .

Вот сам пример кода который можно вставить в сайтбар или футер вашей темы:

Global $wpdb; $sql = " SELECT wp_term_taxonomy.* , wp_terms.* FROM wp_term_taxonomy , wp_terms WHERE wp_term_taxonomy.taxonomy = "category" AND wp_terms.term_id = wp_term_taxonomy.term_id AND wp_term_taxonomy.count > 1 "; // Выводим результат выборки $result = $wpdb -> get_results($sql, ARRAY_A); echo "Категории: ""; foreach ($result as $cat) { echo $cat["name"] . " : " . $cat["count"] . " шт." . " "; }

global $ wpdb ;

$ sql = "

SELECT wp_term_taxonomy.* , wp_terms.*

FROM wp_term_taxonomy , wp_terms

AND wp_terms.term_id = wp_term_taxonomy.term_id

AND wp_term_taxonomy.count > 1

" ;

// Выводим результат выборки

$ result = $ wpdb - & gt ; get_results ($ sql , ARRAY_A ) ;

echo "Категории: " ";

foreach ($ result as $ cat )

echo $ cat [ "name" ] . " : " . $ cat [ "count" ] . " шт." . "

Выводим метки из Базы Данных с помощью SQL запроса

В другом примере выбираем все теги из БД
и выводим их тоже с показателем количества записей.

В этом примере мы делаем запрос к базе данных более правильно, добавляя вместо префикса “WP_” переменную “$wpdb->” что дает нам гарантию – если задан другой префикс, то таблица будет выбрана правильно.

И ещё добавим в этот пример ассоциативную связь в новую переменную (table2.name AS tag_name) а потом отобразим из новой переменной tag_name

Global $wpdb; $sql = " SELECT table1.*, table2.name AS tag_name FROM " . $wpdb -> term_taxonomy . " table1, " . $wpdb -> terms . " table2 WHERE table1.taxonomy = "post_tag" AND table2.term_id = table1.term_id "; // Выводим результат выборки $result = $wpdb -> get_results($sql, ARRAY_A); echo "Метки:"; foreach ($result as $tag) { echo $tag["tag_name"] . " : " . $tag["count"] . " шт. " . " "; }

global $ wpdb ;

$ sql = "

SELECT table1.*, table2.name AS tag_name

FROM " . $ wpdb -> term _ . " table1, " . $ wpdb -> terms . " table2

AND table2.term_id = table1.term_id

" ;

// Выводим результат выборки

$ result = $ wpdb -> get_results ($ sql , ARRAY_A ) ;

Получает элементы (термины) указанной таксономии по указанным параметрам.

До версии WP 4.5 первый параметр get_terms() был названием таксономии или списком таких названий:

$terms = get_terms("post_tag", array("hide_empty" => false,));

С версии WP 4.5 название таксономии нужно указывать в элементе массива taxonomy в параметре $args , а не во втором параметре, как это было раньше:

$args = array("taxonomy" => "post_tag", "hide_empty" => false,); $terms = get_terms($args);

Обратная совместимость работает (функция понимает устарелый вызов).

✈ 1 раз = 0.015166с = тормоз | 50000 раз = 33.29с = очень медленно | PHP 7.1.11, WP 4.9.5

Хуки из функции
Возвращает

Массив/WP_Error/строка.

  • Массив объектов WP_Term - при успешном получении.
  • array() (пустой массив) - если термины не найдены.
  • WP_Error - если любой из указанных таксономий не существует.
  • Количество найденных терминов (в виде строки) - если fields = count .

Шаблон использования

$terms = get_terms(array("taxonomy" => array("post_tag", "my_tax"), // название таксономии с WP 4.5 "orderby" => "id", "order" => "ASC", "hide_empty" => true, "object_ids" => null, "include" => array(), "exclude" => array(), "exclude_tree" => array(), "number" => "", "fields" => "all", "count" => false, "slug" => "", "parent" => "", "hierarchical" => true, "child_of" => 0, "get" => "", // ставим all чтобы получить все термины "name__like" => "", "pad_counts" => false, "offset" => "", "search" => "", "cache_domain" => "core", "name" => "", // str/arr поле name для получения термина по нему. C 4.2. "childless" => false, // true не получит (пропустит) термины у которых есть дочерние термины. C 4.2. "update_term_meta_cache" => true, // подгружать метаданные в кэш "meta_query" => "",)); foreach($terms as $term){ print_r($term); }

Использование

get_terms($args, $deprecated); $args(строка/массив)

Аргументы, в соответствии с которыми будет получен результат.

Среди них обязательным является аргумент $args["taxonomy"] в котором указывается название таксономии или несколько названий таксономий в массиве.

$deprecated(строка/массив) До версии 4.5 в этом аргументе указывались параметры $args, а первом параметре $args указывались называния таксономий. С версии 4.5 названия таксономий указываются в аргументе $args["taxonomy"] .
По умолчанию: массив аргументов по умолчанию

Аргументы параметра $args

taxonomy(строка/массив) (обязательный) Название таксономии с которой работать. Можно указать несколько названий в виде массива. С версии WP 4.5, до этого названия таксономий указывались в первом параметре самой функции. number(число) Максимальное количество элементов, которые будут получены. Лимит.
По умолчанию: все . object_ids(число/массив)

Укажите тут число или массив чисел, чтобы получить термины, у которых поле object_id таблицы wp_term_relationships совпадет с указанными значениями.

Обычно в поле object_id находятся ID записей к которым прикреплен термин.

Include(строка/массив) Массив из ID терминов, которые нужно включить в выборку. Если указать этот параметр, то многие другие станут бесполезными. Парсится через wp_parse_id_list() .
По умолчанию: "" exclude(строка/массив) Массив ID терминов, которые нужно исключить. Также можно указать строку в виде разделенных запятыми ID. Парсится через wp_parse_id_list() .
По умолчанию: "" exclude_tree(строка/массив) Массив ID родительских терминов, которые нужно исключить. Исключена будет вся ветка. Парсится через wp_parse_id_list() .
По умолчанию: "" offset(число) Верхний отступ в запросе. Сколько первых элементов пропустить. Указывать нужно число. По умолчанию без отступов. orderby(строка)

Поле по которому сортировать результат. Может быть:

  • id или term_id - по ID.
  • name - по названию. По умолчанию.
  • count - по полю count в term_taxonomy - по количеству записей.
  • slug - по альтернативному названию.
  • description - по описанию.
  • term_group - по группе.
  • parent - по полю parent.

  • include - по порядку указанному в параметре $include
  • slug__in - с версии 4.9. В порядке указанном в параметре $slug.
  • meta_value - по значению произвольного поля
  • meta_value_num - по значению произвольного поля, значение будет интерпретироваться как число, а не строка.
  • ключ "meta_query" - в параметре $meta_query мы можем указать параметры запроса по метаполям, и там же указать ключ для конкретного запроса. Этот ключ можно использовать как ключ для сортировки по соответствующему метаполю.
  • none - не сортировать

По умолчанию: "id"

order(строка)

Направление сортировки, указанной в параметре "orderby":

  • ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c);
  • DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a).

По умолчанию: "ASC"

Hide_empty(логический) Скрывать ли термины в которых нет записей. 1(true) - скрывать пустые, 0(false) - показывать пустые.
По умолчанию: true fields(строка)

Какие поля возвращать в результирующем массиве. Может быть:

  • all - Вернуть массив объектов (все данные) - по умолчанию;
  • ids - вернуть массив чисел;
  • names - вернуть массив строк.
  • count - (3.2+) возвращает количество найденных терминов.
  • id=>parent - вернуть массив, где ключ = ID термина, а значение = ID родительского термина.
  • id=>slug - вернуть массив, где ключ = ID термина, а значение = слаг (название для УРЛ) термина.
  • id=>name - вернуть массив, где ключ = ID термина, а значение = название (имя) термина.

По умолчанию: "all"

count(логический) true - вернет количество терминов. В этом случае, перебивает параметр fields .
false - вернет массив объектов терминов. name(строка/массив) Укажите тут строку или массив строк, чтобы получить термины с указанными названиями.
По умолчанию: "" slug(строка/массив) Укажите тут строку или массив строк, чтобы получить термины с указанными ярлыками (слагами).
По умолчанию: "" hierarchical(логический)

Включать ли в результат термины, которые имеют не пустые дочерние термины (в которых есть записи). Т.е. в массив будут включены пустые термины, если у их дочерних терминах есть записи, даже если аргумент " hide_empty " равен true .

  • true - да, включить;
  • false - нет, не включать.

По умолчанию: true

Search(строка) Поиск по названиям термина и его ярлыку. Получит термины в названиях которых есть вхождение указанной тут строки. Т.е. запрос выглядит так: LIKE "%search_string%" .
По умолчанию: "" name__like(строка) Показать термины, в названии которых есть указанная строка. Поиск по строке.
По умолчанию: "" description__like (строка) Показать термины, в описании которых есть указанная строка. Поиск по строке.
По умолчанию: "" pad_counts(логический)

Если передать true, то число которое показывает количество записей в родительских категориях будет суммой своих записей и записей из дочерних категорий. По умолчанию подсчитываются только свои записи.

pad_counts зависит от параметра parent потому что подсчет записей идет на уровне PHP и если например указать parent=0 , то будут получены только верхние термины и pad_counts не сможет правильно посчитать кол-во записей в дочерних терминах. Чтобы обойти это ограничение, нужно получить все термины, не указывая parent , а потом в PHP удалить ненужные... Вот пример такого кода:

$terms = get_terms(array("hide_empty" => 0, "orderby" => "name", "order" => "ASC", "taxonomy" => "category", "pad_counts" => 1)); // оставим только термины с parent=0 $terms = wp_list_filter($terms, array("parent"=>0));

По умолчанию: false

get(строка)

Если указать "all" то будут жёстко отключены параметры: childless , child_of , hide_empty , hierarchical и pad_counts . "Жёстко" - значит перебьет текущие установки для этих параметров. "Отключены" - значит им будет установлен параметр false или 0.

Обычно используется для удобства, когда нужно получить термины на низком уровне, не для вывода, а для дальнейшей работы с ними, чтобы не следить за значениями упомянутых параметров...

// фрагмент кода if ("all" == $args["get"]) { $args["childless"] = false; $args["child_of"] = 0; $args["hide_empty"] = 0; $args["hierarchical"] = false; $args["pad_counts"] = false; }

По умолчанию: ""

child_of(число)

ID родительского термина. Вывести элементы таксономии, которые являются дочерними разделами указанного элемента. Будут получены все уровни вложенности, все дерево.

Если указаны несколько таксономий, параметр будет проигнорирован.
По умолчанию: 0

Parent(число)

ID родительского термина, чтобы получить только прямых потомков.

Будет получен только первый уровень вложенности, а не все дерево как в параметре child_of . Если указать 0, то будут выведены термины верхнего уровня.
По умолчанию: ""

Term_taxonomy_id(число/массив) Укажите тут число или массив чисел, чтобы получить термины, у которых поле term_taxonomy_id совпадет с указанными значениями.
По умолчанию: "" cache_domain(строка) (3.2+) Позволяет установить уникальные ключ кэша, который будет использоваться в get_terms() при объектном кэшировании (object cache). Например, если вы используется один из фильтров get_terms(), чтобы изменить запрос (например "terms_clausses"), установив "cache_domain" в уникальное значение, позволить не перезаписывать сохраненный кэш для одинаковых запросов.
По умолчанию: "core" update_term_meta_cache(логический) true - загрузить кэш метаданных, чтобы потом их можно было быстро получить. Кэш подгружается для полученных элементов.
По умолчанию: true meta_query(массив) Запрос для получения элементов на основе метаданных. Смотрите WP_Meta_Query . meta_key(строка) Получит термины у которых есть указанное метаполе. Можно использовать в связке с meta_value .
По умолчанию: "" meta_value(строка) Получит термины у которых значение метаполя равно указанному значению. Всегда используется в связке с meta_key .
По умолчанию: "" suppress_filter(логический) Подавлять работу фильтров или нет? Если выставить в true, то фильтр get_terms просто не будет работать для текущего запроса терминов.
По умолчанию: false (фильтры работают)

Примеры

#1 Получим массив данных о всех категориях на сайте

Данные в массиве будут отсортированы по количеству записей (orderby=count) в каждой категории. Категории у которых нет записей все равно будут включены в массив (hide_empty=0).

$myterms = get_terms("category", "orderby=count&hide_empty=0");

#1.2 Получим все разделы ссылок:

$mylinks_categories = get_terms("link_category", "orderby=count&hide_empty=0");

#2 Выведем на экран список названий всех разделов таксономии "my_taxonomy":

$terms = get_terms("my_taxonomy"); if($terms && ! is_wp_error($terms)){ echo "
    "; foreach($terms as $term){ echo "
  • ". $term->name ."
  • "; } echo "
"; }

В данном примере каждый $term из цикла foreach($terms as $term) , будет содержать такую информацию:

=> 162 => Здоровье => zdorove => 0 => 170 => articles => => 0 => 2

#3 Вывод рубрик через разделитель

// получаем все термины из таксономии my_term $args = array("hide_empty=0"); $terms = get_terms("my_term", $args); // собираем их и выводим if (!empty($terms) && !is_wp_error($terms)) { $count = count($terms); $i=0; $term_list = "

"; foreach ($terms as $term) { $i++; $term_list .= "name) . "">" . $term->name . ""; if ($count != $i) { $term_list .= " · "; } else { $term_list .= "

"; } } echo $term_list; } /* в итоге получим подобный код: */

Код get terms : wp-includes/taxonomy.php VER 5.1.1

false,); /* * Legacy argument format ($taxonomy, $args) takes precedence. * * We detect legacy argument format by checking if * (a) a second non-empty parameter is passed, or * (b) the first parameter shares no keys with the default array (ie, it"s a list of taxonomies) */ $_args = wp_parse_args($args); $key_intersect = array_intersect_key($term_query->query_var_defaults, (array) $_args); $do_legacy_args = $deprecated || empty($key_intersect); if ($do_legacy_args) { $taxonomies = (array) $args; $args = wp_parse_args($deprecated, $defaults); $args["taxonomy"] = $taxonomies; } else { $args = wp_parse_args($args, $defaults); if (isset($args["taxonomy"]) && null !== $args["taxonomy"]) { $args["taxonomy"] = (array) $args["taxonomy"]; } } if (! empty($args["taxonomy"])) { foreach ($args["taxonomy"] as $taxonomy) { if (! taxonomy_exists($taxonomy)) { return new WP_Error("invalid_taxonomy", __("Invalid taxonomy.")); } } } // Don"t pass suppress_filter to WP_Term_Query. $suppress_filter = $args["suppress_filter"]; unset($args["suppress_filter"]); $terms = $term_query->query($args); // Count queries are not filtered, for legacy reasons. if (! is_array($terms)) { return $terms; } if ($suppress_filter) { return $terms; } /** * Filters the found terms. * * @since 2.3.0 * @since 4.6.0 Added the `$term_query` parameter. * * @param array $terms Array of found terms. * @param array $taxonomies An array of taxonomies. * @param array $args An array of get_terms() arguments. * @param WP_Term_Query $term_query The WP_Term_Query object. */ return apply_filters("get_terms", $terms, $term_query->query_vars["taxonomy"], $term_query->query_vars, $term_query); }

В продолжение темы:
Windows

Часть вторая : "Важнейшие характеристики каждого семейства процессоров Intel Core i3/i5/i7. Какие из этих чипов представляют особый интерес" Введение Сначала мы приведём...

Новые статьи
/
Популярные