Intereting Posts
Автоматически прокручивается код с недавним заголовком? comment_for () Пользовательские поля не отображаются при входе пользователя в систему как программно менять теги сообщений Условные теги помогают (если их нет, ничего не отображаются) Как я могу отображать и вычитать все страницы с мета-ключами и meta_value на index.php? Возможно ли синхронизировать навигационные меню на нескольких сайтах WordPress? Использование цикла внутри администратора Отображение сообщений по категории Загрузка пользовательских типов сообщений в полнофункциональный календарь на основе jQuery? WPDB для учета почтовых сообщений Проблема с слайдером в wordpress Есть ли способ переименовать или скрыть wp-login.php? Что я могу ожидать при переходе от размещенного (WordPress.com) блога к одному, размещенному на странице. WP_Query – фильтр или напрямую? Удаление элемента меню не удаляется при редактировании сообщения.

Использование wp_redirect и .htaccess для повторного маршрута поиска (и передачи оставшихся GET-варов)

Я пытаюсь использовать wp_redirect() для перенаправления поиска в формат, который я установил в .htaccess . К сожалению, у меня проблемы с этим.

Мне нужно перенаправить поиск в ряд папок, а затем добавить оставшиеся параметры к концу URL-адреса, конечный результат будет выглядеть так:

 http://www.xxxxxxx.com/search/Used/MT/Billings/?s=BMW&z=59105&r=150&m=150000&pmin=1000&pmax=30000&submit=Refine 

Я написал эту функцию до сих пор:

 function redirect_search() { $var_status = var_status(); $var_ci = var_ci(); $var_st = var_st(); if (is_search() && !empty($_GET['s'])) { wp_redirect(home_url("/search/".$var_status.'/'.$var_ci.'/'.$var_st)); exit(); } } add_action('template_redirect', 'redirect_search' ); 

Эта функция приводит к тому, что URL выглядит следующим образом: http://www.xxxxxxx.com/search/New/Billings/MT

Я добавил в него параметры, и функция выглядит так:

 function redirect_search() { $var_status = var_status(); $var_ci = var_ci(); $var_st = var_st(); $zip = var_z(); $radius = var_r(); if (is_search() && !empty($_GET['s'])) { wp_redirect(home_url("/search/".$var_status.'/'.$var_ci.'/'.$var_st.'/?s='.get_search_query().'&z='.$zip.'&r='.$radius.'etc... etc...')); exit(); } } add_action('template_redirect', 'redirect_search' ); 

К сожалению, этот подход, похоже, отменяет созданные папки, и полученный URL-адрес выглядит следующим образом:

 http://www.xxxxxxx.com/search/?s=BMW&z=59101 

Любые идеи о том, как получить как папки, так и параметры там? Благодаря!

* haha ​​* Это на самом деле довольно забавно. Вы буквально стреляли в ногу.

Посмотрите на ссылку source-code link-template.php 1922 :

 if ( ! empty( $path ) && is_string( $path ) && strpos( $path, '..' ) === false ) 

Последнее условие strpos( $path, '..' ) на самом деле совпадает с .'etc... etc...' В вашем примере. Параметр $path в home_url() проверяется на наличие каких-либо .. чтобы предотвратить атаки обхода каталога. Параметр $path добавляется только к URL-адресу, если он не содержит никаких '..' . Просто удалите это, и вы сделаете еще один шаг вперед.

Следующим шагом является то, что любой url, содержащий /search/anything-else , рассматривается как страница результатов поиска в wordpress. Образец по умолчанию – search/(.+)/?$ Вы можете увидеть это, установив плагин анализатора перезаписи и просто отфильтруйте для search/anything-else строк search/anything-else .

Поэтому вам нужно убедиться, что url /search/Used/MT/Billings/ фактически запускает вашу логику поиска здесь вместо поиска wordpress. В противном случае ваш поисковый url в форме /search/test/test/test4/?s=asdasd&z=test&r=test фактически создал цикл перенаправления, потому что вы используете версию permalink /search/term вместе с версией параметра $_GET ?s=term .

На самом деле это не часть вашего вопроса, а только то, что вы считаете: даже если перенаправление работает правильно в первой части, wordpress может решить переформатировать URL-адрес в pageload после перенаправления, потому что он не распознает ваш поисковый URL-адрес структуры, поэтому вам нужно будет убедиться, что ваша логика выполняется на всех этих URL-адресах, прежде чем wordpress сделает это.

Например, вы можете добавить собственное правило перезаписи с помощью add_rewrite_rule () или перехватить действие parse_request (что является хорошим действием для обработки настраиваемых параметров url, на мой взгляд). Конечно, вы могли бы также обработать этот внешний (до wordpress) путем добавления некоторых настраиваемых материалов в .htacces или даже путем добавления структуры /search/Used/MT/Billings/index.php (это может быть самым простым способом, но я не рекомендовал бы эту причину, которая может быть переопределена путем выполнения обновления WordPress позже).


редактировать

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

 RewriteEngine On RewriteRule ^search/(.*)/(.*)/(.*)/page/([1-9]) /page/$4/?status=$1&st=$2&ci=$3 [QSA] RewriteRule ^search/(.*)/(.*)/(.*)/ /?status=$1&st=$2&ci=$3 [QSA] 

Это правило будет внутренне переписать этот URL:

 /search/Used/MT/Billings/?s=BMW&z=59105&r=150&m=150000&pmin=1000&pmax=30000&submit=Refine 

К этому URL-адресу (который, по моему мнению, нуждается в форме Relevanssi):

 ?status=Used&st=MT&ci=Billings&s=BMW&z=59105&r=150&m=150000&pmin=1000&pmax=30000&submit=Refine 

Вы можете захотеть заменить (.*) некоторые более конкретные регулярные выражения, касающиеся возможного содержимого ваших запросов.