Содержание статьи
Начать следует с пересоздания иерархии тем. При экспорте и последующем добавлении данных структура может быть нарушена: дочерние элементы превращаются в отдельные записи верхнего уровня, а их связи исчезают. Проверьте таблицу wp_terms
и wp_term_taxonomy
, обратите внимание на столбец parent
. Если значение не соответствует ожидаемому, обновите его вручную или скриптом:
UPDATE wp_term_taxonomy
SET parent = (SELECT term_id FROM wp_terms WHERE name = \'Родительская категория\')
WHERE term_id = (SELECT term_id FROM wp_terms WHERE name = \'Дочерняя категория\');
Следующий шаг – идентификация дублей. Часто при повторном импорте создаются одинаковые метки с разными ID. Удалить их нужно аккуратно, сверяясь с wp_term_relationships
, чтобы не нарушить связь с публикациями. Используйте простой SQL-запрос для выявления повторений:
SELECT name, COUNT(*)
FROM wp_terms
GROUP BY name
HAVING COUNT(*) > 1;
Теперь об отзывах. Иногда при переносе нарушается связь между записями и их откликами. Это связано с полем comment_post_ID
в таблице wp_comments
. Если ID не соответствует реальному идентификатору записи в wp_posts
, отклик становится «плавающим».
Важно: всегда делайте резервную копию базы данных перед прямым редактированием SQL!
Проверьте, что каждая запись в wp_comments
указывает на существующий post_id
. Вручную изменить можно так:
UPDATE wp_comments
SET comment_post_ID = 123
WHERE comment_ID = 456;
В случаях, когда были задействованы сторонние плагины, проверьте наличие собственных таблиц и конфликтов. Особенно внимательно – к кастомным типам контента: они могут потерять метаинформацию. Работайте через wp_postmeta
и meta_key
, чтобы убедиться, что связка не нарушена.
Внимание! Некоторые темы или плагины используют собственные хуки для регистрации категорий или откликов. После загрузки данных эти хуки не всегда срабатывают. Проверьте файл
functions.php
на предмет пропущенных фильтров.
Почему всё так неочевидно? Потому что XML-файл, созданный через стандартный экспорт, содержит минимальные данные, а некоторые параметры зависят от активной темы и версии ядра. Поэтому лучше использовать WP-CLI:
wp export --skip_comments
А затем:
wp import файл.xml --authors=create
Это позволяет избежать лишних откликов от спам-ботов и снизить вероятность потери связей. Не забудьте отключить автосоздание вложений – они часто ломают порядок.
Заключение? Всё нужно перепроверять вручную. Один пропущенный ID – и половина структуры уходит в хаос. Будьте внимательны, не доверяйте интерфейсу – только базе.
Как найти и удалить дубликаты рубрик после импорта
Сразу ищите одинаковые названия с разными ID. Это указывает на копии. Откройте phpMyAdmin или используйте WP-CLI. Второе быстрее.
Внимание! Даже если имена совпадают, термины могут отличаться по slug или родителю. Это критично!
wp term list category --fields=term_id,name,slug,parent --format=table
Сортируйте по имени. Ищите повторы. Один из пары – мусор. Особенно если slug дополнен цифрой. Пример: news и news-2. Ложная копия!
Удаление ненужной таксономии:
wp term delete category ID
Где ID
– это числовой идентификатор дубликата. Убедитесь, что не используется. Как проверить?
wp post list --category=ID
Дополнительно:
- Проверьте связи с записями перед удалением
- Отключите автогенерацию slug через фильтр, если дублируется вручную
- Проверьте
wp_terms
,wp_term_taxonomy
иwp_term_relationships
– там может зарыться корень зла
Важно помнить: иногда копии создаются неявно при импорте с несовпадающими slug, даже если названия идентичны. Сравнивайте по всем полям.
Автоматизация? Напишите скрипт на PHP для проверки совпадений:
$terms = get_terms([\'taxonomy\' => \'category\', \'hide_empty\' => false]);
$names = [];
foreach ($terms as $term) {
if (isset($names[$term->name])) {
echo \"Дубликат: {$term->name} (ID: {$term->term_id})\";
} else {
$names[$term->name] = $term->term_id;
}
}
Не доверяйте визуальной схожести. Сравнивайте slug, parent, term_group. Только так отловите неочевидные копии.
Избавившись – пересчитайте счетчики:
wp term recount category
Итог: чистая структура, без мусора. Никакой путаницы. Ни одной лишней метки.
Переименование рубрик с сохранением ссылочной структуры
Меняешь ярлык? Не лезь в админку просто так. Иначе получишь 404 – быстро, неожиданно, без предупреждения.
Сначала зайди в меню «Записи» – «Категории». Найди нужную категорию, измени слаг (ярлык) на новый. Это уже ломает старую ссылку.
Дальше – настройка редиректа. Без него поисковики потеряют путь. Используй плагин Redirection или добавь правило в .htaccess
.
Redirect 301 /old-category/ /new-category/
Путь указан без домена. Это критично. Apache не простит.
Если используешь плагин SEO, например, Yoast или Rank Math, проверь включение автоматических редиректов. Иногда они срабатывают, иногда – тишина. Никогда не доверяй им полностью.
Важно помнить: если структура постоянных ссылок включает категорию, то изменение ярлыка ломает все вложенные URL. Пример:
/category/news/article-name/ → /category/analytics/article-name/
Нужен редирект не только самой категории, но и всех материалов внутри. Решение – регулярное выражение:
RedirectMatch 301 ^/category/news/(.*)$ /category/analytics/$1
Внимание! Одна ошибка в регулярке – и вся категория отправит пользователей в никуда. Тестируй на локалке, не надейся на продакшн.
ЧПУ-ссылки ломаются и на уровне кэша. Удали кэш в плагинах вроде WP Super Cache, W3 Total Cache. И в CDN. Да, туда тоже дотягивается проблема.
Меняешь иерархию? Не забудь: дочерние категории берут родительский слаг. Меняешь родителя – страдают дети. Это цепная реакция. Обрубай аккуратно.
Массовая замена? Используй WP-CLI:
wp term update category 12 --slug=new-slug
Где 12 – ID нужной категории. Найди через phpMyAdmin или экспорт в CSV. Это не угадывание. Это хирургия.
Важно! Любая массовая операция требует бэкапа. Без обсуждений.
Проверь sitemap. Если используешь SEO-плагин, пересоздай карту сайта. Старые ссылки могут остаться в кеше поисковиков. Пошли им HTTP-запрос через Search Console. Обнови индексацию. Быстро.
URL должен быть постоянным. Всё остальное – нестабильная зона риска. Меняй только если есть чёткая причина. Просто так – не трогай.
Настройка отображения старых комментариев на новой теме
Проверь поддержку встроенных хуков в шаблоне comments.php
. Если в коде отсутствует вызов wp_list_comments()
или comment_form()
, никакие сообщения отображаться не будут. Без этих функций система не рендерит структуру – просто тишина. Добавьте их вручную, если нужно.
Неверная пагинация? Смотрите на paginate_comments_links()
. Без него переход между страницами невозможен. Иногда в темах используют собственные циклы и забывают про пагинацию – итог: отображается только первая партия, остальное недоступно.
Важно! Всегда проверяйте наличие
comments_template()
вsingle.php
илиpage.php
. Без него комментарии просто не подгружаются на страницу.
Проблемы с аватарами? Убедитесь, что активен get_avatar()
, и нет кастомной фильтрации pre_get_avatar
. Иногда сторонние темы или плагины вмешиваются в этот процесс, заменяя граватар на пустую заглушку.
Отдельный случай – искажённая иерархия. Если вложенные ответы идут в линию, значит отсутствует параметр \'style\' => \'ol\'
или \'max_depth\'
выставлен на 1 в wp_list_comments()
. Исправляется передачей правильных аргументов:
wp_list_comments([
\'style\' => \'ol\',
\'short_ping\' => true,
\'avatar_size\' => 50,
\'max_depth\' => 5
]);
Сбои в форматировании текста сообщений? Смотрите на фильтры comment_text
и comment_text_rss
. Часто кастомизация этих фильтров приводит к удалению тегов или символов. Верните дефолтные фильтры для проверки:
remove_all_filters(\'comment_text\');
Проверьте поддержку JavaScript-ответов через comment-reply.min.js
. Если файл не подключён, вложенные ответы не работают динамически. Добавьте в functions.php
:
if (is_singular() && comments_open() && get_option(\'thread_comments\')) {
wp_enqueue_script(\'comment-reply\');
}
Помните: устаревшие темы могут использовать несовместимые HTML-структуры, из-за которых старые сообщения теряют видимость или нарушается порядок. Проверяйте руками!
Итог: чёткая структура шаблона, вызовы встроенных функций, контроль фильтров. Проверка всего – от хука до скрипта. Без компромиссов. Хотите сохранить логику общения на сайте – держите эти элементы под контролем.
Восстановление иерархии вложенных комментариев после импорта
Сразу проверь значение поля comment_parent
в таблице wp_comments
. Именно оно определяет вложенность. Если все значения сброшены в 0
– иерархия уничтожена.
Далее проверь соответствие comment_ID
и comment_parent
. Частая ошибка: ссылка идет на несуществующий ID. Результат – обрыв цепочки.
Чтобы восстановить дерево вручную или программно, используй следующую тактику. Сначала выгрузи все записи, у которых comment_parent
не равен нулю:
SELECT comment_ID, comment_post_ID, comment_parent
FROM wp_comments
WHERE comment_parent > 0
Далее – главное. Сопоставь родительские ID с фактическими comment_ID
. Если не найдено – обнуляй:
UPDATE wp_comments
SET comment_parent = 0
WHERE comment_parent NOT IN (SELECT comment_ID FROM (SELECT comment_ID FROM wp_comments) AS t)
Важно! Если база переносилась между сайтами с разными ID постов, родительские связи теряются. В таком случае требуется маппинг старых и новых идентификаторов.
Если структура сохранилась в виде XML, можно попытаться вытащить оригинальные связи. Пример обработки XML-импорта:
function fix_threading($comment_id, $comment) {
if (isset($comment->comment_parent_orig)) {
global $wpdb;
$orig_parent = $comment->comment_parent_orig;
$new_parent_id = $wpdb->get_var(
$wpdb->prepare(\"SELECT comment_ID FROM wp_comments WHERE comment_agent = %s\", \'import-\' . $orig_parent)
);
if ($new_parent_id) {
$wpdb->update(\'wp_comments\', [\'comment_parent\' => $new_parent_id], [\'comment_ID\' => $comment_id]);
}
}
}
Отдельный ад – восстановление вложенности, если при переносе отключена опция threaded comments. Включи параметр thread_comments в wp_options
. Значение должно быть 1
.
UPDATE wp_options SET option_value = \'1\' WHERE option_name = \'thread_comments\'
Помните! Без включенного threaded-comments даже идеальная иерархия не отобразится во фронтенде. Проверка шаблона – обязательна!
И последнее: удостоверься, что в comments_template()
используется wp_list_comments()
с аргументом \'style\' => \'ul\'
и задан max_depth
. Пример:
wp_list_comments([
\'style\' => \'ul\',
\'short_ping\' => true,
\'max_depth\' => 5,
]);
Без этого вся архитектура рассыплется, как карточный домик. Тестируй, отлаживай. И не доверяй автозаливкам – они беспощадны к структурам.