我在Woocommerce中有重复的订单,我想删除它们以仅保持唯一的清洁账簿。
我不擅长SQL,我编写了此请求,但是当有重复项时,它会列出两个重复项。
SELECT *
FROM `wp_posts`
WHERE post_type = 'shop_order' AND post_status = 'wc-completed'
GROUP BY post_date
HAVING count(*) > 1
ORDER BY `wp_posts`.`post_date` DESC
这给了我307个结果。
如何编写正确的请求以删除重复项并仅保留唯一订单?
样本数据:
ID post_author post_date post_date_gmt post_content post_title post_excerpt post_status comment_status ping_status post_password post_name to_ping pinged post_modified post_modified_gmt post_content_filtered post_parent guid menu_order post_type post_mime_type comment_count
22282 227 2018-02-04 01:00:00 2018-02-04 00:00:00 Order – February 4, 2018 @ 01:00 AM wc-completed open closed order-4-02-18-6 2018-03-19 17:12:32 2018-03-19 16:12:32 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 2
22277 0 2018-01-29 01:00:00 2018-01-29 00:00:00 Order – January 29, 2018 @ 01:00 AM wc-completed open closed order-29-01-18-2 2018-03-19 17:12:33 2018-03-19 16:12:33 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 2
22276 0 2018-01-28 01:00:00 2018-01-28 00:00:00 Order – January 28, 2018 @ 01:00 AM wc-completed open closed order-28-01-18-2 2018-03-19 17:12:33 2018-03-19 16:12:33 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 2
22275 0 2018-01-25 01:00:00 2018-01-25 00:00:00 Order – January 25, 2018 @ 01:00 AM wc-completed open closed order-25-01-18-2 2018-03-19 17:12:33 2018-03-19 16:12:33 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 2
22232 154 2018-01-24 00:00:00 2018-01-24 00:00:00 Order – January 24, 2018 @ 12:00 AM wc-completed open closed order-24-01-18-4 2018-01-24 00:00:00 2018-01-24 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22230 213 2018-01-23 00:00:00 2018-01-23 00:00:00 Order – January 23, 2018 @ 12:00 AM wc-completed open closed order-23-01-18-2 2018-01-23 00:00:00 2018-01-23 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22229 0 2018-01-22 00:00:00 2018-01-22 00:00:00 Order – January 22, 2018 @ 12:00 AM wc-completed open closed order-22-01-18-2 2018-01-22 00:00:00 2018-01-22 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22228 224 2018-01-20 00:00:00 2018-01-20 00:00:00 Order – January 20, 2018 @ 12:00 AM wc-completed open closed order-20-01-18-2 2018-01-20 00:00:00 2018-01-20 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22227 0 2018-01-19 00:00:00 2018-01-19 00:00:00 Order – January 19, 2018 @ 12:00 AM wc-completed open closed order-19-01-18-2 2018-01-19 00:00:00 2018-01-19 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22226 0 2018-01-17 00:00:00 2018-01-17 00:00:00 Order – January 17, 2018 @ 12:00 AM wc-completed open closed order-17-01-18-2 2018-01-17 00:00:00 2018-01-17 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22225 0 2018-01-16 00:00:00 2018-01-16 00:00:00 Order – January 16, 2018 @ 12:00 AM wc-completed open closed order-16-01-18-2 2018-01-16 00:00:00 2018-01-16 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22224 0 2018-01-15 00:00:00 2018-01-15 00:00:00 Order – January 15, 2018 @ 12:00 AM wc-completed open closed order-15-01-18-4 2018-01-15 00:00:00 2018-01-15 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
22222 0 2018-01-14 00:00:00 2018-01-14 00:00:00 Order – January 14, 2018 @ 12:00 AM wc-completed open closed order-14-01-18-6 2018-01-14 00:00:00 2018-01-14 00:00:00 0 https://www.hemen-biarritz.com/?post_type=shop_ord... 0 shop_order 0
编辑:
SELECT DISTINCT post_date FROM `wp_posts` WHERE post_type = 'shop_order' AND post_status = 'wc-completed'
给我614个结果,是前一个请求的两倍。
WordPress:5.0
Woocommerce:3.5.2
答案 0 :(得分:2)
首先,如果您不知道,woocommerce订单数据位于四(4)个表中:
wp_posts
wp_postmeta
wp_woocommerce_order_items
wp_woocommerce_order_itemmeta
因此以下挂钩函数使用WPDB
类和方法。它将:
但是请务必始终进行数据库备份。
代码可以在任何前端页面加载 (使用后将其删除)中一口气完成这项工作:
add_action( 'template_redirect', 'progressive_delete_duplicated_orders' );
function progressive_delete_duplicated_orders() {
global $wpdb;
// Get duplicated orders (smaller ID)
$duplicated_orders = (array) $wpdb->get_col("
SELECT p.ID, pm.meta_value, COUNT(*) as c
FROM {$wpdb->prefix}postmeta as pm
INNER JOIN {$wpdb->prefix}posts as p ON p.ID = pm.post_id
WHERE p.post_status = 'wc-completed'
AND pm.meta_key = '_order_key'
GROUP BY pm.meta_value
HAVING c > 1
");
if( sizeof($duplicated_orders) == 1 )
$where_clause = 'WHERE p.ID = ' . reset($duplicated_orders);
elseif( sizeof($duplicated_orders) > 1 )
$where_clause = 'WHERE p.ID IN (' . implode( ',',$duplicated_orders ) . ')';
else return; // Exit
// Delete duplicated Orders data everywhere
$wpdb->query("
DELETE p, pm, woi, woim
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}woocommerce_order_items as woi ON p.ID = woi.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
$where_clause
");
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试和工作。
重复的订单将在第一个前端页面加载时被删除。因此,之后您可以删除或注释代码。
答案 1 :(得分:1)
尝试删除联接,以最大ID
任意保留记录:
DELETE
FROM wp_posts
WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND
ID NOT IN (SELECT ID
FROM (SELECT MAX(ID) AS ID FROM wp_posts
GROUP BY post_date, post_author) t);
如果您只想查看删除了逻辑重复项的帖子,请尝试:
SELECT w1.*
FROM wp_posts w1
INNER JOIN
(
SELECT post_date, post_author, MAX(ID) AS max_id
FROM wp_posts
WHERE post_type = 'shop_order' AND post_status = 'wc-completed'
GROUP BY post_date, post_author
) w2
ON w1.post_date = w2.post_date AND
w1.post_author = w2.post_author AND
w1.ID = w2.max_id
WHERE w1.post_type = 'shop_order' AND w1.post_status = 'wc-completed'