Хук get_terms_orderby
в WordPress позволяет изменять параметр сортировки ORDER BY
в SQL-запросах при получении терминов через функции get_terms()
, get_categories()
, и wp_list_categories()
. Это полезно для гибкой настройки порядка отображения терминов по нужным полям.
apply_filters( 'get_terms_orderby', string $orderby, array $args, array $taxonomies );
Хук get_terms_orderby
фильтрует часть SQL-запроса, которая отвечает за сортировку терминов. Например, этот хук может быть использован для сортировки категорий по нестандартным правилам, например, по числовым значениям в названии или слаге.
Параметры
$orderby
(string): Часть SQL-запроса, отвечающая за сортировку, напримерt.name
илиt.slug
.$args
(array): Массив аргументов, переданных в функциюget_terms()
.$taxonomies
(array): Массив имен таксономий, по которым выполняется запрос.
Пример 1: Сортировка категорий по числовым значениям в слаге
Предположим, у нас есть категории, слаги которых начинаются с числа (например, 1-category
, 10-category
, 2-category
). При стандартной сортировке по слагу они будут упорядочены как 1
, 10
, 2
, 3
и так далее. Чтобы отсортировать их по натуральному порядку (1, 2, 3…10), можно применить фильтр get_terms_orderby
, изменив SQL-запрос.
// Устанавливаем фильтр для сортировки категорий по числовым значениям в слаге
add_filter( 'get_terms_orderby', 'sort_terms_by_slug_numeric', 10, 3 );
function sort_terms_by_slug_numeric( $orderby, $args, $taxonomies ) {
// Изменяем часть SQL-запроса для сортировки по числовым значениям
return 'CAST(t.slug AS UNSIGNED)';
}
// Получаем категории с кастомной сортировкой
$terms = get_terms( array(
'taxonomy' => 'category',
'orderby' => 'slug',
'hide_empty' => false,
) );
// Выводим категории
foreach ( $terms as $term ) {
echo esc_html( $term->name ) . '<br>';
}
// Удаляем фильтр после использования
remove_filter( 'get_terms_orderby', 'sort_terms_by_slug_numeric', 10 );
Пример 2: Сортировка терминов по дате создания
В этом примере мы добавим сортировку по дате создания термина, если таксономия — event_category
. Это полезно, если, например, для категорий событий требуется отображение в порядке их добавления.
add_filter( 'get_terms_orderby', 'sort_terms_by_date', 10, 3 );
function sort_terms_by_date( $orderby, $args, $taxonomies ) {
// Проверяем, что используем нужную таксономию
if ( in_array( 'event_category', $taxonomies ) ) {
return 't.term_id DESC'; // Сортируем по ID термина в порядке убывания
}
// Возвращаем стандартное значение для других таксономий
return $orderby;
}
// Получаем термины с новой сортировкой
$event_terms = get_terms( array(
'taxonomy' => 'event_category',
'hide_empty' => false,
) );
// Выводим термины
foreach ( $event_terms as $term ) {
echo esc_html( $term->name ) . ' — ID: ' . $term->term_id . '<br>';
}
// Удаляем фильтр после использования
remove_filter( 'get_terms_orderby', 'sort_terms_by_date', 10 );
Пример 3: Сортировка меток по длине названия
Иногда нужно отсортировать метки (post_tag
) по длине их названия. Это может быть полезно, например, для облака тегов, где сначала идут более короткие теги.
add_filter( 'get_terms_orderby', 'sort_tags_by_name_length', 10, 3 );
function sort_tags_by_name_length( $orderby, $args, $taxonomies ) {
// Проверяем, что таксономия является меткой
if ( in_array( 'post_tag', $taxonomies ) ) {
return 'LENGTH(t.name) ASC'; // Сортировка по длине имени тега в порядке возрастания
}
// Оставляем стандартное значение для других таксономий
return $orderby;
}
// Получаем метки с кастомной сортировкой
$tags = get_terms( array(
'taxonomy' => 'post_tag',
'hide_empty' => false,
) );
// Выводим отсортированные метки
foreach ( $tags as $tag ) {
echo esc_html( $tag->name ) . '<br>';
}
// Удаляем фильтр после использования
remove_filter( 'get_terms_orderby', 'sort_tags_by_name_length', 10 );
Пример 4: Сортировка пользовательских таксономий по произвольному полю
Для пользовательской таксономии product_type
, у каждого термина имеется произвольное поле popularity
, содержащее числовое значение популярности. В этом примере мы отсортируем термины по этому полю.
add_filter( 'get_terms_orderby', 'sort_product_types_by_popularity', 10, 3 );
function sort_product_types_by_popularity( $orderby, $args, $taxonomies ) {
// Проверяем таксономию
if ( in_array( 'product_type', $taxonomies ) ) {
global $wpdb;
// Сортируем по метаполю `popularity`
return "(SELECT meta_value FROM {$wpdb->termmeta} WHERE term_id = t.term_id AND meta_key = 'popularity')+0 DESC";
}
return $orderby;
}
// Получаем термины с кастомной сортировкой
$product_types = get_terms( array(
'taxonomy' => 'product_type',
'hide_empty' => false,
) );
// Выводим термины
foreach ( $product_types as $term ) {
echo esc_html( $term->name ) . ' — Популярность: ' . get_term_meta( $term->term_id, 'popularity', true ) . '<br>';
}
// Удаляем фильтр после использования
remove_filter( 'get_terms_orderby', 'sort_product_types_by_popularity', 10 );
Заключение
Хук get_terms_orderby
— мощный инструмент для кастомизации порядка сортировки терминов. С его помощью можно реализовать такие нестандартные функции, как сортировка по числовым значениям в слагах, длине названия, дате добавления и даже кастомным полям, что позволяет настроить отображение терминов под конкретные требования проекта.