Маршрутизация в WordPress

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

Я использую этот пример, чтобы переписать 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 в набор параметров запроса, которые затем могут быть использованы для загрузки определенного шаблона. Этот процесс включает в себя три ключевых этапа:

  1. Создание правил переписывания (Rewrite Rules): Это набор регулярных выражений и соответствующих им шаблонов запросов, которые определяют, как будет интерпретироваться пользовательский URL. Они добавляются через функцию add_rewrite_rule().

  2. Добавление переменных запроса (Query Vars): Переменные запроса обеспечивают доступ к частям URL, которые могут быть использованы в шаблонах или логике обработки запросов. Они регистрируются с использованием фильтра query_vars.

  3. Определение шаблона (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 продолжается отображение ошибки "Страница не найдена", используйте следующие шаги для диагностики и устранения проблемы:

  1. Проверка перезаписи правил: После внесения изменений в код плагина выполните процедуру сброса правил перезаписи. Для этого включите фрагмент кода flush_rewrite_rules().

  2. Убедитесь в регистрация переменных запроса: Фильтр query_vars должен корректно регистрировать переменные, и их названия должны совпадать с используемыми в логике обработки.

  3. Диагностика журнала: Добавьте временные инструкции echo или error_log() в ваш код для проверки, какой шаблон загружается и какие переменные запроса сохраняются.

  4. Проверка регулярных выражений: Правила переписывания используют регулярные выражения, которые могут не соответствовать реальной структуре URL. Проверьте их корректность.

  5. Права доступа к файлам: Убедитесь, что PHP имеет надлежащие права доступа для чтения файла car-details.php.

Следуя этим рекомендациям, вы сможете добиться корректной работы пользовательского маршрута в WordPress. Подобные задачи требуют понимания внутренней работы WordPress и умения корректно интегрировать пользовательские решения в существующую систему.

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

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