source

DB에서 중복된 Wordpress 게시물을 삭제하는 방법

lovecheck 2023. 1. 2. 22:40
반응형

DB에서 중복된 Wordpress 게시물을 삭제하는 방법

이 코드를 wp_posts 테이블에서 실행하면(ppmyadmin을 사용하여) 중복된 투고가 1개 반환됩니다.

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'

이 게시물은 실제로 중복된 것이 아니라 다른 게시물과 동일한 제목입니다(위의 코드가 중복된 제목을 찾는 일반적인 동작).단, 실제로는 데이터베이스 내에 수백 개의 중복 투고가 있는데(수동으로 보면 알 수 있습니다), 위의 코드를 사용하여 찾을 수 없는 이유는 무엇입니까?

  • 워드프레스 관리 패널에서 두 개의 중복된 게시물을 볼 수 있습니다.
  • Wordpress 플러그인을 몇 개 사용해보니 모두 위의 코드와 동일한 게시물을 찾았지만 다른 게시물은 없었습니다.)

[Edit] : 2개의 랜덤한 중복을 보면, 1개는 다음과 같습니다.

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"

다른 하나는 다음과 같습니다.

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"

감사해요.

내가 문제를 해결할 수 있었던 방법은 다음과 같다.

중복된 게시물들 사이에 제목이 같아 보였지만, 하나는 아포스트로피가 있는 반면 다른 하나는 &#39;를 가지고 있다는 것을 알게 되었다.

그래서 먼저 이 쿼리를 실행하여 몇 개의 게시 제목에 아포스트로피가 있는지 확인했습니다.

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

1825건의 결과가 나왔다.그런 다음 다음 다음 명령을 실행하여 포스트 타이틀의 수를 확인했습니다.

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

720개의 결과를 반환했습니다.그래서 다음 쿼리를 사용하여 모든 &#039;를 아포스트로피로 대체하기로 했습니다.

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

그 후 다음을 사용할 수 있었습니다.

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'

572개의 투고가 반환되었습니다.그것은, 다음의 방법으로 간단하게 삭제했습니다.

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'

위의 방법은 느릴 수 있습니다.넌 빅보이 방식으로 할 수 있어

-- 임시 테이블 CREATE TABLE posts_temp_table Like wp_posts를 만듭니다.

-- 제약조건 ALTER TABLE posts_temp_table ADD UNIQURE(YOUR_)를 추가합니다.UNIQURE_FIELD, id);

-- 데이터 INSERT IGNORE INTO posts_temp_table SELECT * FROM wp_posts;

-- 이름 변경 테이블 wp_posts를 old_wp_posts로, posts_temp_table을 wp_posts로, 드롭 테이블을 old_wp_posts로 변경합니다.

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'

언급URL : https://stackoverflow.com/questions/43531980/how-delete-duplicate-wordpress-posts-in-db

반응형