Вопрос или проблема
Я создал плагин для WordPress для отображения событий.
Плагин разработан с помощью блока WordPress и работает нормально. URL к странице с подробностями: http://localhost:4444/?slug=02-12-2024_artist_name
Чтобы сделать его более читаемым, URL должен выглядеть так: http://localhost:4444/event/02-12-2024_artist_name
Я добавил этот код в свой скрипт plugin.php
add_action('init', function () {
add_rewrite_rule('event/([a-z0-9-]+)[/]?$', 'index.php?slug=$matches[1]', 'top');
add_rewrite_tag('%slug%', '([^&]+)');
error_log("Правила переписывания добавлены");
});
add_filter('query_vars', function ($query_vars) {
$query_vars[] = 'slug';
return $query_vars;
});
Но переписывание не работает корректно, и я получаю 404 “страница не найдена”.
Я пытался реализовать render.php второй раз (первый раз – через block.json), но я думаю, что это не тот путь, так как я не получил свои атрибуты
add_filter('template_include', function ($template) {
if (get_query_var('slug') == false || get_query_var('slug') == '') {
require_once plugin_dir_path(__FILE__) . 'src/render.php';
return $template;
}
});
Ответ или решение
Проблемы с add_rewrite_rule в WordPress: Решение и Оптимизация
Создание пользовательских URL-адресов в WordPress может быть сложной задачей, особенно если вы работаете с плагинами и хотите, чтобы они корректно обрабатывались. В вашем случае вы пытаетесь настроить «читаемый» URL в формате http://localhost:4444/event/02-12-2024_artist_name
, но получаете ошибку 404. Давайте разберем причины этой проблемы и как ее исправить.
1. Подключение к хукам
Первое, что стоит убедиться, это правильность подключения функций к хукам. Ваш код уже содержит следующий фрагмент:
add_action('init', function () {
add_rewrite_rule('event/([a-z0-9-]+)[/]?$', 'index.php?slug=$matches[1]', 'top');
add_rewrite_tag('%slug%', '([^&]+)');
error_log("Rewrite rules added");
});
Здесь вы добавляете правило перезаписи и тег для переменной slug
. Однако, для выполнения изменений вам необходимо сбросить перезапись правил. Сделать это можно, перейдя в админку WordPress: "Настройки" -> "Постоянные ссылки" и просто нажав на кнопку "Сохранить изменения". Это действие обновит правила перезаписи и должно решить проблему с 404.
2. Обработка пользовательских параметров в запросах
Вы также добавили фильтр для расширения переменных запроса:
add_filter('query_vars', function ($query_vars) {
$query_vars[] = 'slug';
return $query_vars;
});
Этот код выглядит корректно, так как он добавляет вашу переменную slug
в список переменных запроса. Убедитесь, что он выполняется до вызова вашего правила перезаписи.
3. Подключение шаблонов
Код, который вы привели для подключения шаблона, может быть проблематичным:
add_filter('template_include', function ($template) {
if (get_query_var('slug') === false || get_query_var('slug') == '') {
require_once plugin_dir_path(__FILE__) . 'src/render.php';
return $template;
}
});
Здесь проверяется наличие параметра slug
, но условие вероятно неверно. Вы хотите обработать случай, когда slug
существует. Попробуйте изменить условие следующим образом:
add_filter('template_include', function ($template) {
if (get_query_var('slug')) {
require_once plugin_dir_path(__FILE__) . 'src/render.php';
// Вернуть путь к шаблону, котрый вы и хотите использовать
return plugin_dir_path(__FILE__) . 'src/your-template-file.php';
}
return $template; // Возвращаем оригинальный шаблон, если slug не существует
});
4. Проверка наличия файла render.php
Убедитесь, что файл render.php
существует в указанной директории плагина, и корректно подключается. Это важный шаг для правильной работы вашего кода.
5. Тестирование и отладка
После внесения изменений не забудьте провести тестирование. Загружаем вашу страницу с новыми URL и отслеживаем ошибки в логах, которые может выдавать WordPress. Используйте error_log
для записи логов, что позволит вам понять, где произошла ошибка.
Заключение
Проблемы с перезаписью правила в WordPress могут быть трудными для устранения, но следуя приведенным выше рекомендациям, вы сможете оптимизировать ваш код и добиться нужного функционала. Если вы будете следить за тем, чтобы правильно обновлять правила перезаписи и точно обрабатывать запросы, вы сможете избежать распространенных ошибок и создать профессиональный, удобный для пользователя интерфейс на основе URL-адресов.