Удалить строку запроса из URL при редиректе – Плагин редиректа

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

Я пытаюсь удалить строку запроса из моих 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' );

Два замечания:

  1. Я не тестировал этот код.
  2. Я хотел отдать должное за простое 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, вам стоит рассмотреть возможность применения предложенным выше решений для повышения эффективности ваших редиректов. Не забывайте проверять обновления плагина, чтобы использовать новые функции и улучшения, которые могут еще больше упростить вашу задачу.

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

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