В этой статье подробно разберём, как создать и использовать собственный метод WPEXPERTS_get_terms для динамической загрузки категорий (терминов таксономий) в WordPress. Часто при разработке тем и плагинов возникает задача получить категории с гибкими параметрами и кешированием, чтобы минимизировать нагрузку на базу данных и оптимизировать работу сайта. Мы рассмотрим практический пример с реализацией метода, примерами его вызова и использования в AJAX-запросах.
Зачем создавать собственный метод для получения категорий?
Функция get_terms в WordPress даёт широкий функционал, но при частом вызове с одними и теми же параметрами она может создавать излишнюю нагрузку на базу данных. Кроме того, в стандартной реализации не всегда удобно централизованно управлять параметрами запроса и обработкой ошибок.
Создание обёртки типа WPEXPERTS_get_terms позволяет:
- Централизовать логику получения терминов с учётом специфики проекта
- Добавить кеширование результатов для ускорения повторных запросов
- Упростить вызов с предустановленными параметрами
- Обрабатывать ошибки и возвращать удобный формат данных
Такой подход особенно полезен в больших проектах, где категории активно используются в фильтрах, меню и AJAX-запросах.
Реализация метода WPEXPERTS_get_terms с кешированием
Ниже пример реализации функции, которая принимает параметры таксономии и аргументы запроса, возвращая категории с кешированием на уровне объекта (transient можно добавить дополнительно):
function WPEXPERTS_get_terms($taxonomy = 'category', $args = array()) {
// Ключ для кеша на основе параметров
$cache_key = 'wpexperts_terms_' . md5($taxonomy . serialize($args));
// Проверяем кеш
$terms = get_transient($cache_key);
if ($terms !== false) {
return $terms;
}
// Устанавливаем дефолтные параметры
$default_args = array(
'hide_empty' => true,
'orderby' => 'name',
'order' => 'ASC',
'fields' => 'all',
);
$args = wp_parse_args($args, $default_args);
// Получаем термины
$terms = get_terms($taxonomy, $args);
// Обработка ошибок
if (is_wp_error($terms)) {
return array();
}
// Кешируем результат на 12 часов (43200 секунд)
set_transient($cache_key, $terms, 43200);
return $terms;
}
В этом примере мы используем API transient для кеширования результата, что значительно снижает число запросов к базе при повторных вызовах с одинаковыми параметрами. Это особенно актуально, если категории часто используются в меню или фильтрах.
Пример вызова функции
Чтобы получить все категории с пустыми исключениями и сортировкой по имени:
$categories = WPEXPERTS_get_terms('category', array('hide_empty' => false));
foreach ($categories as $cat) {
echo '<li>' . esc_html($cat->name) . '</li>';
}
Использование WPEXPERTS_get_terms в AJAX-запросах для динамических фильтров
Часто интерфейс сайта требует динамической подгрузки категорий для фильтрации контента без перезагрузки страницы. Рассмотрим, как использовать наш метод вместе с AJAX в WordPress.
Добавление AJAX-обработчика в functions.php
add_action('wp_ajax_wpexperts_get_categories', 'wpexperts_ajax_get_categories');
add_action('wp_ajax_nopriv_wpexperts_get_categories', 'wpexperts_ajax_get_categories');
function wpexperts_ajax_get_categories() {
// Проверка nonce для безопасности (если нужно)
// if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'wpexperts_nonce')) {
// wp_send_json_error('Ошибка безопасности');
// }
$taxonomy = isset($_POST['taxonomy']) ? sanitize_text_field($_POST['taxonomy']) : 'category';
$hide_empty = isset($_POST['hide_empty']) ? filter_var($_POST['hide_empty'], FILTER_VALIDATE_BOOLEAN) : true;
$terms = WPEXPERTS_get_terms($taxonomy, array('hide_empty' => $hide_empty));
$result = array();
foreach ($terms as $term) {
$result[] = array(
'id' => $term->term_id,
'name' => $term->name,
'slug' => $term->slug
);
}
wp_send_json_success($result);
}
JavaScript для вызова AJAX и отображения категорий
Добавьте на страницу следующий JS-код, например, в файл темы или через wp_enqueue_script:
jQuery(document).ready(function($) {
$('#wpexperts-load-categories').on('click', function() {
$.ajax({
url: ajaxurl, // В админке WordPress ajaxurl определён по умолчанию
method: 'POST',
data: {
action: 'wpexperts_get_categories',
taxonomy: 'category',
hide_empty: false
// nonce: '...' // если используете nonce
},
success: function(response) {
if(response.success) {
var html = '';
$.each(response.data, function(index, category) {
html += '<li>' + category.name + '</li>';
});
$('#wpexperts-categories-list').html(html);
} else {
alert('Ошибка загрузки категорий');
}
},
error: function() {
alert('Ошибка AJAX-запроса');
}
});
});
});
В HTML добавьте кнопку и контейнер для списка:
<button id="wpexperts-load-categories">Загрузить категории</button>
<ul id="wpexperts-categories-list"></ul>
Оптимизация и расширение метода WPEXPERTS_get_terms
Наш метод можно дополнить следующими улучшениями для более гибкой работы:
- Добавить параметр для сброса кеша (force refresh)
- Реализовать кеширование в объектном кеше (Object Cache) при наличии, чтобы ускорить работу на многосерверных конфигурациях
- Добавить возможность фильтрации терминов по метаполям с помощью
meta_query - Поддержать разные форматы возвращаемых данных — массивы с id и названием, или полные объекты терминов
Пример расширения функции для сброса кеша:
function WPEXPERTS_get_terms($taxonomy = 'category', $args = array(), $force_refresh = false) {
$cache_key = 'wpexperts_terms_' . md5($taxonomy . serialize($args));
if (!$force_refresh) {
$terms = get_transient($cache_key);
if ($terms !== false) {
return $terms;
}
}
$default_args = array(
'hide_empty' => true,
'orderby' => 'name',
'order' => 'ASC',
'fields' => 'all',
);
$args = wp_parse_args($args, $default_args);
$terms = get_terms($taxonomy, $args);
if (is_wp_error($terms)) {
return array();
}
set_transient($cache_key, $terms, 43200);
return $terms;
}
Применение с продуктами WPShop
Если вы используете продукты WPShop, например, тему Root или плагин Clearfy Pro, можно интегрировать этот метод в фильтры и оптимизацию запросов. Например, Clearfy Pro позволяет дополнительно кэшировать и оптимизировать запросы к базе, что отлично сочетается с кешированием терминов.
Используйте WPEXPERTS_get_terms как базу для создания удобных и быстрых фильтров категорий в ваших проектах на WordPress.