使用SQL删除具有相同元键值的重复帖子
我想将此功能添加到以下代码中,以便它还删除具有相同元键值的帖子。换句话说,有一个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
");
目前,它仅仅指刚删除重复的文章标题的帖子。我想保留这一点,然后通过重复元键值添加删除。这里的任何帮助都会很棒!谢谢。
您的内部查询仅获取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
我看到OP查询正在删除所有不等于最小ID的ID,这是正确的 – radar 2014-11-01 01:42:53
这是正确的,现在我再看一遍,但仍然更详细。 – doublesharp 2014-11-01 02:06:19
这会删除所有重复或只是1重复?我不是一个SQL专家我的任何意思,所以纠正我,如果我错了,但似乎你只是比较2职位。我需要此代码来删除所有重复项。谢谢 – arian1123 2014-11-03 01:59:49
我刚更新了帖子。该代码运行良好,它只能删除重复标题的帖子。我希望通过重复标题和元键值来删除帖子。我问后者。 – arian1123 2014-11-01 00:24:26
尝试收集所有需要删除的帖子的ID并使用[wp_delete_post](http://codex.wordpress.org/Function_Reference/wp_delete_post),因为该功能将删除与帖子相关的所有与该帖子相关的数据。 – Danijel 2014-11-01 00:56:11
你的sql只会选择其中一个重复项,如果你有2个,那么你会得到3个或更多... – doublesharp 2014-11-01 00:57:58