Як налаштувати 301 редирект у WordPress
Привіт:) У цьому пості покажу, як налаштувати 301 редирект у WordPress, щоб перенаправити користувача або пошукового робота з однієї сторінки сайту на іншу.
- Що таке 301 редирект та навіщо потрібен
- Типи редиректів
- Важливість редиректів для SEO
- Як виконати довільний 301 редирект WordPress у PHP-коді теми або плагіну
- Як налаштувати редирект 301 за допомогою плагінів
- Плагін Redirection та його налаштування
- Як зробити редирект 301 через .htaccess
- Редирект на іншу сторінку в межах одного сайту (домену)
- Редирект зі сторінки на інший домен
- Масове перенаправлення всього сайту на інший домен
- Редирект сайту в підкаталог
- З www на без www
- На www
- З http на https
- З index.php або index.html на головну
- Як зробити редирект 301 через .htaccess, не змінюючи його безпосередньо
Що таке 301 редирект та навіщо потрібен
Технічно — це автоматична заміна однієї заданої URL-адреси на іншу. Наприклад, якщо у браузері відвідувач або пошуковий бот запитує сторінку https://site.com/page-1, то в результаті йому буде видана https://site.com/page-2.
Зазвичай використовується, якщо:
- було перейменовано розділ сайту та змінено його адресу;
- змінився домен;
- хочете перенести контент на нову сторінку;
- потрібно зробити переадресацію всіх сторінок на HTTPS, www або без www;
- необхідно перенаправити відвідувача за партнерським посиланням;
- є бажання змінити постійну адресу сторінки входу до адмін-панелі;
- змінилася структура постійних посилань;
- йде розробка складних форм.
Типи редиректів
- 301 — сторінка перенесена назавжди і має постійну нову URL-адресу.
- 302 — тимчасове переміщення (наприклад, переадресація на технічну сторінку під час проведення робіт з обслуговування ресурсу).
Важливість редиректів для SEO
- 301 редирект передає всю вагу на кінцеву сторінку. Тобто відбувається "склеювання" старої сторінки з новою.
- 302 взагалі не передає вагу. Таке перенаправлення — найкращий спосіб для тимчасових сторінок, коли сайт недоступний для перегляду відвідувачами (наприклад, "Технічне обслуговування"). "Перекинути" користувача або пошукового робота можна різними способами. Покажу декілька для різних випадків.
Як виконати довільний 301 редирект WordPress у PHP-коді теми або плагіну
function mp_redirects_callback() {
if ( is_page( 21 ) ) {
wp_redirect( "https://site.com/", 301 );
exit();
}
}
add_action( 'template_redirect', 'mp_redirects_callback' );
У коді виконується наступна перевірка: якщо відкрита сторінка, унікальний ідентифікатор (ID) якої рівний 21, то система автоматично перенаправляє на сторінку сайту https://site.com/. Обидва значення замініть на свої.
Наведу приклад універсального редиректу — перенаправлення в межах поточного сайту та на зовнішні посилання. У коді виконується перевірка за ключем "new
". Якщо значення починається із "http://" або "https://", то виконується зовнішній редирект. Якщо ні, то внутрішній, головна адреса сайту береться за допомогою функції site_url()
.
function mpIsStart( $str, $substr ) {
$result = strpos( $str, $substr );
if ( $result === 0 ) {
return true;
} else {
return false;
}
}
add_action( 'template_redirect', function() {
$rules = array(
// звідки переправляємо -> куди
array( 'old'=>'/ru/post-1/', 'new'=>'/ru/slider/' ),
array( 'old'=>'/post-1/', 'new'=>'/slider/' ),
array( 'old'=>'/page-1/', 'new'=>'https://site.com/' ),
);
foreach( $rules as $rule ) :
if ( urldecode( $_SERVER['REQUEST_URI'] ) == $rule['old'] ) :
if ( mpIsStart( $rule['new'], 'http://' ) === TRUE || mpIsStart( $rule['new'], 'https://' ) === TRUE ) {
wp_redirect( $rule['new'], 301 );
exit();
} else {
wp_redirect( site_url( $rule['new'] ), 301 );
exit();
}
endif;
endforeach;
} );
Ще один приклад, у якому є мультимовний сайт із 3-ма мовами. Потрібно на сторінці архіву категорії "Без категорії" здійснити редирект на головну сторінку сайту, причому для усіх мовних версій.
/**
* Для укр. версії сайту:
*
* https://site.com/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D1%96%D1%97/
* https://site.com/category/без-категорії/
*
* Для рос.:
*
* https://site.com/ru/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8/
* https://site.com/ru/category/без-категории/
*
* Для англ.:
*
* https://site.com/en/category/no-category/
*
*/
function mp_redirect_no_category_page() {
if ( isset( $_SERVER['HTTPS'] ) &&
( $_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1 ) ||
isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
$protocol = 'https://';
} else {
$protocol = 'http://';
}
$currenturl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$currenturl_relative = wp_make_link_relative( $currenturl );
// print_r( $currenturl_relative );
switch( $currenturl_relative ) {
case '/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D1%96%D1%97/':
$urlto = home_url();
break;
case '/ru/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8/':
$urlto = home_url();
break;
case '/en/category/no-category/':
$urlto = home_url();
break;
default:
return;
}
if ( $currenturl != $urlto )
exit( wp_redirect( $urlto, 301 ) );
}
add_action( 'template_redirect', 'mp_redirect_no_category_page' );
urldecode()
та urlencode()
.Ще один приклад редиректу, коли URL-адреса містить параметри:
/**
* Redirect
*
* from
*
* https://www.site.com.ua/uk/ru/reservation/?room-type=12345
* https://www.site.com.ua/ru/ru/reservation/?room-type=12345
* https://www.site.com.ua/en/ru/reservation/?room-type=12345
*
* to
*
* https://www.site.com.ua/reservation/?room-type=12345
* https://www.site.com.ua/ru/reservation/?room-type=12345
* https://www.site.com.ua/en/reservation/?room-type=12345
*
*/
add_action( 'template_redirect', function() {
if ( home_url( $_SERVER['REQUEST_URI'] ) === 'https://www.site.com.ua/uk/ru/reservation/?room-type=12345' ) {
wp_redirect( "https://www.site.com.ua/reservation/?room-type=12345", 301 );
exit();
} elseif ( home_url( $_SERVER['REQUEST_URI'] ) === 'https://www.site.com.ua/ru/ru/reservation/?room-type=12345' ) {
wp_redirect( "https://www.site.com.ua/ru/reservation/?room-type=12345", 301 );
exit();
} elseif ( home_url( $_SERVER['REQUEST_URI'] ) === 'https://www.site.com.ua/en/ru/reservation/?room-type=12345' ) {
wp_redirect( "https://www.site.com.ua/en/reservation/?room-type=12345", 301 );
exit();
}
} );
до змісту ↑
Як налаштувати редирект 301 за допомогою плагінів
Мінус цього способу — потрібне встановлення додаткового модуля, що може збільшити кількість запитів до бази даних і сповільнити роботу сайту. Серед плюсів: просте налаштування у візуальному режимі, відстеження та статистика переходів та ведення журналу помилок 404 (неіснуюча URL-адреса).
Плагін Redirection та його налаштування
Це одне з найпопулярніших ВордПрес-рішень з великими можливостями та гнучкими налаштуваннями. Після встановлення та активації відкрийте адмін-розділ Інструменти > Redirection, введіть у відповідні поля стару та нову URL-адреси. Наприкінці натисніть кнопку нижче.
/page-1/
/en/page-1/
/category/cars/toyota/
Статистика всіх переходів та список помилок можна переглянути у вкладках Log та 404s.
Плагін також може зробити перенаправлення на HTTPS, www або інший домен (вкладка Site). Але для цього рекомендую використовувати файл .htaccess. У разі, якщо виникне помилка, можна швидше повернути веб-ресурс до робочого стану.
до змісту ↑Як зробити редирект 301 через .htaccess
Цей файл відповідає за певні дії веб-сервера Apache, який використовують більшість хостингів. Директиви в .htaccess дозволяють гнучко змінювати поведінку сервера у тому чи іншому випадку. Також у ньому прописуються правила редиректів.
#END WordPress
.Редирект на іншу сторінку в межах одного сайту (домену)
Redirect 301 /old-page/ https://site.com/new-page/
Замість old-page
та new-page
підставте свої значення старої та нової сторінок.
Редирект зі сторінки на інший домен
Redirect 301 /page-1/ https://www.new-site.com/page-2/
Якщо домен має www або https, їх вказувати обов'язково.
Масове перенаправлення всього сайту на інший домен
Redirect 301 / https://new-stie.com/
Всі URL-посилання залишаться колишніми, зміниться лише їхня перша частина. Тобто сторінка https://old-site.com/page-1/ стане https://new-site.com/page-1/.
Редирект сайту в підкаталог
Redirect 301 / https://new-site.com/subdirectory/
З www на без www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ https://site.com/$1 [R=301,L]
На www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^site.com [NC]
RewriteRule ^(.*)$ https://www.site.com/$1 [R=301,L]
З http на https
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.site.com/$1 [R,L]
З index.php або index.html на головну
Іноді батьківська сторінка доступна також як https://site.com/index.php або https://site.com/index.html. Це неправильно. Потрібно, щоб ці сторінки автоматично перенаправляли на головну.
# з index.php:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.com/ [R=301,L]
# з index.html
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://site.com/ [R=301,L]
Як зробити редирект 301 через .htaccess, не змінюючи його безпосередньо
WordPress має вбудовані інструменти, які дозволяють додати правила у файл .htaccess кореневого каталогу сайту. А саме — фільтр mod_rewrite_rules
. Для цього виконайте наступні дії.
- У файл functions.php додайте код
add_filter( 'mod_rewrite_rules', function ( $rules ) {
return $rules . "\n" .
"Redirect 301 /hello-world/ https://new-site.com";
} );
- Відкрийте Налаштування -> Постійні посилання та натисніть кнопку Зберегти зміни.