Вопрос или проблема
В общем, у меня есть страница WordPress под названием игры. На этой странице у меня есть список записей пользовательского типа. Используя форму и немного магии $_GET, пользователь может фильтровать записи по тегам, а также по первой букве в заголовке.
Базовый URL для страницы:
localhost/gamesite/games/
URL для фильтра выглядит так:
localhost/gamesite/games/?genre=audio-and-video&platform=ps3&alpha=A
Желаемая структура URL должна выглядеть так:
localhost/gamesite/games/audio-and-video/ps3/?alpha=A
Я хочу использовать родное API WordPress для установки этих правил, вместо того чтобы взламывать файл htaccess. После прочтения нескольких постов, я не могу создать какую-либо рабочую форму желаемой структуры URL. Более важно, чем иметь конечный код, мне хотелось бы понять, как этот процесс работает. Любая помощь будет весьма признательна.
Вот хорошее объяснение того, как осуществляется переписывание в WP:
http://ottopress.com/2010/category-in-permalinks-considered-harmful/
Также стоит обратить внимание на похожие вопросы:
Ответ или решение
Для решения вашей задачи по созданию пользовательских правил переписывания URL в WordPress, я предлагаю следовать следующему пошаговому подходу.
Шаг 1: Регистрация пользовательских правил переписывания
Сначала нужно зарегистрировать новые правила переписывания для вашего пользовательского типа записи (custom post type) и добавить нужные вам параметры. Это можно сделать в файле вашей темы, например, в functions.php
.
add_action('init', function() {
add_rewrite_rule('^games/([^/]+)/([^/]+)/?$', 'index.php?pagename=games&genre=$matches[1]&platform=$matches[2]', 'top');
});
Этот код создает правило, которое срабатывает на URL в формате games/genre/platform/
и передает параметры genre
и platform
в запрос.
Шаг 2: Обработка пользовательских запросов
После того как вы зарегистрировали правило переписывания, следующий шаг — это обработка запроса и извлечение параметров. Для этого вам нужно использовать хук query_vars
.
add_filter('query_vars', function($vars) {
$vars[] = 'genre';
$vars[] = 'platform';
return $vars;
});
Шаг 3: Настройка отображения постов на странице
Теперь вам нужно использовать полученные параметры для фильтрации ваших постов. В файле шаблона страницы games.php
вы можете использовать get_query_var()
для получения значений и выполнения соответствующего запроса.
$genre = get_query_var('genre');
$platform = get_query_var('platform');
$alpha = isset($_GET['alpha']) ? sanitize_text_field($_GET['alpha']) : '';
// Создание WP_Query для фильтрации постов
$args = array(
'post_type' => 'your_custom_post_type', // замените на ваш тип записи
'meta_query' => array(
array(
'key' => 'genre', // замените на имя поля для жанра
'value' => $genre,
'compare' => '='
),
array(
'key' => 'platform', // замените на имя поля для платформы
'value' => $platform,
'compare' => '='
),
),
's' => $alpha // фильтрация по первой букве
);
$query = new WP_Query($args);
Этот код создаст новый запрос для получения постов по выбранному жанру и платформе, а также фильтрует по первой букве названия.
Шаг 4: Обновление постоянных ссылок
После добавления новых правил переписывания необходимо обновить структуру постоянных ссылок. Это можно сделать в админке WordPress, перейдя в раздел "Настройки" → "Постоянные ссылки" и просто нажав кнопку "Сохранить изменения" без внесения каких-либо изменений.
Шаг 5: Тестирование
Теперь вы можете протестировать вашу новую структуру URL. Попробуйте перейти по URL вроде localhost/gamesite/games/audio-and-video/ps3/?alpha=A
и убедиться, что посты фильтруются корректно.
Заключение
Этот процесс включает в себя регистрацию правил переписывания, добавление переменных в запрос, настройку отображения через WP_Query
и обновление структуры постоянных ссылок. Вы можете дополнительно изучить документацию WordPress для более глубокого понимания работы с переписываниями и запросами:
Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их!