Διαγραφή προϊόντων WooCommerce από συγκεκριμένο WP All Import με SQL

Η διαχείριση χιλιάδων προϊόντων στο WooCommerce συχνά απαιτεί μαζικές εισαγωγές με το WP All Import. Αλλά τι γίνεται αν χρειαστεί να διαγράψετε όλα τα προϊόντα που προήλθαν από μια συγκεκριμένη εισαγωγή;

Αντί να τα σβήνετε χειροκίνητα ένα-ένα, μπορείτε να εκτελέσετε ένα SQL query απευθείας στη βάση δεδομένων σας. Αυτή η μέθοδος εξασφαλίζει μια καθαρή διαγραφή προϊόντων, παραλλαγών και όλων των σχετικών δεδομένων τους (συνημμένα, μεταδεδομένα, σχέσεις).

Γιατί να διαγράψετε προϊόντα βάσει Import ID;

Υπάρχουν αρκετές περιπτώσεις όπου αυτό είναι απαραίτητο:

  • Κάνατε δοκιμαστική εισαγωγή σε staging και θέλετε να την αναιρέσετε.

  • Κάνατε κατά λάθος εισαγωγή διπλότυπων προϊόντων.

  • Θέλετε να αντικαταστήσετε ολόκληρο το product feed ενός προμηθευτή.

Στοχεύοντας το import_id που χρησιμοποιεί το WP All Import, μπορείτε να διαγράψετε με ασφάλεια οτιδήποτε συνδέεται με εκείνο το batch.

SQL Query για διαγραφή προϊόντων από συγκεκριμένο import

⚠️ Σημαντικό: Πάντα να δημιουργείτε ένα backup της βάσης δεδομένων πριν εκτελέσετε καταστροφικά queries.
Αντικαταστήστε το A9B2c1u_ με το δικό σας table prefix του WordPress και ορίστε το @IMPORT_ID.

🗃️
woocommerce-delete-products-by-import-id.sql
Copy to clipboard
-- Set your specific import ID here
SET @IMPORT_ID = 1;

-- 1) Collect ALL products & variations from this import
CREATE TEMPORARY TABLE to_del (id BIGINT PRIMARY KEY);

INSERT INTO to_del
SELECT p.ID
FROM A9B2c1u_posts p
JOIN A9B2c1u_pmxi_posts x ON x.post_id = p.ID
WHERE x.import_id = @IMPORT_ID
  AND p.post_type IN ('product','product_variation');

-- 2) (Optional but recommended) Delete related attachments
CREATE TEMPORARY TABLE to_del_att (id BIGINT PRIMARY KEY);

INSERT INTO to_del_att
SELECT a.ID
FROM A9B2c1u_posts a
WHERE a.post_type = 'attachment'
  AND a.post_parent IN (SELECT id FROM to_del);

DELETE pm FROM A9B2c1u_postmeta pm
JOIN to_del_att da ON pm.post_id = da.id;

DELETE tr FROM A9B2c1u_term_relationships tr
JOIN to_del_att da ON tr.object_id = da.id;

DELETE a FROM A9B2c1u_posts a
JOIN to_del_att da ON a.ID = da.id;

DROP TABLE to_del_att;

-- 3) Delete products/variations + all related records
DELETE pm FROM A9B2c1u_postmeta pm
JOIN to_del d ON pm.post_id = d.id;

DELETE tr FROM A9B2c1u_term_relationships tr
JOIN to_del d ON tr.object_id = d.id;

DELETE wcl FROM A9B2c1u_wc_product_meta_lookup wcl
JOIN to_del d ON wcl.product_id = d.id;

DELETE p FROM A9B2c1u_posts p
JOIN to_del d ON p.ID = d.id;

DELETE x FROM A9B2c1u_pmxi_posts x
JOIN to_del d ON x.post_id = d.id;

DROP TABLE to_del;

Πώς λειτουργεί αυτό το query

  1. Συλλέγει όλα τα προϊόντα και τις παραλλαγές που έχουν εισαχθεί με συγκεκριμένο import_id.

  2. Διαγράφει τα συνημμένα τους (εικόνες, αρχεία) ώστε η βάση δεδομένων να παραμένει καθαρή.

  3. Αφαιρεί όλα τα σχετικά δεδομένα, συμπεριλαμβανομένων:

    • Postmeta

    • Συσχετίσεων όρων (κατηγορίες, ετικέτες)

    • Καταχωρήσεων στους πίνακες product lookup

    • Αναφορών του WP All Import

  4. Τέλος, διαγράφει τα ίδια τα posts (product και product_variation).

Βέλτιστες πρακτικές

  • ✅ Πάντα να δοκιμάζετε σε staging πριν το τρέξετε σε production.

  • ✅ Ελέγξτε διπλά την τιμή του @IMPORT_ID.

  • ✅ Κάντε ένα πλήρες backup της βάσης πριν την εκτέλεση.

  • ✅ Τρέξτε τα queries μέσω phpMyAdmin ή WP-CLI με wp db query.