Saltar al contenido principal

Cambios masivos

Disponible desde 1.26.0. Permiso: gestión. Es el mismo motor que usan los cambios masivos de la app.

Rutas​

MétodoRutaUso
POST/bulk/previewCalcula el efecto sin aplicar nada.
POST/bulkEjecuta el cambio.
GET/bulk?limit=30Historial (1 a 100 trabajos).
GET/bulk/{id}Estado y problemas de un trabajo.
POST/bulk/{id}/revertDeshace un trabajo.

Cuerpo de la petición​

CampoObligatorioNotas
entitySíproducts, extras, extra_categories o product_terms.
operationSíVer la tabla de operaciones.
paramsNoParámetros de la operación.
targetSí{ "ids": [..] } o, solo para productos, { "filter": {..} }.
request_idSí, al ejecutar y deshacerClave de idempotencia de 8 a 64 caracteres. Si la repites, recibes el trabajo existente.
actorNoQuién hace el cambio, por ejemplo "notifier:15".

El filtro de productos acepta los parámetros de wc/v3/products: search, category, tag, brand, status, stock_status, min_price, max_price, type, on_sale, sku, modified_after, además de notiwoo_image, notiwoo_extras y notiwoo_extra_category.

Operaciones​

Entidad y operaciónParámetros
products price.regular, extras pricemode: set, increase_amount, decrease_amount, increase_percent o decrease_percent. value ≥ 0. round: none, 50, 100, 1000 o 900.
products price.salemode: set, percent_off o clear. value, y opcionalmente from y to (AAAA-MM-DD). round.
products status.setstatus: publish, draft, private o pending.
products stock.setstock_status: instock, outofstock u onbackorder. quantity si el producto gestiona inventario.
products terms.categories, terms.tags, terms.brandsaction: add, remove o replace. ids: hasta 100.
products extras.assignaction: add, remove, replace o clear. ids: categorías de extras. include_global con clear.
products extras.globaldisabled: sí o no («Sin extras»).
extras categories, extra_categories global_categoriesaction e ids.
extras enabled.set, extra_categories enabled.setenabled.
extras prechecked.setprechecked.
extra_categories rules.setrequired, minimum_options, maximum_options.
extra_categories unassign_productsscope: all, o product_category junto con product_category_id.
products, extras, extra_categories delete—
product_terms deletetaxonomy: product_cat, product_tag o product_brand.
product_terms mergetaxonomy y target_id.
Operaciones destructivas

delete, merge y unassign_products son destructivas. Muestra siempre la vista previa y pide confirmación antes de ejecutarlas. En productos variables, los cambios de precio se aplican a sus variaciones.

Vista previa​

curl -X POST https://tienda.example.test/wp-json/notiwoo/v1/bulk/preview \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{
"entity": "products",
"operation": "price.regular",
"params": { "mode": "increase_percent", "value": 5, "round": "100" },
"target": { "filter": { "status": "publish" } }
}'
{
"success": true,
"data": {
"targets": 12, "total": 12, "changed": 12, "skipped": 0, "skip_reasons": {},
"samples": [
{ "type": "product", "id": 21, "label": "Combo para dos",
"before": { "regular_price": "34000" }, "after": { "regular_price": "35700" } }
],
"variations": 0,
"destructive": false
}
}

samples muestra hasta 10 ejemplos. Los motivos de omisión posibles son no_price, sale_not_lower, unchanged, invalid_rules, unsupported, error y modified_since.

Ejecutar​

Envía el mismo cuerpo a POST /bulk, añadiendo request_id. Responde 201 con el trabajo:

{
"id": 31, "entity": "products", "operation": "price.regular", "status": "done",
"total": 12, "processed": 12, "succeeded": 12, "skipped": 0, "failed": 0,
"actor": "notifier:15", "revert_of": null, "reverted_by": null,
"created_at": "2026-09-30T17:30:00+00:00", "finished_at": "2026-09-30T17:30:02+00:00",
"can_revert": true
}

Límites:

  • Hasta 5000 elementos por trabajo.
  • Hasta 200 elementos se procesan en la misma petición. Si son más, se procesan en segundo plano en bloques de 50 y status vale running hasta que termina. Consulta GET /bulk/{id} para seguir el progreso.
  • Solo puede haber un trabajo en curso por tienda (409 notiwoo_bulk_busy).

Deshacer​

POST /bulk/{id}/revert con un request_id nuevo. Solo se puede deshacer durante 7 días y si can_revert es true. Los elementos modificados después del cambio se omiten con el motivo modified_since.

Errores​

CódigoHTTP
notiwoo_bulk_unknown_operation, notiwoo_bulk_invalid_params, notiwoo_bulk_invalid_price, notiwoo_bulk_invalid_target, notiwoo_bulk_empty_target, notiwoo_bulk_request_id400
notiwoo_bulk_too_many400
notiwoo_bulk_busy, notiwoo_bulk_cannot_revert409
notiwoo_bulk_not_found404
notiwoo_bulk_job_failed500