J'utilise WordPress 3.4.2 pour l'un de mes sites et il en possède actuellement 38 251 Mots clés
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.
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;
}