Сегодня мы рассмотрим довольно распространенный сценарий: вы переносите сайт откуда-то куда-то, у вас есть список старых ссылок и список новых ссылок. Ваша задача сделать так, чтобы при заходе по старой ссылке шел редирект на новую ссылку. Это важно как для поисковиков, так и для пользователей — чтобы при переходе по ссылкам у вас не было 404 страниц.
Обработать такой список — это большая головная боль и сегодня мы рассмотрим пример, как это сделать с помощью excel. Для этого мы будем использовать простую библиотеку SimpleXLSX, которая умеет конвертировать файлы в формате .xlsx в простые массивы на php. О том, как она работает мы уже разбирали ранее.
Библиотека должна быть подключена следующим образом:
require_once get_template_directory() . '/includes/plugin-additions/simplexlsx.class.php';
В качестве примера рассмотрим сайт potolkoff59.ru, на котором при редизайне поменялась структура ссылок и список редиректов стал выглядеть следующим образом:
Редиректы в WordPress должны происходить на хуке template_redirect
, мы создаем функцию и вешаем на этот хук. Импортируем excel-файл и собираем два массив — с редиректами и списком запросов. После этого проверяем, что текущий запрос есть в списке старых ссылок и в списке редиректов и производим редирект с помощью функции wp_redirect()
// excel-редиректы
add_action( 'template_redirect', 'potolki_redirects' );
function potolki_redirects() {
$fileImport = get_stylesheet_directory() . '/data/potolkoff59.ru.xlsx';
if ( $xlsx = SimpleXLSX::parse( $fileImport )) {
$sheetData = $xlsx->rows(1);
$array = array();
$requests = array();
foreach ( $sheetData as $keyD => $sheetRow ) {
if ( $keyD != 0 && $sheetRow['0'] && $sheetRow['1'] ) {
// убираем регулярками протокол и домен
$old_request = $sheetRow['0'];
$old_request = preg_replace('/^(http[s]?):\/\//', '', $old_request );
$old_request = preg_replace('/^[^\/]+/', '', $old_request );
// собираем два массив - с редиректами и запрсоами
$array[$old_request] = $sheetRow['1'];
$requests[] = $old_request;
}
}
// проверяем, что массивы оказались не пустыми
if ( !empty( $array ) && !empty( $requests ) ) {
$current_request = $_SERVER['REQUEST_URI'];
// проверяем, что текущий запрос есть в списке старых ссылок и в списке редиректов
if ( in_array( $current_request, $requests ) && isset( $array[$current_request] ) ) {
wp_redirect( $array[$current_request], 301 );
}
}
}
}