kolchy
  • 0
Новичок

Удаление тегов сообщений удаляет категории

  • 0

Я пытаюсь удалить старые почтовые теги из нескольких установок WP. В некоторых случаях у меня более 20 тысяч тегов для нескольких тысяч постов. Я пробовал следующий код:

delete t.*,tt.*,tr.*
FROM wp_terms AS t
INNER JOIN wp_term_taxonomy as tt
INNER JOIN wp_term_relationships as tr
WHERE tt.term_id = t.term_id
AND tr.term_taxonomy_id = tt.term_taxonomy_id
AND tt.taxonomy = 'post_tag'
AND tt.count < 5

Предполагается, что это удалит любые теги, которые используются менее чем в 5 сообщениях. После того, как я запустил его, я заметил, что ряд категорий также удален (таксономия = «категория»), и я не понимаю, почему? Кому-нибудь еще удалось это сделать??

Share
  1. Я не уверен в этом, но то, как настроены таблицы, WordPress может повторно использовать одну и ту же terms запись (с одним и тем же term_id ) в разных таксономиях. То есть, если у вас post_tag колл favorites и у вас тоже колл category, favorites вполне может быть, что WP использует одну и ту же terms запись для обоих и только диверсифицирует их через term_taxonomy_id таблицу. В этом есть очевидные преимущества.

    Итак… если ваш запрос выше находит термин как часть запроса и удаляет его, то, если он также используется как категория, он также исчезает, потому что запись термина исчезла, и связь больше не может быть нарисована.

    Как уже было сказано, я не проверял, действительно ли WP делает это именно так, но это объяснило бы ваш феномен.

    Решением будет удаление термина только в том случае, если его идентификатор появляется только tt.term_id один раз. Я бы рекомендовал разбить запрос для этого.

    • 0
  2. Спасибо за совет — вот как это закончилось, и, похоже, это работает 🙂

    DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy = 'post_tag' AND count <= 5) and term_id not in (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy = 'category')
    DELETE FROM wp_term_relationships WHERE term_taxonomy_id IN (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy = 'post_tag' AND count <= 5) and term_taxonomy_id not in (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy = 'category')
    DELETE FROM wp_term_taxonomy WHERE taxonomy = 'post_tag' AND count <= 5
    
    • 0

Оставить ответ

You must login to add an answer.