Массовое удаление непопулярных тегов

Массовое удаление непопулярных тегов

У меня есть 1000 тегов, и я хотел бы просто удалить все теги, которые не используются более X раз... т.е. 5 раз.

Кто-нибудь знает простой способ сделать это? Даже чистый SQL будет просто КАЧАТЬ!


person Mitch Moccia    schedule 27.12.2010    source источник


Ответы (4)


$x = 5; // set this to any number
$sql = "SELECT `name` FROM `wp_terms`";
$result = mysql_query($sql);
$count = array();
while($row = mysql_fetch_assoc($result))
{
  $count[$name]++;
}
foreach($count as $key = $value)
{
  if($value < $x)
    {
      $sql2 = "DELETE FROM `wp_terms` WHERE `name` = '". $key ."'";
      $result2 = mysql_query($sql2);
    }
}

Есть более эффективные способы сделать это, но это сделает работу.

Изменить: сначала сделайте резервную копию. Я не совсем уверен, что эта таблица предназначена исключительно для тегов.

person Citizen    schedule 27.12.2010
comment
Удивительно, большое спасибо за супер быстрые ответы... Сейчас попробую. Еще раз спасибо - person Mitch Moccia; 27.12.2010
comment
Я думаю, вы захотите использовать пример Джейсона МакКрири, чтобы изменить мой код (или просто запустить запросы и посмотреть, что произойдет). Похоже, вам нужно удалить строки в трех слоях, а не только из одной базы данных. - person Citizen; 27.12.2010
comment
вы можете удалить только из wp_terms, но у вас будет плохая целостность данных и проблемы, если вы добавите еще один тег с тем же именем. - person Jason McCreary; 29.12.2010

Лучше всего использовать команду SQL. Таблицы wp_terms, wp_term_relationships и wp_term_taxonomy представляют интерес. WordPress отслеживает отношения с wp_term_taxonomy.count. Таким образом, эта помощь облегчает жизнь.

-- remove terms
DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy = 'tag' AND count <= 5;)
-- remove all relationships
DELETE FROM wp_term_relationships WHERE term_taxonomy_id IN (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy = 'tag' AND count <= 5;)
-- remove taxonomy entry
DELETE FROM wp_term_taxonomy WHERE taxonomy = 'tag' AND count <= 5;

Примечание. Я настоятельно рекомендую сделать резервную копию этих таблиц перед выполнением приведенных выше команд.

person Jason McCreary    schedule 27.12.2010
comment
@Риккардо. Так и должно быть, поскольку я не знаю об изменениях схемы в 3.1.3. В любом случае обратите внимание на мое Примечание. :) - person Jason McCreary; 14.06.2011
comment
Да, я сделал резервную копию и начал очистку. 38 000 тегов удалено! Большое спасибо! - person Riccardo; 14.06.2011
comment
@Риккардо. Здорово. Если вы нашли это полезным, вы должны проголосовать за него. - person Jason McCreary; 14.06.2011
comment
Кстати, я вижу комментарий Колчи ниже. Мне пришлось изменить «тег» на «post_tag» - person Riccardo; 15.06.2011

Обязательно сначала сделайте резервную копию базы данных

DELETE a,c FROM wp_terms AS a
LEFT JOIN wp_term_taxonomy AS c ON a.term_id = c.term_id
LEFT JOIN wp_term_relationships AS b on b.term_taxonomy_id = c.term_taxonomy_id
WHERE ( c.taxonomy = 'post_tag' AND c.count <= 5 );

В последней строке вы также можете изменить c.count <= 5 и заменить 5 на любое число по вашему выбору.

person Appoodeh    schedule 17.06.2020

Ответ Джейсона сработал, за исключением того, что в моей установке имя таксономии было «post_tag», а не «tag».

person Kolchy    schedule 15.02.2011
comment
Лучше всего комментировать ответ и голосовать, если он сработал для вас, а не предоставлять отдельный ответ. - person Jason McCreary; 14.06.2011