[英]Remove duplicated imported orders in Woocommerce
我在 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
首先如果你不知道,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 文件中。 測試和工作。
重復的訂單將在第一個前端頁面加載時刪除。 因此,之后您可以刪除或注釋代碼。
嘗試刪除連接,任意保留最大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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.