Wp wc product delete
wp wc product delete
: Delete WooCommerce products.
$ wp help wc product delete NAME wp wc product delete DESCRIPTION Delete an existing item. SYNOPSIS wp wc product delete <id> [--id=<id>] [--force=<force>] [--porcelain] OPTIONS <id> The ID for the resource. [--id=<id>] Unique identifier for the resource. [--force=<force>] Whether to bypass trash and force deletion. [--porcelain] Output just the id when the operation is successful.
Delete products in bulk - Simple
Deleting regular posts can be done with wp post delete
. An example of removing regular posts in bulk: wp post delete $(wp post list --post_type='page' --format=ids)
.
When the same approach is taken for deleting products in bulk, you might get something like this:
wp product delete --user=4 $(wp product list --user=4 --format=ids)
Unfortunately, this doesn't work. Probably because the output of $(wp product list --user=4 --format=ids)
isn't clean enough to be processed by the outside part. This is not unique: It happens with a bunch of WP-CLI commands.
This can easily be solved, by using xargs -n1
to clean up the output of wp wc product list
before handing it over to wp wc product delete
:
wp wc product list --user=4 --format=ids | xargs -n1 wp wc product delete --user=4
Last notes:
- In the commands above, every time there are max. 100 IDs processed. A loop might me needed to delete all, but let's skip that for now
- Execution time on my laptop: About 2s per product → About 9h for 17,000 products. Let's see how we can speed this up...
Delete products in bulk - With Parallel
Also when using Parallel, we still have to clean up the output of the list command before we can process it. E.g., this doesn't work (syntaxis from ChatGPT!):
wp wc product list --user=4 --format=ids | parallel -j8 --delay 0.2 wp wc product delete --user=4 {} # ERROR
but this does:
wp wc product list --user=4 --format=ids | xargs -n1 |parallel -j8 --delay 0.2 wp wc product delete --user=4 {}
This was tested on my laptop (8 processing units). Processing time went from 2s/product to 0.55s/product - About 4 times as fast.
Let's see how it works with the double amount of threads:
wp wc product list --user=4 --format=ids | xargs -n1 |parallel -j16 --delay 0.2 wp wc product delete --user=4 {}
Processing time went from 0.55s/product to 0.532/product.
And now without specifying the number of threads:
wp wc product list --user=4 --format=ids | xargs -n1 |parallel --delay 0.2 wp wc product delete --user=4 {}
Execution time: 0,50/product
And without delay:
wp wc product list --user=4 --format=ids | xargs -n1 |parallel wp wc product delete --user=4 {}
This gave some errors like
Error checking in buffer: The buffer you checked in was not checked out
and execution time was the same → Let's keep the delay.
Delete products in bulk - With Parallel & outer loop
As mentioned before, you can list max. 100 product IDs at a time. And since we use Parallel already 'inside' the script, let's have a regular loop around this:
j=$(wp wc product list --user=4 --format=count) j=$((j/100 +1)) for ((i=0; i<j; i++)) do echo $i"/"$j wp wc product list --user=4 --format=ids | xargs -n1 |parallel --delay 0.2 wp wc product delete --user=4 {} done
Delete products in bulk - With Parallel & inner loop?
Somehow, I find it attractive to see if the 'outer loop' can be parallelised and that the inner loop becomes just a loop: I suspect this approach would have less rescheduling overhead. It wouldn't be rocket science: The inner loop just needs an offset for each command.