2014-11-01 41 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