Как удалить или изменить тип записи WooCommerce без потери данных

Диагностика проблемы: зачем менять или удалять тип записи WooCommerce

WooCommerce использует собственные типы записей (CPT) для продуктов (product), заказов (shop_order) и других сущностей. Иногда возникает необходимость изменить поведение или даже удалить один из типов записей без потери данных, например, при смене плагина магазина или кастомизации сайта. Однако прямое удаление CPT WooCommerce приводит к потере отображения и функционала, а данные остаются в базе, но недоступны. Важно понимать, что удаление CPT — это не удаление записей из базы, а отключение их регистрации в WordPress.

Как безопасно изменить тип записи WooCommerce на пользовательский

Частая задача — переназначить продукты WooCommerce на кастомный тип записи, чтобы изменить логику работы с ними, например, для интеграции с другим плагином или создания уникального интерфейса.

Пошаговое решение

  1. Создайте новый тип записи для продуктов, например, custom_product:
function register_custom_product_cpt() {
    $args = array(
        'label' => 'Custom Products',
        'public' => true,
        'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
        'has_archive' => true,
        'rewrite' => array('slug' => 'custom-product'),
    );
    register_post_type('custom_product', $args);
}
add_action('init', 'register_custom_product_cpt');
  1. Обновите тип записи существующих продуктов WooCommerce в базе данных SQL-запросом:
global $wpdb;
$wpdb->query("UPDATE {$wpdb->prefix}posts SET post_type = 'custom_product' WHERE post_type = 'product'");

Этот запрос переведёт все продукты WooCommerce в новый тип записи custom_product.

  1. Отключите регистрацию CPT product WooCommerce, чтобы избежать конфликтов. Для этого используйте фильтр woocommerce_register_post_types:
add_filter('woocommerce_register_post_types', '__return_false');

Это предотвратит повторную регистрацию CPT product WooCommerce.

Как проверить результат

  • Перейдите в админку WordPress в раздел «Custom Products» — там должны отображаться все ваши товары.
  • Проверьте фронтенд сайта — товары должны корректно отображаться по новому адресу /custom-product/{slug}.
  • Убедитесь, что в базе в таблице wp_posts для ваших товаров поле post_type обновлено на custom_product.

Как удалить тип записи WooCommerce без потери данных

Если нужно отключить тип записи WooCommerce, например, shop_order, но сохранить данные заказов в базе, следует:

Пошаговое решение

  1. Отключить регистрацию типа записи с помощью фильтра:
add_filter('woocommerce_register_post_types', function($register) {
    // Отключаем регистрацию заказов
    remove_post_type_support('shop_order', 'title');
    remove_post_type_support('shop_order', 'editor');
    unregister_post_type('shop_order');
    return false;
});

Однако функция unregister_post_type вызывается только после регистрации CPT, поэтому иногда требуется отключить регистрацию на более раннем этапе:

add_action('init', function() {
    if (post_type_exists('shop_order')) {
        unregister_post_type('shop_order');
    }
}, 1);
  1. Проверить, что записи заказов остаются в базе — просто в таблице wp_posts с типом shop_order.
  2. Для отображения или работы с этими записями используйте кастомные запросы WP_Query, так как штатный функционал WooCommerce будет отключен.

Проверка

  • В админке записи с типом shop_order не должны отображаться.
  • Данные в таблице wp_posts сохранены и доступны через SQL или WP_Query с параметром post_type => 'shop_order'.

Частые ошибки и как их исправить

  • Ошибка: после изменения типа записи товары не отображаются на сайте.
    Причина: не обновлены постоянные ссылки (permalinks).
    Решение: перейдите в Настройки → Постоянные ссылки и нажмите «Сохранить изменения» без изменения настроек.
  • Ошибка: при попытке отключить CPT WooCommerce появляется ошибка, что CPT не найден.
    Причина: попытка отключить CPT до его регистрации.
    Решение: используйте add_action('init', fn() => unregister_post_type(), 20); или фильтр woocommerce_register_post_types с правильным приоритетом.
  • Ошибка: потеря SEO и индексации товаров.
    Причина: изменение URL без редиректов.
    Решение: настройте 301 редиректы с старых адресов на новые с помощью плагина или .htaccess.

Практические советы по безопасности и производительности

  • При массовом обновлении типа записи используйте SQL-запросы с осторожностью, выполняйте бэкап базы перед изменениями.
  • Отключение CPT WooCommerce может повлиять на работу плагинов, зависящих от этих типов записей — тестируйте изменения на тестовом стенде.
  • Если планируете менять тип записи, сохраните SEO параметры, не удаляйте метаданные и таксономии, связанные с продуктами.

Сравнение подходов изменения типа записи WooCommerce

МетодОписаниеПлюсыМинусы
Прямое обновление post_type SQL-запросомПереназначение всех продуктов на кастомный CPTБыстро, сохраняет данные и метаданныеНужны корректные настройки CPT и пермалинков
Отключение CPT WooCommerceУдаление регистрации CPT без удаления данныхСохраняет данные, отключает функционалПотеря штатного интерфейса и функций WooCommerce
Использование сторонних плагинов для миграции CPTПлагины миграции CPT (например, Post Type Switcher)Удобно для ручной миграцииМожет быть медленнее, требует интерфейса
Как использовать WPReset для автоматического восстановления WordPress после ошибок
23.12.2025
Как автоматически отключать подписки в WordPress при удалении пользователя
09.03.2026
Как отключить Emoji в WordPress для улучшения производительности
08.01.2026
Как использовать WP-Cron для автоматического удаления старого контента в WordPress
11.05.2026
Как удалить или отключить плагин WordPress без доступа к админке
13.01.2026