web-dev-qa-db-fra.com

Mysql Query to Delete Duplicate Wordpress post?

J'ai beaucoup de messages en double. Alors, comment les supprimer (ne garder que 1 message). S'ils ont le même titre, ce sont des messages en double. Merci beaucoup ! Bonne journée !

3
Nguyen

Je ne suis pas tout à fait sûr que vous puissiez le faire avec une seule requête dans MySQL, car vous ne pouvez pas supprimer des tables que vous référencez dans une sous-requête. En fait, je vous recommanderais de le faire en utilisant wp-cli et en utilisant l’API WordPress pour supprimer les posts en double (qui supprimeront également les méta-posts et les références de termes associés):

global $wpdb;

$duplicate_titles = $wpdb->get_col("SELECT post_title FROM {$wpdb->posts} GROUP BY post_title HAVING COUNT(*) > 1");

foreach( $duplicate_titles as $title ) {
   $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title=%s", $title ) ); 
   // Iterate over the second ID with this post title till the last
   foreach( array_slice( $post_ids, 1 ) as $post_id ) {
       wp_delete_post( $post_id, true ); // Force delete this post
   }
}

J'espère que cela t'aides.

4
Bendoh

Je sais, c’est un vieux fil, mais comme j’avais un problème similaire, j’aimerais ajouter quelques conseils à la réponse de Bendoh (malheureusement, je n’ai pas la réputation de faire un commentaire)

Depuis que wordpress et certains plugins stockent également des données dans la table post, je recommanderais d'ajouter un post_type à votre querry:

global $wpdb;

$duplicate_titles = $wpdb->get_col("SELECT post_title FROM {$wpdb->posts} WHERE `post_type` = 'post' GROUP BY post_title HAVING COUNT(*) > 1");

foreach( $duplicate_titles as $title ) {
    $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title=%s", $title ) ); 
    // Iterate over the second ID with this post title till the last
    foreach( array_slice( $post_ids, 1 ) as $post_id ) {
        wp_delete_post( $post_id, true ); // Force delete this post
    }
}

En fonction de la source de vos doublons, j'ajouterais un autre champ pour vérifier les doublons, comme la date de publication.

global $wpdb;

$duplicate_titles = $wpdb->get_results("SELECT post_title, post_date, CONCAT(post_date, post_title) AS WHOLENAME FROM {$wpdb->posts} WHERE post_type = 'post' GROUP BY WHOLENAME HAVING COUNT(WHOLENAME) > 1");


foreach( $duplicate_titles as $title ) {

    $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title=%s AND post_date='".$title->post_date."'", $title->post_title ) ); 

    foreach( array_slice( $post_ids, 1 ) as $post_id ) {
        wp_delete_post( $post_id, true ); // Force delete this post
    }

}
1
Julian Hi