web-dev-qa-db-fra.com

Massive Tags Remove avec MySQL

J'utilise WordPress 3.4.2 pour l'un de mes sites et il en possède actuellement 38 251 Mots clésenter image description here
Maintenant, je veux supprimer toutes les balises de mon site. Ainsi, quel chemin sera le plus sûr pour tronquer toutes les balises de mon site.

1
rakibtg

La syntaxe MySql DELETE n'est pas très différente de SELECT, vous pouvez donc supprimer de plusieurs tables en utilisant une seule requête.

Les informations de taxonomies dans WordPress sont regroupées dans 3 tableaux:

  • wp_terms
  • wp_term_taxonomy
  • wp_term_relationships

les 2 premiers contiennent des informations sur les termes/taxonomie, le 3ème contient une association entre les termes et les posts.

La requête pour supprimer toutes les balises de la base de données WordPress est:

DELETE t, tr, tt
FROM wp_terms t  
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy = 'post_tag'

Notez que le préfixe wp_ peut être différent dans votre configuration, cela dépend du réglage de $table_prefix dans votre fichier wp_config.php. Plus d'infos ici .

Assurez-vous de remplacer le préfixe par la valeur correcte dans la requête pour les 3 tables.

Notez également que lors de l’installation de sur plusieurs sites , le nom complet de la table est

$prefix . $blogid . '_' . $tablename`

par exemple. Si le préfixe est le 'wp_' par défaut, le blog est 2, les 3 tables seront nommées:

  • wp_2_terms
  • wp_2_term_relationships
  • wp_2_term_taxonomy

Plus d'infos ici .

Enfin, veuillez vous assurer de disposer d’une sauvegarde complète et valide de la base de données avant d’exécuter une telle requête .

La requête peut être exécutée à l'aide d'un outil d'administration de base de données tel que phpMyAdmin .

Exécuter une requête via php est simple, car avec WordPress $wpdb classe, les noms de table sont résolus automatiquement , mais est plus difficile d'un autre côté, car vous devez empêcher la requête d'être exécutée plusieurs fois, vous devez vérifier les capacités de l'utilisateur et éditer les fichiers php.

Le code suivant utilise un transitoire pour s’assurer que cette fonction s’exécute une fois, et ne l’exécute également que si un super-administrateur est connecté en arrière-plan en utilisant is_super_admin() .

add_action('admin_init', function() {
  if ( ! is_super_admin() ) return;
  if ( get_transient('tags_cleaned') ) return;
  add_action( 'shutdown', 'my_clean_tags' );
});

function my_clean_tags() {
  if ( ! is_super_admin() ) return;
  if ( get_transient('tags_cleaned') ) return;
  remove_action( current_filter(), __FUNCTION__ );
  global $wpdb;
  $q = "
  DELETE t, tr, tt
  FROM {$wpdb->terms} t  
  INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
  INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
  WHERE tt.taxonomy = 'post_tag'
  ";
  $result = $wpdb->query( $q );
  set_transient(' tags_cleaned', $result );
  return $result;
}
3
gmazzap