Вопрос или проблема
У нас есть правила перезаписи:
add_action( 'init', function() {
add_rewrite_rule( 'app-api/v2/ecommerce/([a-z0-9-]+)[/]?$', 'index.php?p=$matches[1]&post_type=product' );
} );
для URL – www.domain.com/app-api/v2/ecommerce/14
. Мы загружаем пользовательский шаблон, используя хук template_include
для пользовательских правил.
Вышеуказанное работает хорошо, но по некоторым специфическим причинам клиент хочет использовать переменные запроса, чтобы новый URL имел форму www.domain.com/app-api/v2/ecommerce?pid=14
Что я пытаюсь достичь, это что-то вроде этого, что не работает.
add_action( 'init', function() {
$id = $_GET['pid'];
add_rewrite_rule( 'app-api/v2/ecommerce', "index.php?p={$id}&post_type=product" );
} );
Какой правильный способ добавить правило перезаписи с динамическими переменными запроса?
Прежде всего, ваш код не работает, потому что правила перезаписи нужно сбрасывать (функция flush_rewrite_rules), и их нужно сбрасывать при каждом изменении $id. В общем, это очень плохая идея, из соображений производительности.
Вам следует добавлять правило перезаписи только с post_type=product, так как вы хотите передать “p” как параметр $_GET
add_rewrite_rule( 'app-api/v2/ecommerce', "index.php?post_type=product" );
Затем в функции хука template_include ищите $_GET[‘pid’] и на основе этого выбирайте ваш шаблон
Надеюсь, это поможет
Судя по тому, что вы хотите сделать, похоже, что целевой URL не изменился, но формат URL, который вы хотите перезаписать, изменился, правильно?
Так что такие URL:
www.domain.com/app-api/v2/ecommerce/14
Теперь должны выглядеть так:
www.domain.com/app-api/v2/ecommerce?pid=14
Если это так, почему бы просто не изменить формат вашего оригинального правила перезаписи, если оно работало, на:
add_rewrite_rule( 'app-api/v2/ecommerce?pid=([a-z0-9-]+)[/]?$', 'index.php?p=$matches[1]&post_type=product' );
Ответ или решение
Чтобы правильно настроить правила переписывания URL с использованием переменных запроса в WordPress, необходимо учитывать несколько ключевых моментов. Давайте разберемся, как можно реализовать нужное правило для URL, чтобы вместо этого:
www.domain.com/app-api/v2/ecommerce/14
использовать следующую конструкцию:
www.domain.com/app-api/v2/ecommerce?pid=14
Шаг 1: Настройка правила переписывания URL
Для начала необходимо правильно добавить правило переписывания с учетом запросов. В вашем случае, правильный подход будет следующим:
add_action( 'init', function() {
add_rewrite_rule( 'app-api/v2/ecommerce', 'index.php?post_type=product', 'top' );
} );
Обратите внимание на то, что в расширении index.php
мы указываем только post_type=product
, поскольку переменные запроса будут переданы через URL.
Шаг 2: Обработка переменных запроса
Теперь нам нужно извлечь переменную pid
из запроса и использовать её для формирования необходимого ответа. Для этого воспользуемся хук-обработчиком template_include
:
add_action( 'template_include', function( $template ) {
if ( isset( $_GET['pid'] ) ) {
$product_id = intval( $_GET['pid'] ); // Приводим к целому числу для безопасности
// Здесь можно подключить специфичный шаблон или выполнить логику для обработки запроса
// Например:
$template = locate_template( 'my-custom-template.php' ); // Замените на ваш реальный шаблон
}
return $template;
} );
Шаг 3: Очистка правил переписывания
После внесения изменений в правила переписывания, необходимо выполнить сброс правил, чтобы изменения вступили в силу. Это можно сделать через панель администратора WordPress, просто перейдя в раздел «Настройки» -> «Постоянные ссылки» и нажав кнопку «Сохранить изменения».
Замечания
- Безопасность: Всегда используйте функции для проверки и фильтрации входящих переменных, как мы сделали с
intval()
, чтобы избежать проблем с безопасностью. - Оптимизация производительности: Не забывайте, что слишком частое применение
flush_rewrite_rules
может привести к ухудшению производительности. Лучше производить сброс правил только после внесения изменений в правила, а не при каждом запросе. - Резервные копии: Перед внесением изменений в ваш сайт всегда полезно делать резервные копии базы данных и файлов.
Следуя данной инструкции, вы сможете настроить корректные правила переписывания с переменными запроса, обеспечивая удобство работы с URL и безопасность вашего сайта.