2014-11-01 49 views
-1

我想將此功能添加到以下代碼中,以便它還刪除具有相同元鍵值的帖子。換句話說,有一個meta key'source_link',我想刪除'source_link'具有相同值的重複項。 這是當前的代碼:使用SQL刪除具有相同元鍵值的重複帖子

$wpdb->query(" 
    DELETE double_posts.* 
    FROM $wpdb->posts as double_posts 
    INNER JOIN (
    SELECT post_title, MIN(id) as min_id 
    FROM $wpdb->posts 
    WHERE (post_status = 'publish' 
    AND post_type = 'post') 
    OR (post_status = 'published' 
    AND post_type = 'post') 
    GROUP BY post_title 
    HAVING COUNT(*) > 1 
    ) AS orig_posts ON orig_posts.post_title = double_posts.post_title 
    AND orig_posts.min_id <> double_posts.id 
    "); 

目前,它僅僅指剛刪除重複的文章標題的帖子。我想保留這一點,然後通過重複元鍵值添加刪除。這裏的任何幫助都會很棒!謝謝。

+0

我剛更新了帖子。該代碼運行良好,它只能刪除重複標題的帖子。我希望通過重複標題和元鍵值來刪除帖子。我問後者。 – arian1123 2014-11-01 00:24:26

+0

嘗試收集所有需要刪除的帖子的ID並使用[wp_delete_post](http://codex.wordpress.org/Function_Reference/wp_delete_post),因爲該功能將刪除與帖子相關的所有與該帖子相關的數據。 – Danijel 2014-11-01 00:56:11

+0

你的sql只會選擇其中一個重複項,如果你有2個,那麼你會得到3個或更多... – doublesharp 2014-11-01 00:57:58

回答

0

您的內部查詢僅獲取MIN(id)這意味着您的刪除中只包含可能有很多重複項中的一項。還有幾種方法 - 如果你想強制執行它,你可能會考慮一個數據庫唯一鍵索引。

請務必在運行這些查詢之前備份數據庫,以免出現問題。

要通過post_title刪除所有重複:

DELETE p1 
FROM 
    {$wpdb->posts} p1, 
    {$wpdb->posts} p2 
WHERE 
    p1.ID > p2.ID 
    AND p1.post_title = p2.post_title 

要通過重複meta_key刪除所有帖子:

DELETE p, pm1 
FROM 
    {$wpdb->posts} p, 
    {$wpdb->postmeta} pm1, 
    {$wpdb->postmeta} pm2 
WHERE 
    p.ID = pm1.post_id 
    AND pm1.post_id > pm2.post_id 
    AND pm1.meta_key = 'source_link' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value 
+0

我看到OP查詢正在刪除所有不等於最小ID的ID,這是正確的 – radar 2014-11-01 01:42:53

+0

這是正確的,現在我再看一遍,但仍然更詳細。 – doublesharp 2014-11-01 02:06:19

+0

這會刪除所有重複或只是1重複?我不是一個SQL專家我的任何意思,所以糾正我,如果我錯了,但似乎你只是比較2職位。我需要此代碼來刪除所有重複項。謝謝 – arian1123 2014-11-03 01:59:49

相關問題