wp_redirect()
Перенаправляет (редиректит) на указанный УРЛ, можно указать статус редиректа (301, 302...).
Для правильной работы функции нужно указывать полный УРЛ:
http://www.example.com/blog/post_name ftp://ftp.example.com/users/h/harriet/www/
После функции нужно обрывать работу скрипта функцией exit() или die().
В WordPress есть аналогичная функция для редиректа: wp_safe_redirect(). Отличается тем, что проверяет переданный адрес и сравнивает его со списком разрешенных хостов, если хост не найден, то перенаправления не происходит. «Белым» списком можно управлять с помощью фильтра allowed_redirect_hosts.
ВАЖНО! wp_safe_redirect() рекомендуется использовать всегда, особенно когда $url передается пользователем.
Тогда как эту функцию нужно использовать, когда мы намеренно хотим перенаправить пользователя на другой сайт, как правило тут $url жестко прописывается в коде, а не передается пользователем.
// мы точно не знаем указан URL на наш сайт или нет и нам нужно избежать неожиданных редиректов. wp_safe_redirect( $url ); // мы намеренно перенаправляем на другой сайт, URL прописываем жестко. wp_redirect( 'https://example.com/some/page' );
Функция вызовет PHP ошибку (Output already started. Headers not sent.), если использовать функцию после того, как заголовки (header) были отправлены. Т.е. если мы вызовем функцию в файле темы, отвечающем за вывод контента, то функция работать не будет. В таких случаях, в виде некой альтернативы, можно использовать редирект на javascript: document.location.href = 'http://example.com';
Pluggable функция — эту функцию можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.
Замена функции (переопределение) — в must-use или обычном плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.
Хуки из функции
Возвращает
true|false
.
Использование
wp_redirect( $location, $status ); exit;
- $location(строка) (обязательный)
- УРЛ страницы на которую нужно перенаправить.
- $status(число)
Статус код перенаправления (код состояния HTTP):
- 300 — Multiple Choices (Множество выборов);
- 301 — Moved Permanently (Перемещено окончательно);
- 302 — Found (Найдено);
- 303 — See Other (Смотреть другое);
- 304 — Not Modified (Не изменялось);
- 305 — Use Proxy (Использовать прокси);
- 306 — (зарезервировано);
- 307 — Temporary Redirect (Временное перенаправление).
Статус 302 означает временное изменение адреса. Если роботу нужно указать, что страница перемещена навсегда, используйте статус — 301. Полный список статусов смотрите здесь.
По умолчанию: 302
- $x_redirect_by (строка)
Интентификатор того, кто сделал редирект. Позволяет плагинам указывать себя в редиректах.
Указанная тут строка будет добавлена в заголовок
X-Redirect-By
ответа редиректа. Пр:X-Redirect-By: WordPress
.По умолчанию: 'WordPress'
Примеры
#1 Внутренний редирект
Пример перенаправления на главную страницу блога:
wp_redirect( home_url() ); exit;
#2 Внешний редирект
Редирект может быть и внешним. В примере, мы установили статус код редиректа в 301, что означает что данная страница (страница с которой мы перенаправляем) перемещена навсегда:
wp_redirect( 'http://www.example.com', 301 ); exit;
#3 Редирект через хук template_redirect
Этот пример показывает как в WordPress перенаправить пользователя на другую страницу, с возможностью проверить на какой странице сайта он находится сейчас. Т.е. в момент редиректа WP уже определил отображаемую страницу.
Для примера, допустим, нам нужно перенаправить пользователя, если он посетил страницу с ID 10:
add_action( 'template_redirect', function() { if( is_page(10) ){ wp_redirect( 'http://example.org/path/to/subscribe', 301 ); exit; } } );
Заметки
- Global. true|false. $is_IIS
Список изменений
С версии 1.5.1 | Введена. |
С версии 5.1.0 | The $x_redirect_by parameter was added. |
С версии 5.4.0 | On invalid status codes, wp_die() is called. |