Editor masivo de WooCommerce: gestor de la tienda con «no permitido», roles y permisos
Cuando un gestor de la tienda escribe un precio nuevo en el editor masivo de WooCommerce y la celda responde no permitido (forbidden), al gestor no le falta ninguna capacidad de WordPress. BEAR tiene sus propias reglas de campo para todos los roles excepto el de administrador, y esas reglas todavía no permiten ese campo. A continuación se explica cómo decide BEAR quién puede abrirlo y quién puede cambiar qué campo, cómo interpretar el síntoma, y cómo dar a un rol exactamente el acceso que necesita, restringirlo o compartir una misma configuración con todo el equipo.
Dos comprobaciones: quién puede abrir BEAR y quién puede editar un campo
La primera comprobación es el acceso a WordPress. La página BEAR Bulk Editor bajo Productos está registrada para la capacidad manage_woocommerce, que Administrador y Gestor de la tienda tienen por defecto, y cada petición que envía el editor (guardar una celda, una ejecución masiva, eliminar, cargar perfiles) la comprueba de nuevo. Las peticiones que modifican productos comprueban además que el usuario puede editar cada uno de esos productos en términos de WordPress. Por eso, un rol sin edit_others_products solo puede cambiar los productos de los que es autor. Cuando esta comprobación falla, no se guarda nada y la celda editada muestra 0.
La segunda comprobación es la regla de campo de BEAR. Los roles de la lista woobe_permit_special_roles, que por defecto solo contiene administrator, pueden editar todos los campos. Cualquier otro rol que pueda abrir el editor, el Gestor de la tienda y cualquier rol personalizado por igual, puede editar solo los campos que un administrador haya marcado como visible para el gestor de la tienda (visible for the shop manager) en la pestaña Ajustes (Settings). Se rechaza el guardado de cualquier otro campo y la celda muestra no permitido (forbidden).
Respuestas antiguas del foro dicen que el usuario necesita manage_options. La versión actual no comprueba manage_options para editar en absoluto. Dar esa capacidad a un gestor de la tienda le abre las pantallas de ajustes de WordPress y no cambia las reglas de campo, así que no lo hagas para arreglar una respuesta no permitido (forbidden).
Interpreta el síntoma: qué significan no permitido (forbidden) y 0
| Lo que ves | Causa | Solución |
|---|---|---|
| El gestor de la tienda ve todas las columnas, cada edición responde no permitido (forbidden), la pestaña Edición masiva (Bulk Edit) no ofrece ningún campo | Ningún administrador ha guardado todavía la pestaña Ajustes, así que no hay ningún campo marcado para los roles que no son administrador | Inicia sesión como administrador, abre Ajustes, configura los interruptores y pulsa Guardar todos los ajustes (Save all settings) |
| Una columna responde no permitido (forbidden), las demás se guardan | Ese campo no está marcado, o se añadió más tarde (un campo meta, un atributo nuevo) y los ajustes no se han guardado desde entonces | Márcalo y guarda de nuevo la pestaña Ajustes |
| Falta una columna para el gestor de la tienda pero tú sí la ves | Las columnas sin marcar no se dibujan para los roles que no son administrador; los administradores siempre las ven todas | Es lo esperado; márcala si el rol la necesita |
La celda muestra 0 | Al rol le falta manage_woocommerce, no puede editar ese producto (producto de otro autor sin edit_others_products), o la página estuvo abierta tanto tiempo que su token de seguridad caducó | Recarga primero la página; después revisa las capacidades del rol |
| Un administrador recibe no permitido (forbidden) | BEAR lee el primer rol almacenado de la cuenta. Un administrador que además tiene un rol de un plugin de membresías o de edición de roles puede ser tratado como ese otro rol | Prueba con una cuenta de administrador nueva y después limpia los roles de la antigua |
| La cantidad de stock se acepta pero no se mantiene | WooCommerce conserva una cantidad solo en los productos que controlan el stock | Haz visible también Gestionar inventario (Manage stock) para el rol y ponlo en Sí |
Las causas generales de las ediciones que no se guardan (la tecla Enter, la edición vinculada, los cortafuegos, la caché) están en los cambios del editor masivo de WooCommerce no se guardan.
Deja que los gestores de la tienda editen las columnas que necesitan
Esta es la vía prevista y no necesita código.
- Inicia sesión como administrador y abre la pestaña Ajustes del editor. Bajo cada columna hay una casilla visible para el gestor de la tienda (visible for the shop manager). Solo los administradores la ven.
- Márcala bajo las columnas que el rol debe ver y editar, y desmárcala bajo el resto. Para trabajar con el stock, marca juntos Gestionar inventario (Manage stock), Cantidad del inventario (Stock quantity) y estado del inventario (Stock status): WooCommerce descarta una cantidad introducida en un producto con la gestión de stock desactivada cuando guarda el producto.
- Pulsa Guardar todos los ajustes (Save all settings). Este guardado escribe las reglas de rol; antes del primer guardado no hay ninguna.
- Inicia sesión como gestor de la tienda, o recarga la página que tenga abierta, y prueba una celda.
El mismo interruptor decide tres cosas para el rol: qué columnas dibuja el Editor de productos (Products Editor), qué campos ofrece la pestaña Edición masiva y qué taxonomías lista la pestaña Filtros (Filters). La FAQ del gestor de la tienda muestra una configuración típica de precios y stock. Ten en cuenta que el interruptor es una única regla para todos los roles que no son administrador: un rol personalizado recibe exactamente lo mismo que el gestor de la tienda. Para reglas distintas por rol o por usuario hace falta el filtro de más abajo.
Concede acceso total o escribe reglas por rol en código
Ambos filtros van en el functions.php del tema hijo o en un plugin de fragmentos de código. Figuran junto con las demás opciones ocultas en Más ajustes (implícitos).
Tratar a un rol como administrador: woobe_permit_special_roles
// Child theme functions.php or a code snippets plugin.
// BEAR: shop managers get every field, like administrators.
add_filter( 'woobe_permit_special_roles', function ( $roles ) {
$roles[] = 'shop_manager';
return $roles;
} );
Usa el slug del rol, no su nombre visible; un rol personalizado creado con un plugin de edición de roles tiene su propio slug. Un rol de esta lista se salta todas las reglas de campo y es administrador dentro de BEAR en todos los demás aspectos también: ve los interruptores visible para el gestor de la tienda (visible for the shop manager), la pestaña Campos meta (Meta Fields) y las opciones de toda la tienda de la pestaña Ajustes, y ve y puede revertir el Historial (History) de todos los usuarios. Concédelo solo a personas a las que darías la cuenta de administrador.
Decidir por campo y por rol: woobe_user_can_edit
BEAR consulta este filtro en cada guardado de un rol que no está en la lista especial. Recibe el valor de la pestaña Ajustes (1 permitido, 0 no), la clave del campo y el mapa de visibilidad completo, y debe devolver 1 para aceptar el guardado o 0 para rechazarlo. Un ejemplo antiguo llama al primer argumento $is_forbidden; es lo contrario, 1 significa permitido.
// Child theme functions.php or a code snippets plugin.
// BEAR: the content team edits what the Settings tab allows, except prices.
add_filter( 'woobe_user_can_edit', function ( $can_edit, $field_key, $visibility ) {
$user = wp_get_current_user();
// 'catalog_editor' is the slug of your custom role
if ( in_array( 'catalog_editor', (array) $user->roles, true )
&& in_array( $field_key, array( 'regular_price', 'sale_price' ), true ) ) {
return 0;
}
return $can_edit;
}, 10, 3 );
El filtro decide si se acepta un guardado; no dibuja columnas. Una columna sin marcar en Ajustes sigue oculta para todos los roles que no son administrador, devuelva lo que devuelva el filtro, así que marca las columnas que cualquiera de estos roles necesite y restríngelas por rol en el filtro. Las respuestas del foro suelen sugerir un filtro que simplemente devuelve 1. Hace desaparecer no permitido (forbidden), sí, pero deja que cada rol que puede abrir el editor cambie cada campo visible, que normalmente no es lo que querías permitir.
Restringe un rol en su lugar
Los fragmentos de esta sección también van en el functions.php del tema hijo o en un plugin de fragmentos de código.
- Solo lectura para todos menos los administradores. Devuelve
0desdewoobe_user_can_editpara todos los campos. A los roles de la lista especial nunca se les pregunta, así que los administradores siguen editando.add_filter( 'woobe_user_can_edit', function ( $can_edit, $field_key, $visibility ) { return 0; }, 10, 3 ); - Sin publicar. Desmarca visible para el gestor de la tienda (visible for the shop manager) bajo la columna Estado (Status). Entonces el rol no puede cambiar el estado del producto ni en la tabla ni en Edición masiva.
- Ocultar pestañas.
woobe_show_tabsrecibe el slug de la pestaña:settings,bulk,filters,export,history,metaoinfo(la pestaña Ayuda). Comprueba el rol dentro; de lo contrario, las pestañas desaparecen también para los administradores.add_filter( 'woobe_show_tabs', function ( $show, $slug ) { $user = wp_get_current_user(); if ( in_array( 'shop_manager', (array) $user->roles, true ) && in_array( $slug, array( 'settings', 'export', 'info' ), true ) ) { return false; } return $show; }, 99, 2 ); - Sin eliminar. No hay opción para ello: eliminar productos en BEAR requiere los mismos derechos que editarlos, y la Papelera de WordPress recibe lo que se elimina. Para que los botones de eliminar no funcionen para nadie por debajo de administrador, rechaza las dos peticiones de eliminación antes de que BEAR las gestione:
// Only administrators may delete products from the bulk editor. foreach ( array( 'woobe_delete_products', 'woobe_bulk_delete_products' ) as $woobe_action ) { add_action( 'wp_ajax_' . $woobe_action, function () { if ( ! current_user_can( 'manage_options' ) ) { wp_die( '0', '', array( 'response' => 403 ) ); } }, 0 ); } - Solo los productos propios. La opción Roles de proveedor (Vendor roles) de la pestaña Ajustes acepta slugs de rol; los usuarios con esos roles solo ven y editan los productos de los que son autores.
- Sin editor masivo en absoluto. Quitar
manage_woocommercea un rol le retira el editor, y con él el menú de WooCommerce. Para retirar solo BEAR a todos los que están por debajo de administrador, elimina su entrada de menú y rechaza la propia página, porque eliminar solo la entrada de menú no detiene a quien abra la dirección directamente:// BEAR only for administrators. add_action( 'admin_menu', function () { if ( ! current_user_can( 'manage_options' ) ) { remove_submenu_page( 'edit.php?post_type=product', 'woobe' ); } }, 100 ); add_action( 'admin_init', function () { if ( isset( $_GET['page'] ) && 'woobe' === $_GET['page'] && ! current_user_can( 'manage_options' ) ) { wp_die( 'Sorry, you are not allowed to access this page.', '', array( 'response' => 403 ) ); } } );
Configuraciones de equipo: ajustes compartidos, perfiles e Historial
Cada cuenta tiene sus propios ajustes de BEAR (columnas activas, su orden, opciones) y sus propios perfiles de columnas y de filtros. Dos personas pueden trabajar al mismo tiempo sin cambiar la pantalla de la otra, como describe la FAQ del equipo. Cuando todos deben ver la misma configuración, un filtro hace que todas las cuentas lean y escriban una única configuración:
// Child theme functions.php or a code snippets plugin.
// BEAR: one settings set for all users instead of one per user.
add_filter( 'woobe_settings_key_options', function ( $key ) {
return 'for_all';
} );
La configuración compartida parte de los valores por defecto, así que configura las columnas una vez después de añadir el filtro. Contiene los ajustes, no las reglas de rol: los interruptores visible para el gestor de la tienda (visible for the shop manager) siguen aplicándose.
Los perfiles son aparte. La opción Sincronizar perfiles de gestores (Synchronize managers profiles) (Ajustes generales, solo administradores) hace que todas las cuentas que no son administrador usen un único conjunto compartido de perfiles de columnas y de filtros; los administradores conservan siempre los suyos. La opción se almacena con los ajustes de la cuenta que la guarda, y cada usuario lee sus propios ajustes, así que los gestores la reciben cuando las cuentas comparten una configuración mediante woobe_settings_key_options. Los perfiles guardados antes de activarla se quedan con la cuenta que los creó; crea de nuevo los compartidos. Un perfil no se puede volver a guardar: crea uno nuevo y elimina el antiguo.
En una red multisitio, cada sitio tiene sus propios ajustes de BEAR, perfiles y reglas de rol; no se comparte nada entre sitios. Un superadministrador que no tiene ningún rol en un sitio cuenta como administrador allí.
Historial sigue la misma línea. Desde la versión 2.2.4, cada fila registra quién hizo el cambio y si se hizo a mano o mediante el asistente de IA. Los administradores, y los roles añadidos con woobe_permit_special_roles, ven y pueden revertir los cambios de todos; los demás usuarios ven y revierten solo los suyos. Más información en la documentación de Historial.
Si un gestor de la tienda sigue recibiendo no permitido
- Recarga la página del editor; una página abierta durante muchas horas envía un token de seguridad caducado.
- Como administrador, abre Ajustes, marca la casilla visible para el gestor de la tienda (visible for the shop manager) bajo el campo y pulsa Guardar todos los ajustes (Save all settings), aunque ya parezca marcada.
- Revisa el rol en un plugin de edición de roles: necesita
manage_woocommerce, yedit_others_productspara cambiar productos de otros autores. - Busca fragmentos propios con
woobe_user_can_editque devuelvan0, y confirma que el slug del rol enwoobe_permit_special_rolesestá escrito como el rol realmente es. - Si el afectado es un administrador, crea una cuenta de administrador nueva y repite la edición. Si la cuenta nueva funciona, la antigua tiene un rol adicional o capacidades modificadas.
Si nada de esto lo explica, describe el rol, el campo y lo que muestra la celda en el foro de soporte de BEAR.