BEAR - WooCommerce Bulk Editor and Products Manager Professional

Convertir en masa productos simples de WooCommerce a variables (y al revés)

Para convertir en masa productos simples de WooCommerce en productos variables, se cambia un solo campo: el tipo de producto. En el editor masivo eso lleva un minuto, incluso con miles de productos. Que los productos convertidos puedan seguir vendiéndose depende de todo lo que rodea a ese campo: el tipo es solo una etiqueta, y los precios, el stock, los atributos y las variaciones que necesita un producto variable no vienen con él. A continuación se explica qué ocurre con cada campo en ambas direcciones, el orden de pasos que conserva tus precios, cómo fusionar varios productos simples en un producto variable y por qué a veces un cambio de tipo no se mantiene.

Qué hace un cambio de tipo de producto y qué deja atrás

WooCommerce guarda el tipo de producto como un término de una taxonomía oculta, product_type, con los términos simple, agrupado, externo y variable. La columna Tipo (Type) de la tabla de productos y el campo Tipo de producto (product type) de la pestaña Edición en masa (Bulk Edit) establecen ese término y nada más. Los precios, el stock, el SKU y los atributos permanecen exactamente como estaban guardados, y lo que eso significa depende de la dirección:

De simple a variableDe variable a simple
Precio normal y precio rebajadoSiguen guardados en el producto, pero WooCommerce vende un producto variable según los precios de sus variaciones; las celdas de precio de la fila pasan a ser de solo lecturaVacíos: WooCommerce guarda los precios de un producto variable en sus variaciones, no en el producto
VariacionesNinguna, así que el producto no se puede añadir al carrito hasta que tenga algunaNo se eliminan: permanecen en la base de datos, ocultas, con sus precios, stock y SKU
StockLa gestión de stock sigue en el producto; las variaciones sin stock propio usan su cantidadLos ajustes de stock guardados en el padre pasan a ser el stock del producto
SKUSigue en el productoSigue en el producto; las variaciones ocultas conservan el suyo

La segunda fila es la diferencia principal con el editor de productos de WooCommerce. Cuando allí cambias un producto de variable a otro tipo, WooCommerce elimina las variaciones al guardar. El editor masivo cambia solo el término del tipo, así que las variaciones sobreviven. Es útil cuando vuelves atrás, porque reaparecen con todo lo que tenían. Es una trampa cuando querías deshacerte de ellas, y por eso importa el orden de los pasos que se describe más abajo.

Convertir en masa productos simples a variables sin perder los precios

  1. Selecciona los productos. En la pestaña Filtros (Filters) elige Tipo de producto: simple, añade una categoría, etiqueta o cualquier otro criterio que aísle los productos, y pulsa Filtrar (Filter). También puedes marcar productos en la tabla; los productos marcados tienen prioridad sobre el filtro. Mantén desactivado el interruptor variaciones (variations) que hay sobre la tabla: mientras está activado, las ediciones masivas se saltan los productos padre.
  2. Cambia el tipo. Abre la pestaña Edición en masa, marca la casilla junto a Establecer: tipo de producto (Set: product type), elige variable y pulsa Realizar edición en masa (Do Bulk Edit). Para pocos productos, cambia la celda Tipo directamente en la tabla; la fila se redibuja con las celdas de un producto variable.
  3. Añade los atributos. Las variaciones se construyen con atributos globales (Productos → Atributos) marcados como Usado para variaciones (Used for variations) en el producto. Cómo añadirlos en masa con los indicadores correctos se explica en añadir atributos a productos en masa.
  4. Crea las variaciones enseguida con Operaciones avanzadas en masa sobre variaciones (Variations Advanced Bulk Operations), pestaña Creando (Creating): selecciona los atributos y los términos, genera las combinaciones y pulsa ¡Iniciar adición en masa! (Start BULK Adding!). El procedimiento completo está en crear variaciones en masa.

