Изменение параметров URL для таксономии в WordPress

Вопрос или проблема

У меня есть две таксономии: Жанры и Поводы. Я хочу, чтобы мои параметры были “переведены” и обрабатывались так же, как и мои оригинальные параметры. В настоящее время они реагируют должным образом только на параметры, такие как ?tax-genre= и ?tax-occasion=.

Я использую эту функцию для перевода параметров:

public function translate_taxonomy_params() {
    $translated = [];

    if (isset($_REQUEST['genre'])) {
        if (is_array($_REQUEST['genre'])) {
            $translated['tax-genre'] = $_REQUEST['genre'];
        } else {
            $translated['tax-genre'] = [$_REQUEST['genre']];
        }
        unset($_REQUEST['genre']);
    }

    if (isset($_REQUEST['occasion'])) {
        if (is_array($_REQUEST['occasion'])) {
            $translated['tax-occasion'] = $_REQUEST['occasion'];
        } else {
            $translated['tax-occasion'] = [$_REQUEST['occasion']];
        }
        unset($_REQUEST['occasion']);
    }

    return array_merge($_REQUEST, $translated);
}

Хотя это работает для получения правильных записей на страницах архивов, это не устанавливает правильные флажки в боковой панели фильтров, несмотря на то, что мой запрос таксономии установлен правильно:

 [tax_query] => Array
        (
            [0] => Array
                (
                    [taxonomy] => genre
                    [field] => slug
                    [terms] => Array
                        (
                            [0] => thriller
                        )
                )
    )

Мой вопрос в том, как я могу сделать так, чтобы параметры URL вели себя так же, как оригинальные параметры? В частности, как можно интерпретировать ?genre=thriller в бэкенде как ?tax-genre=thriller на каждой странице/функции?

Я использую AJAX для фильтрации результатов и динамически обновляю URL с помощью jQuery, чтобы посетитель мог легко вернуться к своим предыдущим отфильтрованным результатам, если он откроет запись. Однако префикс “tax-” выглядит менее удобным для пользователя.

Любая помощь или предложения будут очень признательны!

Ответ или решение

Изменение параметров URL для таксономий в WordPress: Коррекция функциональности и повышение удобства использования

Введение

Вместо того чтобы просто полагаться на стандартные параметры таксономии ?tax-genre= и ?tax-occasion=, вы стремитесь к более удобной замене через использование ?genre= и ?occasion=. Данная статья направлена на решение вашей задачи, чтобы параметры URL обрабатывались так же, как и оригинальные. Это обеспечит не только более дружественный интерфейс для пользователей, но и упрощение работы с фильтрацией записей на вашем сайте.

Понимание Проблемы

Ваша функция translate_taxonomy_params() уже частично выполняет задачу корректного преобразования параметров. Однако, чтобы обеспечить единую работу с параметрами на всех страницах и во всех функциях, необходимо учитывать несколько дополнительных моментов, таких как обработка AJAX-запросов и синхронизация состояния чекбоксов в боковой панели фильтров.

Предложенное Решение

Для достижения вашей цели мы можем расширить функцию translate_taxonomy_params() и внести соответствующие изменения в AJAX-обработчики. Вот детальная пошаговая инструкция:

Шаг 1: Расширение функции translate_taxonomy_params()

Убедитесь, что ваша функция корректно обновляет $_REQUEST и работает с синтаксисом GET в WordPress:

public function translate_taxonomy_params() {
    $translated = [];

    if (isset($_REQUEST['genre'])) {
        $translated['tax-genre'] = (array) $_REQUEST['genre'];
        unset($_REQUEST['genre']);
    }

    if (isset($_REQUEST['occasion'])) {
        $translated['tax-occasion'] = (array) $_REQUEST['occasion'];
        unset($_REQUEST['occasion']);
    }

    // Обработка для поддержки множественных значений
    if (isset($_REQUEST['tax-genre'])) {
        $translated['genre'] = (array) $_REQUEST['tax-genre'];
    }

    if (isset($_REQUEST['tax-occasion'])) {
        $translated['occasion'] = (array) $_REQUEST['tax-occasion'];
    }

    return array_merge($_REQUEST, $translated);
}

Шаг 2: Обработка AJAX-запросов

Убедитесь, что ваши AJAX-запросы обрабатывают и переводят параметры, используя вашу функцию. Пример может выглядеть следующим образом:

add_action('wp_ajax_your_custom_ajax_action', 'your_custom_ajax_handler');
add_action('wp_ajax_nopriv_your_custom_ajax_action', 'your_custom_ajax_handler');

function your_custom_ajax_handler() {
    // Применение функции для перевода параметров
    $params = your_class_instance->translate_taxonomy_params();

    // Теперь вы можете использовать $params для вашего tax_query
    $query = new WP_Query(array(
        'tax_query' => array(
            array(
                'taxonomy' => 'genre',
                'field' => 'slug',
                'terms' => $params['tax-genre'] ?? array(),
            ),
            array(
                'taxonomy' => 'occasion',
                'field' => 'slug',
                'terms' => $params['tax-occasion'] ?? array(),
            ),
        ),
    ));

    // Ваш код для обработки результатов
    wp_send_json($query->posts);
}

Шаг 3: Обновление состояние чекбоксов

Для обновления состояния чекбоксов в боковой панели фильтров при загрузке страницы отправьте соответствующие параметры на клиент:

$(document).ready(function() {
    const urlParams = new URLSearchParams(window.location.search);
    const genres = urlParams.getAll('tax-genre');
    const occasions = urlParams.getAll('tax-occasion');

    // Установка состояния чекбоксов
    genres.forEach(genre => {
        $(`input[name='genre'][value='${genre}']`).prop('checked', true);
    });
    occasions.forEach(occasion => {
        $(`input[name='occasion'][value='${occasion}']`).prop('checked', true);
    });
});

Заключение

Теперь вы имеете полное решение для управления параметрами URL таксономий через более удобные и понятные имена. Важно провести квалифицированное тестирование этого решения, чтобы убедиться в его корректной работе на вашем сайте. Используйте представленный код как отправную точку для дальнейшей настройки и улучшения функциональности фильтрации. Это решение не только улучшит пользовательский опыт, но и обеспечит целостность обработки данных на серверной стороне.

Оцените материал
Добавить комментарий

Капча загружается...