Вопрос или проблема
Я пытаюсь удалить строку запроса из моих URL при их перенаправлении, но она сохраняется. Я не могу правильно настроить регулярное выражение.
К тому же у меня есть несколько шаблонов, которые перенаправляют на разные URL, поэтому я не могу просто использовать .*
после howto.php
.
.htaccess
в этом случае не вариант, поэтому мне нужно выяснить, как сделать это в плагине Redirection.
Я хочу, чтобы /templates/howto.php?page=template-business-plan
перенаправлялся на
/business-plan
но я постоянно получаю /business-plan?page=template-business-plan
.
Я также использую этот плагин, поэтому решил заглянуть в код, чтобы посмотреть, могу ли я найти ответ.
Есть два действия, которые вы могли бы использовать для этого, которые могут сработать: redirection_first и redirection_last.
Оба принимают два аргумента: $url и $this (который является модулем WordPress для плагина перенаправления).
Вот фрагмент кода из модуля init() в \modules\wordpress.php
public function init() {
$url = $_SERVER['REQUEST_URI'];
// Убедитесь, что мы не пытаемся перенаправить что-то важное
if ( ! $this->protected_url( $url ) && $this->matched === false ) {
do_action( 'redirection_first', $url, $this );
$redirects = Red_Item::get_for_url( $url, 'wp' );
foreach ( (array) $redirects as $item ) {
if ( $item->matches( $url ) ) {
$this->matched = $item;
break;
}
}
do_action( 'redirection_last', $url, $this );
}
}
Таким образом, $url – это запрашиваемый вами URL, а в redirection_last $this->matched содержит ваш URL перенаправления. Я бы начал с redirection_start и мог бы выполнить что-то вроде:
function redirection_strip_query_string( $url="", $this ) {
if ( strpos( $url, '?page=" ) !== false ) {
$url = preg_replace("/\?.*/', '', $url);
}
}
add_action( 'redirection_first', 'redirection_strip_query_string' );
Два замечания:
- Я не тестировал этот код.
- Я хотел отдать должное за простое URL preg_replace
Я решил это, немного изменив код плагина, добавив два фильтра. Надеюсь, автор включит эти фильтры – 2 неразрушающих строк, так как они позволяют нам гораздо больше настраивать поведение плагина. Объяснено здесь подробно: https://github.com/johngodley/redirection/issues/180
ОБНВЛЕНИЕ: Этот мой “совет” был включен в upstream, в самом плагине, так что нет необходимости вносить какие-либо изменения: теперь у нас есть фильтры redirection_url_target
и redirection_url_source
, чтобы пользовательский код мог манипулировать источником и целью перенаправления для специальных целей.
Ответ или решение
Удаление строки запроса из URL при редиректе с помощью плагина Redirection
Если вы столкнулись с проблемой сохранения строки запроса при редиректе с помощью плагина Redirection в WordPress и хотите устранить этот недостаток, следующее руководство поможет вам найти оптимальное решение.
Проблема
Вы пытаетесь перенаправить URL, содержащий строку запроса, на более чистый и удобочитаемый вариант. Например, вам необходимо перенаправить:
/templates/howto.php?page=template-business-plan
на
/business-plan
Однако в процессе редиректа строка запроса сохраняется, и вы получаете:
/business-plan?page=template-business-plan
Решение через хуки плагина
Для решения этой проблемы вам потребуется использовать хуки плагина Redirection. В предыдущих версиях плагина можно было напрямую редактировать код модуля, что не всегда является лучшей практикой. Однако, начиная с новой версии плагина, были добавлены хуки redirection_url_target
и redirection_url_source
, позволяющие нам вмешиваться в процесс редиректа более безопасно и эффективно.
Пример кода
Вы можете добавить следующий код в файл functions.php
вашей темы или в кастомный плагин, чтобы удалить строку запроса при выполнении редиректа:
function custom_redirect_remove_query_string($url, $redirect) {
// Проверяем, содержит ли URL строку запроса
if (strpos($url, '?') !== false) {
// Удаляем строку запроса с помощью preg_replace
$url = preg_replace('/\?.*/', '', $url);
}
return $url;
}
add_filter('redirection_url_target', 'custom_redirect_remove_query_string', 10, 2);
Пояснение кода
В данной функции:
- Мы проверяем, есть ли в текущем URL строка запроса.
- Если строка запроса присутствует, мы используем регулярное выражение
preg_replace
для удаления её. - Затем возвращаем изменённый URL.
Этот подход гарантирует, что ваши редиректы будут работать корректно, поскольку функция будет автоматически обработкой всех URL, к которым применяются правила редиректа.
Заключение
С добавлением новых хуков в плагин Redirection вы можете легко управлять редиректами и удалять строки параметров из URL. Это улучшает читаемость ваших ссылок и способствует лучшему SEO, делая ваши страницы более удобными для пользователей и поисковых систем.
Если вы активно работаете с WordPress и используете плагин Redirection, вам стоит рассмотреть возможность применения предложенным выше решений для повышения эффективности ваших редиректов. Не забывайте проверять обновления плагина, чтобы использовать новые функции и улучшения, которые могут еще больше упростить вашу задачу.