it-swarm.com.de

MySQL-Abfrage, um doppelte Wordpress-Beiträge zu löschen?

Ich habe viele doppelte Beiträge. Also, wie man sie löscht (nur 1 Beitrag behalten). Wenn sie denselben Titel haben, handelt es sich um doppelte Beiträge. Vielen Dank ! Einen schönen Tag noch !

3
Nguyen

Ich bin mir nicht ganz sicher, ob Sie dies mit einer einzelnen Abfrage in MySQL tun können, da Sie nicht aus Tabellen löschen können, auf die Sie in einer Unterabfrage verweisen. Ich würde empfehlen, dies mit wp-cli und der WordPress-API zu tun, um die doppelten Posts zu löschen (wodurch auch alle Post-Metas und zugehörigen Termverweise gelöscht werden):

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
   }
}

Hoffe das hilft.

4
Bendoh

Ich weiß, es ist ein alter Thread, aber da ich ein ähnliches Problem hatte, möchte ich der Antwort von Bendoh einige Ratschläge hinzufügen (leider habe ich nicht den Ruf, einen Kommentar abzugeben)

Da WordPress und einige Plugins auch Daten in der Post-Tabelle speichern, würde ich empfehlen, Ihrem Querry einen post_type hinzuzufügen:

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
    }
}

Abhängig von der Quelle Ihrer Duplikate würde ich auch ein anderes Feld hinzufügen, um nach Duplikaten zu suchen, wie das Veröffentlichungsdatum.

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