Вопрос или проблема
Я использую этот пример, чтобы переписать URL для загрузки файла car-details.php
, но по-прежнему получаю ошибку Страница не найдена при доступе domain.com/account/account_page/9. Как это исправить?
class Your_Class
{
public function init()
{
add_filter( 'template_include', array( $this, 'include_template' ) );
add_filter( 'init', array( $this, 'rewrite_rules' ) );
}
public function include_template( $template )
{
// Попытаемся получить переменную запроса, которую мы зарегистрировали в нашей функции query_vars()
$account_page = get_query_var( 'account_page' );
// Если переменная запроса содержит данные, мы на правильной странице, загружаем наш пользовательский шаблон
if ( $account_page ) {
return CUSTOMER_CAR_PLUGIN_DIR.'pages/customer-car-details.php';
}
return $template;
}
public function flush_rules()
{
$this->rewrite_rules();
flush_rewrite_rules();
}
public function rewrite_rules()
{
add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
add_rewrite_tag( '%account_page%', '([^&]+)' );
}
}
add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );
// Функции однократной активации
register_activation_hook( CUSTOMER_CAR_PLUGIN_DIR, array( new Your_Class, 'flush_rules' ) );
}
Вместо добавления query_vars
с помощью add_rewrite_tag()
, используйте хук фильтра query_vars
. Я использовал следующий код для тестирования вашего маршрута, и он работает отлично.
class OP_Plugin {
public function init() {
add_action( 'init', array( $this, 'add_rewrite_rules' ) );
add_filter( 'query_vars', array( $this, 'add_query_vars' ) );
add_filter( 'template_include', array( $this, 'add_template' ) );
}
public function add_template( $template ) {
$account_page = get_query_var( 'account_page' );
if ( $account_page ) {
echo "Работает! \n";
echo "Запрос: {$account_page}";
// return CUSTOMER_CAR_PLUGIN_DIR.'pages/customer-car-details.php';
return '';
}
return $template;
}
public function flush_rules() {
$this->rewrite_rules();
flush_rewrite_rules();
}
public function add_rewrite_rules() {
add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top' );
}
public function add_query_vars( $vars ) {
$vars[] = 'account_page';
return $vars;
}
}
$op_plugin = new OP_Plugin();
$op_plugin->init();
Ответ или решение
Вопрос, поднятый в контексте маршрутизации в WordPress, связанный с переписыванием URL и загрузкой файла car-details.php
, отражает типичную проблему, с которой могут столкнуться разработчики, разрабатывающие пользовательские плагины для WordPress. Проблема заключается в том, что несмотря на внедрение кода для настройки маршрутизации, пользователь все равно сталкивается с ошибкой "Страница не найдена" при попытке доступа к URL domain.com/account/account_page/9
.
Чтобы разобраться в этой проблеме и предложить решение, рассмотрим основные аспекты маршрутизации в WordPress, некоторые примеры и их применение на практике.
Теория
Маршрутизация в WordPress основана на использовании правил переписывания (rewrite rules), которые позволяют преобразовать пользовательский URL в набор параметров запроса, которые затем могут быть использованы для загрузки определенного шаблона. Этот процесс включает в себя три ключевых этапа:
-
Создание правил переписывания (Rewrite Rules): Это набор регулярных выражений и соответствующих им шаблонов запросов, которые определяют, как будет интерпретироваться пользовательский URL. Они добавляются через функцию
add_rewrite_rule()
. -
Добавление переменных запроса (Query Vars): Переменные запроса обеспечивают доступ к частям URL, которые могут быть использованы в шаблонах или логике обработки запросов. Они регистрируются с использованием фильтра
query_vars
. -
Определение шаблона (Template Include): На основании переменных запроса решается, какой файл шаблона должен быть загружен. Это реализуется с помощью фильтра
template_include
.
Пример
Из предложенного вами кода видно, что вы добавили необходимые действия для добавления правил переписывания и шаблонов. Однако проблема может заключаться в нескольких деталях реализации. Приведём правильно сконструированный пример на основе предоставленного описания:
class Custom_Route_Plugin {
public function init() {
add_action( 'init', array( $this, 'add_rewrite_rules' ) );
add_filter( 'query_vars', array( $this, 'add_query_vars' ) );
add_filter( 'template_include', array( $this, 'include_template' ) );
}
public function include_template( $template ) {
$account_page = get_query_var( 'account_page' );
if ( $account_page ) {
return plugin_dir_path(__FILE__) . 'templates/car-details.php';
}
return $template;
}
public function flush_rewrite_rules() {
$this->add_rewrite_rules();
flush_rewrite_rules();
}
public function add_rewrite_rules() {
add_rewrite_rule( '^account/([^/]*)/?', 'index.php?account_page=$matches[1]', 'top' );
}
public function add_query_vars( $vars ) {
$vars[] = 'account_page';
return $vars;
}
}
$custom_route_plugin = new Custom_Route_Plugin();
$custom_route_plugin->init();
register_activation_hook( __FILE__, array( $custom_route_plugin, 'flush_rewrite_rules' ) );
Важные моменты, которые следует отметить:
- На этапе добавления переменных запроса используется фильтр
query_vars
, который отвечает за их регистрацию и делает доступными. - Убедитесь, что путь к файлу
car-details.php
указан правильно. В примере используетсяplugin_dir_path(__FILE__)
для получения полного пути к файлу. - После ремонта кода необходимо обновить правила переписывания, что достигается вызовом
flush_rewrite_rules()
. Это важно делать после активации плагина, чтобы изменения вступили в силу.
Применение
Если при доступе к URL продолжается отображение ошибки "Страница не найдена", используйте следующие шаги для диагностики и устранения проблемы:
-
Проверка перезаписи правил: После внесения изменений в код плагина выполните процедуру сброса правил перезаписи. Для этого включите фрагмент кода
flush_rewrite_rules()
. -
Убедитесь в регистрация переменных запроса: Фильтр
query_vars
должен корректно регистрировать переменные, и их названия должны совпадать с используемыми в логике обработки. -
Диагностика журнала: Добавьте временные инструкции
echo
илиerror_log()
в ваш код для проверки, какой шаблон загружается и какие переменные запроса сохраняются. -
Проверка регулярных выражений: Правила переписывания используют регулярные выражения, которые могут не соответствовать реальной структуре URL. Проверьте их корректность.
-
Права доступа к файлам: Убедитесь, что PHP имеет надлежащие права доступа для чтения файла
car-details.php
.
Следуя этим рекомендациям, вы сможете добиться корректной работы пользовательского маршрута в WordPress. Подобные задачи требуют понимания внутренней работы WordPress и умения корректно интегрировать пользовательские решения в существующую систему.