Lorsque j'exécute ce code sur ma table wp_posts (en utilisant phpmyadmin), il renvoie un seul post en double.

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'

Notez que ce post donné n'est en fait pas un doublon, il n'a que le même titre qu'un autre (un comportement normal étant donné que le code ci-dessus recherche les titres en double). Cependant, le problème est qu'il y a en fait des centaines de messages en double dans la base de données (je peux les voir si je regarde manuellement), alors pourquoi ne puis-je pas les trouver en utilisant le code ci-dessus?

  • Je peux également voir ces deux articles en double depuis le panneau d'administration de wordpress ...
  • J'ai également essayé d'utiliser quelques plugins Wordpress et ils ont tous trouvé le même message en double que le code ci-dessus, mais aucun des autres).

Edit: Si je regarde deux doublons aléatoires, l'un a:

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"

L'autre a:

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"

Merci

0
CharleyB0y 21 avril 2017 à 03:25

3 réponses

Meilleure réponse

Voici comment j'ai réussi à résoudre mon problème ...

J'ai remarqué que même si les titres se ressemblaient entre les articles en double, l'un avait une apostrophe tandis que l'autre avait & # 039;

J'ai donc d'abord lancé cette requête pour voir combien de titres de publication avaient des apostrophes:

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

Il a renvoyé 1825 résultats. Ensuite, j'ai exécuté la commande suivante pour voir combien de titres de publication avaient & # 039;

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

Il a renvoyé 720 résultats. J'ai donc pensé que je remplacerais tous les & # 039; par apostrophes, en utilisant la requête suivante:

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

Ensuite, j'ai pu utiliser:

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'

Qui a renvoyé 572 articles, que j'ai simplement supprimés en utilisant:

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'
2
CharleyB0y 21 avril 2017 à 17:11

La méthode ci-dessus peut être lente. Vous pouvez le faire à la manière BIG BOY ...

- Créer une table temporaire CREATE TABLE posts_temp_table LIKE wp_posts;

- Ajout de la contrainte ALTER TABLE posts_temp_table ADD UNIQUE (YOUR_UNIQUE_FIELD, id);

- Copier les données INSERT IGNORE INTO posts_temp_table SELECT * FROM wp_posts;

- Renommez et déposez RENAME TABLE wp_posts TO old_wp_posts, posts_temp_table TO wp_posts; DROP TABLE old_wp_posts;

0
xemlo 13 févr. 2020 à 21:51
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'
-1
Ahmed Ginani 21 avril 2017 à 11:13