Cambios masivos
Disponible desde 1.26.0. Permiso: gestión. Es el mismo motor que usan los cambios masivos de la app.
Rutas
| Método | Ruta | Uso |
|---|---|---|
| POST | /bulk/preview | Calcula el efecto sin aplicar nada. |
| POST | /bulk | Ejecuta el cambio. |
| GET | /bulk?limit=30 | Historial (1 a 100 trabajos). |
| GET | /bulk/{id} | Estado y problemas de un trabajo. |
| POST | /bulk/{id}/revert | Deshace un trabajo. |
Cuerpo de la petición
| Campo | Obligatorio | Notas |
|---|---|---|
entity | Sí | products, extras, extra_categories o product_terms. |
operation | Sí | Ver la tabla de operaciones. |
params | No | Parámetros de la operación. |
target | Sí | { "ids": [..] } o, solo para productos, { "filter": {..} }. |
request_id | Sí, al ejecutar y deshacer | Clave de idempotencia de 8 a 64 caracteres. Si la repites, recibes el trabajo existente. |
actor | No | Quié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ón | Parámetros |
|---|---|
products price.regular, extras price | mode: set, increase_amount, decrease_amount, increase_percent o decrease_percent. value ≥ 0. round: none, 50, 100, 1000 o 900. |
products price.sale | mode: set, percent_off o clear. value, y opcionalmente from y to (AAAA-MM-DD). round. |
products status.set | status: publish, draft, private o pending. |
products stock.set | stock_status: instock, outofstock u onbackorder. quantity si el producto gestiona inventario. |
products terms.categories, terms.tags, terms.brands | action: add, remove o replace. ids: hasta 100. |
products extras.assign | action: add, remove, replace o clear. ids: categorías de extras. include_global con clear. |
products extras.global | disabled: sí o no («Sin extras»). |
extras categories, extra_categories global_categories | action e ids. |
extras enabled.set, extra_categories enabled.set | enabled. |
extras prechecked.set | prechecked. |
extra_categories rules.set | required, minimum_options, maximum_options. |
extra_categories unassign_products | scope: all, o product_category junto con product_category_id. |
products, extras, extra_categories delete | — |
product_terms delete | taxonomy: product_cat, product_tag o product_brand. |
product_terms merge | taxonomy y target_id. |
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
statusvalerunninghasta que termina. ConsultaGET /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ódigo | HTTP |
|---|---|
notiwoo_bulk_unknown_operation, notiwoo_bulk_invalid_params, notiwoo_bulk_invalid_price, notiwoo_bulk_invalid_target, notiwoo_bulk_empty_target, notiwoo_bulk_request_id | 400 |
notiwoo_bulk_too_many | 400 |
notiwoo_bulk_busy, notiwoo_bulk_cannot_revert | 409 |
notiwoo_bulk_not_found | 404 |
notiwoo_bulk_job_failed | 500 |