2017-04-21 2 views
0

Wenn ich diesen Code auf meiner wp_posts Tabelle (mit phpmyadmin) ausführen, gibt es einen einzigen doppelten Post zurück.Wie lösche doppelte Wordpress Posts in DB

SELECT a.ID, a.post_title, a.post_type, a.post_status 
FROM wp_posts AS a 
INNER JOIN (
    SELECT post_title, MIN(id) AS min_id 
    FROM wp_posts 
    WHERE post_type = 'post' 
    AND post_status = 'publish' 
    GROUP BY post_title 
    HAVING COUNT(*) > 1 
) AS b ON b.post_title = a.post_title 
AND b.min_id <> a.id 
AND a.post_type = 'post' 
AND a.post_status = 'publish' 

Beachten Sie, dass diese gegeben Beitrag ist eigentlich kein Duplikat ist, hat es nur den gleichen Titel wie ein anderes (ein normales Verhalten angesichts der oben stehenden Code für doppelte Titel aussieht). Das Problem ist jedoch, dass es tatsächlich Hunderte von doppelten Posts in der Datenbank gibt (ich kann sie sehen, wenn ich manuell nachschaue), also warum kann ich sie nicht mit dem obigen Code finden?

  • ich auch die beiden doppelten Beiträge aus dem Wordpress-Admin-Panel ...
  • Ich habe auch versucht ein paar Wordpress Plugins zu verwenden sehen und sie alle die gleiche doppelte Post wie der Code oben gefunden, aber keiner von die Anderen).

Edit: Wenn ich zwei Zufalls Duplikate suchen, hat man:

ID 9462 
post date 2017-03-07 13:06:31 
post content "foo" 
post title "Les pendules à l'heure" 
post status "publish" 
post type "post" 
guid "http://www.exemple.com/?p=9462" 

Der andere hat:

ID 11409 
post date 2017-03-07 13:06:31 
post content "foo" 
post title "Les pendules à l&#039;heure" 
post status "publish" 
post type "post" 
guid "http://www.exemple.com/?p=9462" 

Dank

+1

wenn Sie manuell Schau dir die Datenbank an, überprüfst du post_type und post_status deine Suchanfrage? –

+0

Ich habe weitere Informationen in meinem Beitrag hinzugefügt. Ja, post_type und post_status passen zusammen. @lan Kenney – CharleyB0y

+0

@Lan Kenney, Sorry ... Ich habe gerade meinen Post bearbeitet ... Es sieht so aus, als würden sie übereinstimmen, wenn sie im Browser angezeigt werden, aber wenn ich mir den Code anschaue, hat der eine "" "während der andere hat . Vielleicht muss ich zuerst die Sonderzeichen reparieren? Welchen sollte ich in meiner Datenbank behalten? Das "'" oder das '? – CharleyB0y

Antwort

0

Hier ist, wie ich es geschafft um mein Problem zu beheben ...

Ich bemerkte, dass, obwohl die Titel zwischen den doppelten Posts identisch aussahen, einer einen Apostroph hatte, während der andere & # 039;

Also zuerst lief ich diese Abfrage, um zu sehen, wie viele Post-Titel Apostrophe hatte:

SELECT post_title FROM wp_posts WHERE post_title LIKE "%'%", 

Es 1.825 Treffer. Dann habe ich den folgenden Befehl ausgeführt, um zu sehen, wie viele Posttitel & # 039 hatten;

SELECT post_title FROM wp_posts WHERE post_title LIKE "%&#039;%" 

Es ergab 720 Ergebnisse. Also dachte ich, ich würde alle & # 039 ersetzen; von Apostrophe, die folgende Abfrage verwenden:

UPDATE wp_posts SET post_title = REPLACE (post_title, '&#039;', '\''); 

Dann konnte ich verwenden:

SELECT a.ID, a.post_title, a.post_type, a.post_status 
FROM wp_posts AS a 
INNER JOIN (
    SELECT post_title, MIN(id) AS min_id 
    FROM wp_posts 
    WHERE post_type = 'post' 
    AND post_status = 'publish' 
    GROUP BY post_title 
    HAVING COUNT(*) > 1 
) AS b ON b.post_title = a.post_title 
AND b.min_id <> a.id 
AND a.post_type = 'post' 
AND a.post_status = 'publish' 

Welche 572 Beiträge zurückgekehrt, die ich einfach mit gelöscht:

DELETE a.* 
FROM wp_posts AS a 
    INNER JOIN (
     SELECT post_title, MIN(id) AS min_id 
     FROM wp_posts 
     WHERE post_type = 'post' 
     AND post_status = 'publish' 
     GROUP BY post_title 
     HAVING COUNT(*) > 1 
    ) AS b ON b.post_title = a.post_title 
AND b.min_id <> a.id 
AND a.post_type = 'post' 
AND a.post_status = 'publish' 
0
Try this 

DELETE a.* 
FROM wp_posts AS a 
    INNER JOIN (
     SELECT post_title, MIN(id) AS min_id 
     FROM wp_posts 
     WHERE post_type = 'post' 
     AND post_status = 'publish' 
     GROUP BY post_title 
     HAVING COUNT(*) > 1 
    ) AS b ON b.post_title = a.post_title 
AND b.min_id <> a.id 
AND a.post_type = 'post' 
AND a.post_status = 'publish' 
+0

Das möchte ich nicht machen. Ich suche nur nach den Duplikaten für jetzt. Ich werde sie löschen, wenn SELECT die Duplikate zurückgibt. – CharleyB0y

Verwandte Themen