Как удалить нежелательные редиректы в WordPress

В WordPress некоторые редиректы создаются автоматически. Например у нас есть запись по адрессу https://site/old, а мы ее переименовали в https://site/nev. Теперь перейдя по адресу https://site/old мы будем перенаправлены на адрес https://site/nev. Это удобно, но иногда такое поведение бывает излишним. Как это исправить и поговорим в этой статье.

Какие бывают редиректы?

Редиректы бывают внешние — это когда нас перебрасывает с сайта https://old на сайт https://nev.
И внутренние — это когда мы «не уходим» с сайта, а переводимся на другую ссылку, как мы писали в начале статьи.

Об этом последнем варианте на сайте WordPress и идет речь.

Как очистить базу данных от старых ссылок?

Очистка базы с помощью плагина

Чтобы WordPress «забыл» старые пути к записям, мы можем очистить базу. И самый простой способ — это воспользоваться плагином Slugs Manager в котором можно просмотреть старые ссылки и удалить все или выбранные:
Slugs Manager
Если плагин вам больше не нужен, то его можно деактивировать или удалить.

Очистка базы через phpMyAdmin

Можно обойтись и без плагина, очистив базу данных от старых ссылок «вручную».
Для этого зайдем на хостинге в phpMyAdmin и выполним запрос, чтобы просмотреть старые ссылки:

SELECT * FROM `wp_postmeta` WHERE `meta_key` = '_wp_old_slug'

Теперь можно удалить не нужные ссылки.

Очистка базы с помощью кода

Для начала мы можем проверить есть ли старые ссылки. Для этого пропишем в файле functions.php следующий код:

function еhere_is_old_slugs() {
  global $wpdb;
  $old_slug =$wpdb->get_results("SELECT*FROM$wpdb->postmetaWHERE meta_key='_wp_old_slug'");
  if(!empty($old_slug)){
    echo '<pre>' . print_r($old_slug, true) . '</pre>';
  }else{
  echo '<h2>Старых ссылок нет</h2>'
}

И выведем результат используя любой шаблон, например header.php, прописав в нем:

еhere_is_old_slugs();

Если выводится код, а не сообщение «Старых ссылок нет»,  то можно воспользоваться кодом ниже, который и удалит старые ссылки:

function delete_old_slugs() {
  global $wpdb;
  $old_slug = $wpdb->get_results("SELECT * FROM $wpdb->postmeta WHERE meta_key='_wp_old_slug'"); 
  if(!empty($old_slug)){
    $wpdb->get_results("DELETE * FROM $wpdb->postmeta WHERE meta_key='_wp_old_slug'");
  }
}
delete_old_slugs();

После этих процедур код нужно удалить или закомментировать.
Чтобы убедиться что «Старых ссылок нет», запустим первый код.
После чего закомментируем и его.

Как «выключить» автоматические редиректы

Чтобы совсем отключить канонические редиректы и редиректы со старых ссылок, можно прописать в файле functions.php :

remove_filter('template_redirect', 'redirect_canonical');
remove_action('template_redirect', 'wp_old_slug_redirect');

Первая строка полностью отключить функционал канонических редиректов.
После этого мы будем попадать на страницу пагинации /mypage/page/2, если перейдем по этой ссылке, а не будем «переброшены» на первую страницу /mypage/, как было раньше.
Вторая строка отключит поиск старых слагов в базе данных и будут «видны» только новые ссылки на страницы, а старые «потеряются».