Перенаправление старых слагов в WordPress: WP_OLD_SLUG_REDIRECT()

# WP_OLD_SLUG_REDIRECT() │ WP 2.1.0

Эта функция перенаправляет старые слаги на правильные ссылки. 

Она пытается найти текущий слаг на основе предыдущих значений.

## Использует

Функции:
- _find_post_by_old_slug()
- _find_post_by_old_date()

**Производительность:** 
- 1 раз — 0.000717 сек (медленно) 
- 50000 раз — 21.05 сек (медленно) 
- PHP 7.2.5, WP 4.9.8

## Хуки, используемые в функции

- old_slug_redirect_post_id
- old_slug_redirect_url

## Результат

Функция ничего не возвращает (null).

## Использование

Функция вызывается следующим образом:
```php
wp_old_slug_redirect();

Примеры

Отключение перенаправлений от старых слагов (POST_NAMES)

По умолчанию, когда вы заходите на отдельную страницу поста, WordPress делает запрос к базе данных и проверяет все мета-поля с названием _wp_old_slug для всех постов. Если находится совпадение, текущий запрос считается старым URL поста, и происходит перенаправление на новый URL.

Если вам это поведение не требуется (что не рекомендуется), вы можете отключить такие перенаправления следующим образом:

remove_action('template_redirect', 'wp_old_slug_redirect');

Для выполнения запроса используется функция _find_post_by_old_slug().

Изменения

Функция была добавлена в версии 2.1.0.

Код функции WP_OLD_SLUG_REDIRECT

Вы можете найти код функции в файле wp-includes/query.php.

function wp_old_slug_redirect() {
    if (is_404() && '' !== get_query_var('name')) {
        // Определяем тип поста на основе переменных запроса.
        if (get_query_var('post_type')) {
            $post_type = get_query_var('post_type');
        } elseif (get_query_var('attachment')) {
            $post_type = 'attachment';
        } elseif (get_query_var('pagename')) {
            $post_type = 'page';
        } else {
            $post_type = 'post';
        }

        if (is_array($post_type)) {
            if (count($post_type) > 1) {
                return;
            }
            $post_type = reset($post_type);
        }

        // Не перенаправлять для иерархических типов постов.
        if (is_post_type_hierarchical($post_type)) {
            return;
        }

        $id = _find_post_by_old_slug($post_type);

        if (!$id) {
            $id = _find_post_by_old_date($post_type);
        }

        /**
         * Фильтр для ID поста, на который происходит перенаправление.
         *
         * @param int $id ID поста для перенаправления.
         */
        $id = apply_filters('old_slug_redirect_post_id', $id);

        if (!$id) {
            return;
        }

        $link = get_permalink($id);

        if (get_query_var('paged') > 1) {
            $link = user_trailingslashit(trailingslashit($link) . 'page/' . get_query_var('paged'));
        } elseif (is_embed()) {
            $link = user_trailingslashit(trailingslashit($link) . 'embed');
        }

        /**
         * Фильтр для URL перенаправления старого слага.
         *
         * @param string $link URL перенаправления.
         */
        $link = apply_filters('old_slug_redirect_url', $link);

        if (!$link) {
            return;
        }

        wp_redirect($link, 301); // Постоянное перенаправление.
        exit;
    }
}

Связанные функции

SEO

  • wp_robots()

Перенаправления

  • auth_redirect()
  • wp_redirect()
  • wp_safe_redirect()
  • wp_sanitize_redirect()
  • wp_validate_redirect()

Таким образом, мы узнали, как работает функция wp_old_slug_redirect() и как её можно использовать или отключить, если это необходимо. Надеюсь, этот материал помог вам лучше понять процесс перенаправления старых слагов в WordPress!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *