Как я могу изменить URL через add_rewrite_rule()

Как из ссылки вида:

http://testsite/city/sochi/?listing_type=apartment

Я могу получить http://testsite/city/sochi/apartment

Метод предоставленный ниже не срабатывает для меня, в чем моя ошибка?

function custom_rewrite_rules() {
    flush_rewrite_rules();
    add_rewrite_rule('^city/(.*)/(.*)?', 'index.php?city=$matches[1]&listing_type=$matches[2]', 'top');

}
add_action('init', 'custom_rewrite_rules');

Ответы (1 шт):

Автор решения: KAGG Design

У вас внутри скобок может быть и /, что ломает регулярку. Вот рабочий код:

function custom_rewrite_rules() {
    add_rewrite_rule(
        '^city/([^/]*)/([^/]*)/?$',
        'index.php?city=$matches[1]&listing_type=$matches[2]',
        'top'
    );
}

add_action( 'init', 'custom_rewrite_rules' );

Вызов flush_rewrite_rules() очень ресурсоемкий, его нельзя ставить на каждую загрузку страницы. Он должен использоваться только в хуках, указанных в register_activation_hook() и register_deactivation_hook().

Для того, чтобы код начал работать, надо сбросить redirect в браузере. Для этого открыть Dev Tools (F12), а потом правой кнопкой мыши на обновление страницы и в меню выбрать Empty Cache and Hard Reload.

введите сюда описание изображения

Проверить, что код сработал, можно в отладчике. Видим, что $this->matched_rule содержит наше правило, а результирующий запрос находится в $query. Файл apart.php - это mu-plugin для теста.

введите сюда описание изображения

→ Ссылка