WP-CLI: Цепочка команд для удаления заказов — Ошибка слишком большого количества позиционных аргументов

#wordpress #bash #pipe #chaining #wp-cli

Вопрос:

При клонировании и переводе сайта WordPress я хотел использовать WP-CLI для удаления всех заказов, подобных этому: wp wc shop_order delete $(wp wc shop_order list --user=4 --field=id) --user=4 . К сожалению, я получаю слишком много ошибок в позиционных аргументах.

Полный пример:

 wp wc shop_order delete $(wp wc shop_order list --user=4 --field=id) --user=4


Error: Too many positional arguments: 63537 63536 63534 63533 63532 63531 63527 63525
63524 63522 63521 63515 63507 63504 63503 63502 63501 63500 63499 63497 63496 63495 63494 
63493 63492 63491 63483 63482 63479 63430 63429 63428 63427 63425 63423 63422 63421 63420 
63415 63414 63412 63411 63410 63408 63407 63406 63405 63404 63403 63402 63401 63400 63399 
63398 63397 63396 63395 63394 63393 63391 63390 63389 63388 63386 63385 63384 63382 63381 
63375 63373 63372 63371 63370 63369 63368 63365 63364 63363 63362 63361 63360 63358 63357 
63356 63355 63354 63352 63350 63349 63348 63347 63346 63344 63343 63342 63339 63337 63336 
63335
 

Дополнительная информация:

  • Тот же синтаксис работает для удаления пользователей: wp user delete $(wp user list --role="customer" --field=ID) --yes . Я не понимаю, почему это не работает для удаления заказов
  • Использование xargs, похоже, тоже не сработало (я новичок в xargs): wp wc shop_order list --user=4 --field=id | xargs -t wp wc shop_order delete --user=4

Любая помощь приветствуется — уже спасибо! Джерун

Комментарии:

1. попробуйте это: bash wp wc shop_order delete "$(wp wc shop_order list --user=4 --field=id)" --user=4

2. Спасибо за ваш быстрый ответ. К сожалению, это, похоже, не работает: Error: No route was found matching the URL and request method. {"status":404}

Ответ №1:

Я нашел это: с помощью xargs, используя -n1 переключатель, чтобы взять макс. 1 аргумент за раз:

 wp wc shop_order list --user=4 --field=id | xargs -n1 wp wc shop_order delete --user=4
 

Вывод выглядел так (возможно, удобно для отладки):

 Success: Trashed shop_order 63333

Success: Trashed shop_order 63332

Success: Trashed shop_order 63331
 

Примечания:

  • Эта команда перемещает заказы только в корзину. Чтобы на самом деле удалить их, используйте логический флаг --force
  • wp wc shop_order list возвращает максимум 100 заказов. Вы можете опустить это с помощью флага --per_page , но вы не можете его поднять. Я уверен, что это можно сделать с помощью элегантного условного цикла, но я просто хочу удалить около 6700 заказов, поэтому подойдет цикл с фиксированным числом.

Конечный результат:

 for i in {1..70}
do
    wp wc shop_order list --user=4 --field=id | xargs -n1 wp wc shop_order delete --user=4 --force=1
done
 

Пример вывода (обратите внимание, что теперь в нем указано «Удалено» вместо «Уничтожено«):

 Success: Deleted shop_order 62886.

Success: Deleted shop_order 62885.

Success: Deleted shop_order 62884.
 

Однако я все еще озадачен, почему исходный код работал для удаления пользователей, но не для заказов.

Что-то о производительности: приведенный выше код занимает около 5 секунд / заказ. Таким образом (в моем случае) удаление 67 000 заказов занимает около 9,5 часов