WordPress как на ладони
Плагин рекламы для WordPress wordpress jino

wp_redirect() WP 1.5.1

Перенаправляет (редиректит) на указанный УРЛ, можно указать статус редиректа (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_redirect() вызовет PHP ошибку, если использовать функцию после того, как заголовки (header) были отправлены. Т.е. если мы вызовем функцию в файле темы, отвечающем за вывод контента, то функция работать не будет. В таких случаях, в виде некой альтернативы, можно использовать редирект на javascript: document.location.href = 'http://site.ru';

Используется в: wp_safe_redirect().
Хуки из функции:

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

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

Примеры

#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;
	}
} );

Код wp redirect: wp-includes/pluggable.php WP 4.8

<?php
function wp_redirect($location, $status = 302) {
	global $is_IIS;

	/**
	 * Filters the redirect location.
	 *
	 * @since 2.1.0
	 *
	 * @param string $location The path to redirect to.
	 * @param int    $status   Status code to use.
	 */
	$location = apply_filters( 'wp_redirect', $location, $status );

	/**
	 * Filters the redirect status code.
	 *
	 * @since 2.3.0
	 *
	 * @param int    $status   Status code to use.
	 * @param string $location The path to redirect to.
	 */
	$status = apply_filters( 'wp_redirect_status', $status, $location );

	if ( ! $location )
		return false;

	$location = wp_sanitize_redirect($location);

	if ( !$is_IIS && PHP_SAPI != 'cgi-fcgi' )
		status_header($status); // This causes problems on IIS and some FastCGI setups

	header("Location: $location", true, $status);

	return true;
}

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

Из метки: Вспомогательные

Еще из раздела: Без рубрики

