WPExperts

Как использовать метод WPEXPERTS_get_terms для динамической загрузки категорий в WordPress

В этой статье подробно разберём, как создать и использовать собственный метод 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.

×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »