Как работает функция redirect_canonical() в WordPress: руководство

## REDIRECT_CANONICAL() ─ WP 2.3.0

Функция redirect_canonical() перенаправляет входящие ссылки на правильный URL-адрес на основе адреса вашего сайта.

Когда поисковые системы видят различные URL-адреса, такие как www.somedomain.com и somedomain.com, они могут считать их разными страницами, даже если они ведут на одну и ту же. Эта функция помогает избежать наказания за дублированный контент, перенаправляя все входящие ссылки на один из этих адресов.

Функция не будет перенаправлять для таких страниц, как ленты, трэкбэки, поисковые запросы и администраторские URL-адреса. Она также не работает с запросами POST и н��которыми другими форматами.

Если пользователь вводит несуществующий URL, функция попытается определить правильную страницу.

### Места, где применяется функция

- wp_signup_location
- redirect_canonical

### Возвращаемое значение

Функция возвращает строку, которая представляет собой URL-адрес, на который нужно перенаправить.

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

```php
redirect_canonical( $requested_url, $do_redirect );
  • $requested_url (строка): Запрашиваемый URL-адрес, необходим для определения необходимости перенаправления.
    • По умолчанию: null
  • $do_redirect (логический): Осуществлять ли перенаправление на новый URL.
    • По умолчанию: true

Примеры

Пример 1: Отключение перенаправления на постах при пагинации

По умолчанию WordPress перенаправляет на главную страницу поста, когда вы пытаетесь перейти на страницу пагинации поста. Если в посте нет страниц пагинации, это поведение не всегда нужно.

Например, если мы создадим модуль для постов, и нам нужно, чтобы URL пагинации работал как /mypage/page/2. Функция запустит перенаправление на /mypage/, но это нам не нужно:

// Отключим перенаправление на страницах, потому что /page/2 перенаправляет на /
add_filter( 'redirect_canonical', 'page_disable_redirect_canonical' );

function page_disable_redirect_canonical( $redirect_url ) {
    if( is_paged() ) {
        $redirect_url = false;
    }
    return $redirect_url;
}

Пример 2: Полное отключение функции канонических перенаправлений

Этот код полностью отключает функциональность канонических перенаправлений:

remove_action( 'template_redirect', 'redirect_canonical' );

Пример 3: Удаление перенаправления для публичного параметра, такого как 'year' в пользовательской таксономии

Если у вас есть ссылка типа /?event_category=xxx&year=2017:

  • Если не добавлять этот фильтр, произойдет перенаправление на /2017/.
  • Если использовать этот фильтр, останется на странице /?event_category=xxx.

Этот код полезен для создания фильтра в таксономиях.

add_filter( 'redirect_canonical', 'pick_event_year_redirect', 10 );

function pick_event_year_redirect( $redirect_url ) {
    if ( is_tax( 'event_category' ) && is_year() ) {
        return '';
    }
    return $redirect_url;
}

Примечания

  • Глобальные переменные: $wp_rewrite, $is_IIS, $wp_query, $wpdb, $wp.
  • Логические значения: $is_IIS может быть true или false.

Изменения

  • С версии 2.3.0 добавлено использование функции.

Код функции redirect_canonical() ─ WP 6.7.2

function redirect_canonical( $requested_url = null, $do_redirect = true ) {
    global $wp_rewrite, $is_IIS, $wp_query, $wpdb, $wp;

    if ( isset( $_SERVER['REQUEST_METHOD'] ) && ! in_array( strtoupper( $_SERVER['REQUEST_METHOD'] ), array( 'GET', 'HEAD' ), true ) ) {
        return;
    }

    // Проверка на preview, админку и т.д.
    if ( is_admin() || is_search() || is_preview() || is_trackback() || is_favicon()
        || ( $is_IIS && ! iis7_supports_permalinks() )
    ) {
        return;
    }

    // Формируем запрашиваемый URL.
    if ( ! $requested_url && isset( $_SERVER['HTTP_HOST'] ) ) {
        $requested_url  = is_ssl() ? 'https://' : 'http://';
        $requested_url .= $_SERVER['HTTP_HOST'];
        $requested_url .= $_SERVER['REQUEST_URI'];
    }

    $original = parse_url( $requested_url );
    if ( false === $original ) {
        return;
    }

    $redirect_url = false;

    // Обработка 404 ошибок и попытка найти правильную страницу.
    if ( is_404() ) {
        // Логика для перенаправления.
    }

    // Дальнейшая логика...

    // Применение фильтров.
    $redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url );

    if ( $do_redirect && $redirect_url ) {
        wp_redirect( $redirect_url, 301 );
        exit;
    }

    return $redirect_url;
}

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

  • add_query_arg()
  • get_queried_object()
  • get_queried_object_id()
  • get_query_var()
  • get_search_query()
  • get_status_header_desc()
  • is_embed()
  • is_robots()
  • remove_query_arg()
  • wp()

Leave a Reply

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