Вопрос или проблема
Я использую Events Calendar Pro, и из-за бага было создано несколько таксономий Venue. Например, у меня есть museum, museum-2 и так далее. Я хотел бы удалить дубликаты, но назначить событие, связанное с дублирующей площадкой, главной площадке. Есть ли способ, который я могу использовать для этого? Другие предложения приветствуются. Спасибо.
Вы можете просто выполнить DELETE FROM wp_terms WHERE slug LIKE "museum-%"
на вашем MySQL сервере, но это, вероятно, оставит несколько сиротских записей в wp_term_taxonomy
и потенциально в wp_term_relationships
, если вы уже использовали эти термины. Хотя это немного сложнее, я бы порекомендовал удалить их, используя API WordPress. Что-то вроде этого может сработать (по памяти, так что я не на 100% уверен в использовании префикса term_
в $term->term_slug
и $term->term_id
):
$terms = get_terms(array('your_term'), array('name__like' => 'Museum'));
foreach ($terms as $term) {
if (term->term_slug != 'Museum') {
wp_delete_term($term->term_id, 'your_term');
}
}
Очевидно, что нельзя искать термины по slug, поэтому будьте осторожны, чтобы не удалить термины, такие как “Museums” или “Museum of Natural History”, что произойдет, если вы выполните приведенный выше код.
Ответ или решение
Изменение слага таксономии в базе данных: Устранение дубликатов терминов в WordPress
Ваша ситуация с множественными таксономиями для «Venue» в плагине Events Calendar Pro встречается довольно часто, и решение этой проблемы требует внимательного подхода, чтобы избежать потери данных и оставить систему в исправном состоянии.
Причины возникновения дубликатов
Дубликаты терминов могут возникать из-за сбоев во время импорта данных или из-за ошибок пользователями. В вашем случае, термины вроде "museum", "museum-2" и так далее создавались, вероятно, в результате повторного добавления одного и того же места.
Проблема с использованием SQL-запросов
Как вы отметили, использование простого SQL-запроса, например:
DELETE FROM wp_terms WHERE slug LIKE "museum-%"
может удалить ненужные термины, но это также приведет к созданию «сиротских» записей в таблицах wp_term_taxonomy
и wp_term_relationships
. Это может вызвать проблемы в вашем WordPress-сайте, такие как нарушения ссылок или потеря связанных данных.
Рекомендованное решение: Использование WordPress API
Для более безопасного и корректного удаления дубликатов, используя WordPress API, можно выполнить следующие шаги:
- Получите список всех терминов, связанных с "Museum".
- Сравните их с основным термином "Museum" и удалите все дубликаты.
Вот пример кода, который можно использовать:
// Получаем термины, начинающиеся с "Museum"
$terms = get_terms(array('taxonomy' => 'venue', 'name__like' => 'Museum'));
foreach ($terms as $term) {
if ($term->slug != 'museum') { // Убедитесь, что не удаляем основной термин
// Получить события, связанные с дубликатом
$args = array(
'post_type' => 'event', // Измените на ваш тип поста события
'tax_query' => array(
array(
'taxonomy' => 'venue',
'field' => 'term_id',
'terms' => $term->term_id,
),
),
);
// Получаем все посты, связанные с дубликатом
$posts = get_posts($args);
// Переносим все посты к основному термину
foreach ($posts as $post) {
wp_set_object_terms($post->ID, 'museum', 'venue', true); // Переносим к основному термину
}
// Удаляем дублирующий термин
wp_delete_term($term->term_id, 'venue');
}
}
Тестирование и резервное копирование
Перед запуском любого кода, который изменяет или удаляет данные в базе данных, важно сделать резервную копию базы данных. Это гарантирует, что в случае непредвиденных ошибок вы сможете восстановить ранее работоспособное состояние.
Заключение
Использование WordPress API для управления терминами является более надежным и безопасным подходом, поскольку он учитывает все взаимосвязи между записями и терминами. Следуя этому примеру, вы сможете избавиться от дубликатов и сохранить целостность данных на вашем сайте.
Если у вас остались вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться к профессионалам в области разработки WordPress.