


Блог IT-шника
Блог IT-шника
Привіт:) У цьому пості покажу, як налаштувати 301 редирект у WordPress, щоб перенаправити користувача або пошукового робота з однієї сторінки сайту на іншу.
Технічно — це автоматична заміна однієї заданої URL-адреси на іншу. Наприклад, якщо у браузері відвідувач або пошуковий бот запитує сторінку https://site.com/page-1, то в результаті йому буде видана https://site.com/page-2.
Зазвичай використовується, якщо:
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();
}
} );
до змісту ↑
Мінус цього способу — потрібне встановлення додаткового модуля, що може збільшити кількість запитів до бази даних і сповільнити роботу сайту. Серед плюсів: просте налаштування у візуальному режимі, відстеження та статистика переходів та ведення журналу помилок 404 (неіснуюча URL-адреса).
Це одне з найпопулярніших ВордПрес-рішень з великими можливостями та гнучкими налаштуваннями. Після встановлення та активації відкрийте адмін-розділ Інструменти > Redirection, введіть у відповідні поля стару та нову URL-адреси. Наприкінці натисніть кнопку нижче.
Статистика всіх переходів та список помилок можна переглянути у вкладках Log та 404s.
Плагін також може зробити перенаправлення на HTTPS, www або інший домен (вкладка Site). Але для цього рекомендую використовувати файл .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/
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ https://site.com/$1 [R=301,L]
RewriteEngine on
RewriteCond %{HTTP_HOST} ^site.com [NC]
RewriteRule ^(.*)$ https://www.site.com/$1 [R=301,L]
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.site.com/$1 [R,L]
Іноді батьківська сторінка доступна також як 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]
WordPress має вбудовані інструменти, які дозволяють додати правила у файл .htaccess кореневого каталогу сайту. А саме — фільтр mod_rewrite_rules
. Для цього виконайте наступні дії.
add_filter( 'mod_rewrite_rules', function ( $rules ) {
return $rules . "\n" .
"Redirect 301 /hello-world/ https://new-site.com";
} );