В WordPress часто возникает необходимость изменить тип записи (post type) у уже опубликованного контента. Это может потребоваться при реструктуризации сайта или оптимизации для SEO. Однако простое изменение типа записи приводит к потере ссылок, индексации и, как следствие, трафика. В этой статье мы подробно разберём, как безопасно изменить тип записи, сохранив все URL и SEO параметры.
Почему нельзя просто поменять post type вручную?
Тип записи в WordPress определяет структуру URL, логику обработки контента и связи с таксономиями. Если вы просто измените post_type через базу данных или код, старые URL перестанут работать, поскольку WordPress формирует их по новой логике. Плюс, многие SEO-плагины и внутренние механизмы ориентируются на тип записи, и без корректного перенаправления вы потеряете посетителей и позиции в поиске.
Поэтому задача сводится не только к смене типа записи, но и к грамотной настройке 301 редиректов и обновлению внутренних ссылок.
Подготовка: Создание нового типа записи
Перед переносом контента убедитесь, что новый тип записи зарегистрирован корректно. Например, с помощью функции register_post_type(). Вот базовый пример регистрации кастомного типа записи в файле functions.php вашей темы или плагина:
function wpkeys_register_new_post_type() {
$args = array(
'label' => 'Новый тип',
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'novyj-tip'),
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields')
);
register_post_type('novyj_tip', $args);
}
add_action('init', 'wpkeys_register_new_post_type');
Убедитесь, что пермалинки обновлены (Перейдите в Настройки > Постоянные ссылки и нажмите "Сохранить изменения" без изменений), чтобы новые URL начали работать.
Как изменить тип записи с помощью WPKeys: функцию для массового обновления
Изменение типа записи в базе данных требует аккуратности. Ниже пример функции, которая изменит тип записи с starij_tip на novyj_tip. Выполните эту функцию один раз, после чего удалите или закомментируйте её.
function wpkeys_change_post_type($old_type, $new_type) {
global $wpdb;
// Получаем ID всех постов старого типа
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s",
$old_type
));
if (empty($post_ids)) {
return 'Посты с типом ' . $old_type . ' не найдены';
}
foreach ($post_ids as $post_id) {
// Обновляем тип записи
$wpdb->update(
$wpdb->posts,
array('post_type' => $new_type),
array('ID' => $post_id),
array('%s'),
array('%d')
);
}
// Обновляем кэш и правила перезаписи
clean_post_cache($post_ids);
flush_rewrite_rules();
return count($post_ids) . ' постов изменено с ' . $old_type . ' на ' . $new_type;
}
// Вызов функции (раскомментируйте и измените типы по необходимости)
// echo wpkeys_change_post_type('starij_tip', 'novyj_tip');
Внимание! Перед выполнением сделайте резервную копию базы данных, чтобы избежать потери данных в случае ошибки.
Настройка 301 редиректов для сохранения SEO
После смены типа записи URL изменятся, и чтобы не потерять трафик, нужно настроить 301 редиректы со старых адресов на новые. Это можно сделать несколькими способами:
- Через плагин Redirection: Самый простой способ — установить плагин Redirection и вручную создать правило редиректа.
- Через .htaccess: Если вы используете Apache, добавьте правила вида:
RedirectMatch 301 ^/starij-tip/(.*)$ /novyj-tip/$1
- Программно через хук
template_redirect: Более гибкий способ — вfunctions.phpдобавить редирект на уровне PHP:
function wpkeys_redirect_old_post_type() {
if (is_singular('starij_tip')) {
global $post;
$new_url = get_permalink($post->ID);
// Формируем новый URL с новым типом
$new_url = str_replace('/starij-tip/', '/novyj-tip/', $new_url);
if ($new_url) {
wp_redirect($new_url, 301);
exit;
}
}
}
add_action('template_redirect', 'wpkeys_redirect_old_post_type');
Важно проверить, что редиректы работают корректно и нет циклов.
Обновление внутренних ссылок и меню
После смены типа записи необходимо проверить:
- Все внутренние ссылки в постах, виджетах и меню, чтобы они указывали на новые URL.
- Ссылки в SEO-плагинах, например, в мета-описаниях и хлебных крошках.
Для массового обновления ссылок в содержимом можно использовать SQL-запрос:
UPDATE {$wpdb->posts}
SET post_content = REPLACE(post_content, '/starij-tip/', '/novyj-tip/')
WHERE post_content LIKE '%/starij-tip/%';
Или воспользуйтесь плагинами для поиска и замены, например, Better Search Replace.
Проверка и тестирование
После всех изменений важно:
- Протестировать работу всех ссылок на сайте.
- Проверить HTTP статус код старых URL – должен быть 301.
- Проверить индексацию сайта через Google Search Console.
- Проанализировать логи сервера на наличие ошибок 404.
Только убедившись в отсутствии проблем, можно считать задачу выполненной.
Выводы
Изменение типа записи — несложная, но требующая аккуратности задача. Ключевые моменты — регистрация нового типа, массовое обновление post_type в базе, настройка корректных редиректов и обновление внутренних ссылок. Так вы сохраните SEO и не потеряете пользователей.