wp_redirect 25 комментариев
Полезные 4 Вопросы 2 Все
  • Александр Аликин cайт: jurnalizd.ru
    @

    Подскажите, пожалуйста, как сделать переадресацию короткой ссылки вида .../?p=123 на каноническую страницу с адресом .../%year%/%monthnum%/%day%/%postname%/

    Перерыл весь интернет, ничего не нашел sad

    Ответить5 лет назад #
  • Артур cайт: imvest.biz

    1.Создайте папку с кодом самого редиректа
    2.С необходимого анкора ссылайтесь на папку редиректа, код в которой будет вас перенаправлять. smile

    Ответить5 лет назад #
    • Александр Аликин cайт: jurnalizd.ru
      @

      Благодарю вас.

      Проблему решил еще месяц назад. Как выяснилось, автоматический редирект с http на www и с "коротких ссылок" на канонические был отменен в одной из прежних версий "Вордпресса", и с тех пор эта функция не возобновлялась. Я просто заменил часть кода в одном из файлов на прежний. Теперь все работает smile

      Ответить5 лет назад #
  • cjcat

    Было бы еще неплохо добавить, что данную функцию нет смысла вызывать, если заголовки уже посланы/установлены, потому что она работать не будет. Работает только до того, как пошлются заголовки.

    Ответить3.8 года назад #
    • Kama4398

      Хорошее замечание, спасибо!

      Ответить3.8 года назад #
    • Dima
      @

      можно об этом поподробней? я пытаюсь сделать редирект из обработчика который находится на одной странице с формой , но ничего не происходит, редирект не работает. каким образом мне сделать перенаправление после успешного выполнения функции

      $insertion = wp_insert_post( $my_post );
      if ($insertion) {
      
      $permalink = get_permalink( $insertion );
       wp_redirect( $permalink );
      
      exit;
      			}
      Ответить3.7 года назад #
      • Kama4398

        Вам нужно выполнять эту операцию до того, как страница начнет генерироваться, до того как на экран будет выведена любая информация, это может быть даже любой невидимый символ. Т.е. вставлять ваш код в тело поста, когда, например, шапка сайта уже выведена - вернет ошибку: headers already send.

        Чтобы этого избежать, вы можете повесить вашу операцию на хук, до генерации шаблона: init, template_redirect и т.д. Примерно так:

        add_action('init', 'my_insert_post_hook');
        function my_insert_post_hook($my_post){
        	$insertion = wp_insert_post( $my_post );
        	if( $insertion ){             
        	   $permalink = get_permalink( $insertion );
        	   wp_redirect( $permalink );
        
        	   exit;
        	}
        }
        Ответить3.7 года назад #
  • vovasik

    а ещё эта функция к сожалению не может отдать 404 статус

    Ответить3.7 года назад #
  • Pavel

    302-й статус часто упоминается как Moved Temporarily, и, возможно, не каждый будет искать его по словам "Found":

    wikipedia.org

    Возможно имеет смысл написать "302 - Moved Temporarily (или Found)" или что-то похожее.

    Ответить1.7 года назад #
  • yorgiy

    Как перенаправить пользователя с site.ru/statja/ на site.ru/kategoria/statja.html или site.ru/statja.html

    На сайте около 15 000 статей, тому вручную не как не выйдет.

    Ответитьгод назад #
    • Kama4398

      В .htaccess такое правило добавь:

      # 301 редирект с site.ru/statja/ на site.ru/kategoria/statja.html
      RewriteRule ^statja/?$ kategoria/statja.html [R=301,L]

      Или так в functions.php темы

      add_action( 'template_redirect', function() {
      	if ( preg_match( '~^/statja/?$~i', $_SERVER['REQUEST_URI'] ) ) {
      		wp_redirect('http://site.ru/kategoria/statja.html', 301);
      		exit;
      	}
      } );
      Ответитьгод назад #
      • yorgiy

        Добрый день. Спасибо за ответ. НО редирект не работает.
        Нужно с:
        http://site.com/31259-orange-rose-among-the-stones-in-the-water/
        на:
        http://site.com/31259-orange-rose-among-the-stones-in-the-water.html

        И при этом работали категории в виде:
        http://site.com/category/flowers/
        И главная страница:
        http://site.com

        При установке 301 редирект, главная и категория не работает, перенаправляет на:
        http://site.com/.html
        http://site.com/category/flowers/.html

        На сайте около 15 000 статей, нужен редирект что бы все статьи перенаправляло на .html

        Спасибо. Жду ответа.

        Ответитьгод назад #
        • Kama4398

          http://site.com/31259-orange-rose-among-the-stones-in-the-water/ - тут 31259 это ID статьи ил и что? Нужен какой нибудь шаблон ссылки...

          Ответитьгод назад #
          • yorgiy

            Да это пост ID
            В чпу прописано так: /%post_id%-%postname%/
            И віходит ссылка http://site.com/31259-orange-rose-among-the-stones-in-the-water/

            Ответитьгод назад #
            • campusboy1580 cайт: wp-plus.ru
              @

              Если в ЧПУ прописать /%post_id%-%postname%.html прописать, поможет?

              Ответитьгод назад #
              1
              • Kama4398

                Дельное предложение. WP сам 301 редирект поставит...

                Правда нагрузка при этом будет... Но в любом случае это правило нужно установить, чтобы новые ссылки создавались правильно. А чтобы не было лишней нагрузки при редиректах в htaccess до правил wordpress, можно добавить такое правило:

                # 301 редирект с http://site.com/31259-orange-rose-among-the-stones-in-the-water/
                # на http://site.com/31259-orange-rose-among-the-stones-in-the-water.html
                RewriteRule ^([0-9]+-[^/]+)/?$ $1.html [R=301,L]
                Ответитьгод назад #
              • yorgiy

                Конечно, НО вы не помяли, сайт уже проиндексирован, и при переходе с поиска (если сменить на /%post_id%-%postname%.html) выдает ошибку, что страницы такой нету. Тому и нужно сделать перенаправления с / на .html

                Ответитьгод назад #
                • yorgiy

                  И команда RewriteRule ^([0-9]+-[^/]+)/?$ $1.html [R=301,L] не работает, пустая страница. Что я сделал:

                  1. Сменил ЧПУ с /%post_id%-%postname%/ на /%post_id%-%postname%.html
                  2. Прописал команду RewriteRule ^([0-9]+-[^/]+)/?$ $1.html [R=301,L]
                    Результат - пустая страница
                  Ответитьгод назад #
                  • Kama4398

                    при переходе с поиска (если сменить на /%post_id%-%postname%.html) выдает ошибку, что страницы такой нету.

                    Что это значит я не понял...

                    Вы когда ЧПУ поменяли у вас старница типа работает вообще?

                    http://site.com/31259-orange-rose-among-the-stones-in-the-water.html

                    П.С. Еще раз напишите что есть, что не так и что нужно.

                    Ответитьгод назад #
                    • yorgiy

                      да работает, но не работает когда переходишь из поиска, нету редиректа с / на html

                      Ответитьгод назад #
                    • Kama4398

                      Вот сервис, показывает что редирект работает, обычно он правильно показывает: http://htaccess.mwl.be/

                      Проверить мне негде...

                      Ты правила до правил WP вставил?

                      Ответитьгод назад #
  • Юрий

    Добрый день!

    Я поменял ссылки вида %postname%.html на /%category%/%postname%
    Подскажите как правильно с одного урл на другой сделать редирект?
    Также облазил весь интернет данных не нашел.

  • campusboy1580 cайт: wp-plus.ru
    @

    Бывает приходится переводить самописные сайты на WordPress. В таких сайтах часто все урлы заказчиваются на '.php'. Предлагаю решение проблемы 2 способами.

    1 способ на основе описываемой функции (оформлен как плагин):

    /*
    Plugin Name: Редиректы
    Description: Редиректы, чтобы избавиться от .php в урлах
    */
    
    add_action( 'init', 'moto_disable_php_in_url');
    function moto_disable_php_in_url(){
    	$url = $_SERVER['REQUEST_URI'];
    
    	// Проверка на наличие .php в урле
    	if( strpos($url, '.php') !== false ){
    		// Проверка обращения к файлам движка (разрешаем доступ)
    		if( strpos($url, 'wp-admin') !== false || strpos($url, 'wp-includes') !== false || strpos($url, 'wp-login.php') !== false ){
    
    		}
    		else{
    			$url = home_url() . str_replace('.php', '', $url);
    			wp_redirect( $url, 301 );
    			exit;
    		}
    	}
    }

    2 способ - это набор плагин для htaccess:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
    RewriteCond %{REQUEST_URI} !^/wp-admin
    RewriteCond %{REQUEST_URI} !^/wp-includes
    RewriteCond %{REQUEST_URI} !^/wp-login.php
    RewriteRule ^ %1 [R=301,L]
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    1
  • Уважаемый, подскажите, пожалуйста, как после входа в Woocommerce вернуть пользователя на ту страницу с которой он заходил?

    Ответить4 месяца назад #
  • campusboy1580 cайт: wp-plus.ru
    @

    Я вот такой код использую, когда надо сделать лендинг со страницей настроек и редактирования:

    /**
    * Перенаправление с главной страницы админки на страницу настроек лендингом
    * 
    * @param object $current_screen объект с данными о текущей страницы админки
    */
    function redirect_dashboard_to_page_options( $current_screen ) {
    
      // Проверяем страницу админки
      if( $current_screen->base != 'dashboard' )
    	return;
    
      // Перенаправляем на кастомную страницу настроек
      wp_redirect( home_url() . '/wp-admin/admin.php?page=pult' );
      exit;
    
    }
    add_action( 'current_screen', 'redirect_dashboard_to_page_options' );
    
    // Переадресация при авторизации на страницу настроек лендингом
    function admin_default_page() {
      return '/wp-admin/admin.php?page=pult';
    }
    add_filter('login_redirect', 'admin_default_page');
    Ответить2 месяца назад #
    1

Здравствуйте, !

Ваш комментарий