El paso 4 es donde se conserva el precio. Cuando el generador crea una variación, copia en ella el precio normal y el precio rebajado guardados en el producto padre. Un producto que era simple hace un minuto sigue teniendo guardados sus precios anteriores, así que cada variación nueva empieza con el precio que tenía el producto simple. Esto funciona una vez por producto: en cuanto un producto tiene variaciones, WooCommerce lo sincroniza y borra los campos de precio del padre, y las variaciones creadas en una ejecución posterior no reciben precio. Solo se copian los precios, no una programación de oferta: una oferta planificada en el producto simple para el mes que viene empieza de inmediato en sus variaciones, así que vuelve a programarla como se explica en programar precios rebajados en masa. Crea todas las combinaciones que necesita un producto en una sola ejecución y después cambia los precios que difieran, por ejemplo un precio más alto para la XXL, como se muestra en precios distintos para variaciones distintas. Por qué la fila del padre ya no tiene un precio editable se explica en campo de precio desactivado en el producto variable.

El stock sigue la misma lógica. Las variaciones nuevas se crean sin gestión de stock propia. Si el producto simple gestionaba su stock, ese ajuste se queda en el padre, y WooCommerce hace que cada variación sin stock propio venda a partir de la cantidad del padre: 50 unidades del producto antiguo se convierten en 50 unidades compartidas por todas las tallas. Para contar cada variación por separado, activa el interruptor variaciones y establece Gestionar inventario (Manage stock) en Sí en una ejecución de Edición en masa, y las cantidades en una segunda ejecución; el motivo de las dos ejecuciones está en el estado del stock no cambia.

Convertir en masa productos variables a simples

Aquí el orden importa, porque la herramienta que elimina variaciones solo funciona con productos que siguen siendo variables:

  1. Filtra los productos por Tipo de producto: variable, más la categoría o etiqueta que los seleccione. Si quieres conservar un precio, anótalo ahora: activa el interruptor variaciones para ver los precios de las variaciones y vuelve a desactivarlo.
  2. Elimina las variaciones en Operaciones avanzadas en masa sobre variaciones, pestaña Eliminando (Deleting): elige Eliminar todas las variaciones de los productos (Delete all products variations) y pulsa Iniciar eliminación (Start deleting). Antes lee la línea que indica a qué se aplicará (will be applied to) la operación: si no hay nada filtrado ni marcado, dice todos los productos del sitio (all the products on the site). Las variaciones eliminadas no se pueden restaurar y no quedan registradas en el Historial. La FAQ sobre eliminar todas las variaciones muestra la pantalla.
  3. Cambia el tipo: pestaña Edición en masa, Establecer: tipo de producto, Simple, Realizar edición en masa.
  4. Establece los precios. Las celdas PRECIO NORMAL (Regular price) y PRECIO REBAJADO (Sale price) vuelven a ser editables. Filtra por Tipo de producto: simple, más la misma categoría, y establece el precio de todos ellos en la pestaña Edición en masa, o celda por celda donde los precios difieran.

Si cambias primero el tipo, la pestaña Eliminando se salta los productos porque ya no son variables, y las variaciones se quedan atrás. Los clientes nunca las ven, pero sus SKU siguen contando: WooCommerce rechaza un SKU que ya tenga otro producto o variación, así que el producto simple no puede quedarse con el SKU de una de sus antiguas variaciones. Para limpiar, vuelve a cambiar los productos a variable (las variaciones reaparecen), elimina las variaciones y cambia de nuevo a simple.

Conservar automáticamente el precio de la variación

Cuando cada producto variable tiene una sola variación, o todas sus variaciones comparten un precio, un fragmento de código de un solo uso hace la conversión como lo hace el editor de WooCommerce y conserva el precio. Carga cada producto como un producto simple, copia el precio normal, el precio rebajado y el stock de su primera variación, y lo guarda; durante ese guardado WooCommerce cambia el tipo y elimina las variaciones por sí mismo. Haz antes una copia de seguridad de la base de datos, pon los IDs de tus productos en la lista, abre una vez /wp-admin/?woo_variable_to_simple=1 como administrador y después elimina el código.

/*
 * One-off: convert variable products to simple products and keep the
 * price and stock of their first variation. WooCommerce deletes the variations.
 * Child theme functions.php or a code snippets plugin; remove after use.
 */
add_action( 'admin_init', function () {
    if ( empty( $_GET['woo_variable_to_simple'] ) || ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $product_ids = array( 101, 102, 103 ); // IDs of the variable products

    foreach ( $product_ids as $product_id ) {
        $variable = wc_get_product( $product_id );
        if ( ! $variable || ! $variable->is_type( 'variable' ) ) {
            continue;
        }
        $children  = $variable->get_children();
        $variation = $children ? wc_get_product( $children[0] ) : null;

        $simple = new WC_Product_Simple( $product_id );
        if ( $variation ) {
            $simple->set_regular_price( $variation->get_regular_price( 'edit' ) );
            $simple->set_sale_price( $variation->get_sale_price( 'edit' ) );
            if ( $variation->get_manage_stock( 'edit' ) ) {
                $simple->set_manage_stock( true );
                $simple->set_stock_quantity( $variation->get_stock_quantity( 'edit' ) );
            } elseif ( ! $simple->get_manage_stock( 'edit' ) ) {
                $simple->set_stock_status( $variation->get_stock_status( 'edit' ) );
            }
        }
        $simple->save(); // WooCommerce switches the type and deletes the variations here
    }

    wp_die( 'Done. Remove the code now.' );
} );

El producto conserva su propio SKU. Revisa dos o tres productos convertidos en la tienda antes de eliminar el código.

Fusionar varios productos simples en un producto variable

A menudo los productos simples ya son las variaciones: Camiseta S, Camiseta M, Camiseta L. Convertirlos no sirve, porque cada uno se convertiría en un producto variable independiente. Lo que necesitas es un producto variable nuevo cuyas variaciones hereden el precio, el SKU y el stock de los productos antiguos. El editor masivo no puede hacerlo por sí solo: nada en un producto indica qué valor de atributo representa, la talla es solo texto en el título.

Para unos pocos grupos, hazlo en el editor: crea el producto variable, añade el atributo, genera las variaciones con Operaciones avanzadas en masa sobre variaciones, activa después el interruptor variaciones y escribe los precios, SKU y stock en las filas de las variaciones. Quita el SKU del producto simple antiguo antes de dárselo a una variación, ya que WooCommerce no permite el mismo SKU dos veces.

Para muchos productos, el fragmento siguiente construye un producto variable a partir de una lista de IDs de productos simples y sus valores de atributo. Copia la descripción, las categorías y la imagen del primer producto en el nuevo padre, crea una variación por cada producto simple con sus precios, SKU, stock, peso e imagen, y pasa los productos antiguos a borrador. Ejecútalo una vez por grupo: edita los tres ajustes, abre /wp-admin/?woo_merge_simple=1 como administrador y llegarás al editor del producto nuevo, que es un borrador hasta que lo publiques.

/*
 * One-off: merge simple products into one new variable product.
 * Child theme functions.php or a code snippets plugin; remove after use.
 */
add_action( 'admin_init', function () {
    if ( empty( $_GET['woo_merge_simple'] ) || ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $title     = 'Classic T-shirt';                                // name of the new product
    $attribute = 'Size';                                           // what the variations differ by
    $map       = array( 101 => 'S', 102 => 'M', 103 => 'L' ); // simple product ID => value

    $first = wc_get_product( array_key_first( $map ) );
    if ( ! $first ) {
        wp_die( 'Check the product IDs.' );
    }

    $parent = new WC_Product_Variable();
    $parent->set_name( $title );
    $parent->set_status( 'draft' );
    $parent->set_description( $first->get_description( 'edit' ) );
    $parent->set_short_description( $first->get_short_description( 'edit' ) );
    $parent->set_category_ids( $first->get_category_ids( 'edit' ) );
    $parent->set_image_id( $first->get_image_id( 'edit' ) );

    $attr = new WC_Product_Attribute();
    $attr->set_name( $attribute );
    $attr->set_options( array_values( $map ) );
    $attr->set_visible( true );
    $attr->set_variation( true );
    $parent->set_attributes( array( $attr ) );
    $parent_id = $parent->save();

    foreach ( $map as $simple_id => $value ) {
        $simple = wc_get_product( $simple_id );
        if ( ! $simple || ! $simple->is_type( 'simple' ) ) {
            continue;
        }
        $sku = $simple->get_sku( 'edit' );

        // free the SKU and take the old product offline
        $simple->set_sku( '' );
        $simple->set_status( 'draft' );
        $simple->save();

        $variation = new WC_Product_Variation();
        $variation->set_parent_id( $parent_id );
        $variation->set_attributes( array( sanitize_title( $attribute ) => $value ) );
        $variation->set_regular_price( $simple->get_regular_price( 'edit' ) );
        $variation->set_sale_price( $simple->get_sale_price( 'edit' ) );
        $variation->set_sku( $sku );
        $variation->set_manage_stock( $simple->get_manage_stock( 'edit' ) );
        $variation->set_stock_quantity( $simple->get_stock_quantity( 'edit' ) );
        $variation->set_stock_status( $simple->get_stock_status( 'edit' ) );
        $variation->set_weight( $simple->get_weight( 'edit' ) );
        $variation->set_image_id( $simple->get_image_id( 'edit' ) );
        $variation->save();
    }

    WC_Product_Variable::sync( $parent_id );
    wp_safe_redirect( admin_url( 'post.php?post=' . $parent_id . '&action=edit' ) );
    exit;
} );

El atributo se crea en el propio producto, no en Productos → Atributos. Eso basta para que las variaciones funcionen. Si quieres filtrar la tienda por él o reutilizarlo en otros productos, conviértelo después en un atributo global, como se describe en convertir atributos personalizados en globales. Las URL de los productos antiguos ya no llevan a ninguna parte; redirígelas al producto nuevo con un plugin de redirecciones o una regla del servidor.

El cambio de tipo de producto se confirma, pero el producto sigue siendo simple

Tras un cambio en la celda Tipo, el editor muestra Guardado (Saved) y redibuja la fila con datos leídos de nuevo desde el servidor. El mensaje solo significa que la petición terminó; lo que realmente está guardado se ve en la fila redibujada y en el editor de productos de WooCommerce, en el desplegable Datos del producto (Product data). Compara ambos con la tienda:

  • Variable en el editor de productos, simple en la tienda. La página de la tienda procede de una caché de páginas o de una CDN. Vacíala; los cambios no se ven en el frontend enumera las capas de caché que debes revisar.
  • Cambiado en la tabla, de nuevo simple tras recargar. Algo sirve datos antiguos al administrador. Las causas habituales son una caché de servidor del hosting que también almacena /wp-admin/ o admin-ajax.php, y plugins de caché que guardan resultados de la base de datos en una caché de objetos persistente. Excluye el administrador y admin-ajax.php de la caché de páginas y vacía la caché de objetos. Excluir el JavaScript y el CSS del plugin de la optimización no ayuda, porque los datos obsoletos están en el servidor.
  • Algunos productos de una ejecución de Edición en masa no cambiaron. Estaban fuera del filtro o del conjunto marcado, o el interruptor variaciones estaba activado y la ejecución se saltó todos los productos padre.

Para deshacer un cambio de tipo hecho en una celda, revíertelo en el Historial (History). Una ejecución de Edición en masa es distinta: en la versión 2.2.4, revertir una ejecución que cambió el tipo de producto deja el tipo nuevo en su sitio. Deshazla seleccionando de nuevo los mismos productos y ejecutando la pestaña Edición en masa con el tipo anterior.

Lista de comprobación

  • Haz una copia de seguridad de la base de datos: las variaciones eliminadas y las ejecuciones de código no se pueden revertir.
  • De simple a variable: tipo, atributos, todas las variaciones en una ejecución, y después precios y stock por variación.
  • De variable a simple: primero las variaciones, después el tipo, después los precios; el interruptor variaciones permanece desactivado para los cambios de tipo.
  • Revisa un producto convertido en el editor de WooCommerce y en la tienda antes de pasar a la siguiente categoría.

Si una conversión se comporta de otra manera en tu tienda, describe los pasos que seguiste en el foro de soporte de BEAR.