BEAR - WooCommerce Bulk Editor and Products Manager Professional

Edición masiva de precios WooCommerce en todos los idiomas WPML (y Polylang)

Bajas cien precios en el editor masivo, compruebas la tienda en inglés y ves los precios nuevos, cambias a alemán y ves los antiguos. Con WPML, la edición masiva de precios de WooCommerce en todos los idiomas necesita un paso más que en una tienda con un solo idioma, porque cada traducción de un producto es un producto independiente. Esta página explica qué idioma edita BEAR, cómo hacer que los precios lleguen a todas las traducciones con un único filtro, cómo hacer lo mismo con el stock, el peso y otros campos, y qué conviene editar por idioma a propósito.

Cómo funciona BEAR con WPML: un idioma cada vez

WPML no guarda un producto traducido dentro del original. Crea un segundo producto de WooCommerce con su propio ID, sus propios precios, stock y metadatos, y enlaza los dos en un grupo de traducción. BEAR ve esos productos igual que WooCommerce, de modo que:

  • El Editor de productos (Products Editor) lista los productos del idioma seleccionado en el selector de idioma de WPML, en la parte superior de la pantalla de administración. Cambia el idioma ahí y el editor mostrará los productos de ese idioma.
  • Los filtros, la pestaña Edición masiva (Bulk Edit) y la exportación trabajan sobre los productos listados, es decir, sobre un solo idioma. Una ejecución masiva en inglés cambia solo los productos en inglés.
  • BEAR escribe en el producto que editas y en ningún otro. La copia de campos a las traducciones que hace WPML está pensada para cuando se guarda el original en la pantalla de edición del producto, y una escritura desde el editor masivo no la activa de forma fiable. No cuentes con ella para un cambio que abarque todo el catálogo.

Elige un idioma concreto en el selector antes de empezar y comprueba en qué idioma estás antes de cada ejecución masiva. La nota de compatibilidad con WPML establece la misma regla: los productos de cada idioma se editan en masa por separado. Las dos secciones siguientes son las formas de conseguir que un cambio llegue de todos modos a los demás idiomas.

Sincronizar precios en todos los idiomas de WPML con woobe_wpml_sync_prices

Para los precios, BEAR tiene un interruptor integrado. Añade este filtro:

/*
 * BEAR + WPML: write regular and sale prices to all translations.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter( 'woobe_wpml_sync_prices', '__return_true' );

A partir de ese momento, cada vez que BEAR escribe un precio normal superior a cero o un precio de oferta en un producto, escribe el mismo valor en las traducciones de ese producto en todos los idiomas de WPML. Da igual cómo se haya escrito el precio: tecleado en una celda, fijado con la calculadora de precios, cambiado por valor o porcentaje en la pestaña Edición masiva, o restaurado con una reversión en Historial (History). Las variaciones también están cubiertas: el precio de una variación pasa a las variaciones traducidas. Quitar un precio de oferta con -1, como se describe en cómo quitar precios de oferta en masa, también lo borra en las traducciones.

Tres cosas que debes saber antes de depender de él:

  • Se escribe el mismo número en todos los idiomas. Eso es correcto cuando todos los idiomas venden en la misma moneda. Si un idioma debe tener su propio precio, deja el filtro desactivado y edita ese idioma por separado.
  • Las fechas de oferta no forman parte de esto. Un precio de oferta copiado a las traducciones sin su Inicio del periodo de oferta (Sale time from) y su Fin del periodo de oferta (Sale time to) está activo de inmediato en esos idiomas. Establece las fechas en cada idioma o cópialas con el fragmento de la sección siguiente.
  • Solo se copian las ediciones hechas después de añadir el filtro. Los precios que ya difieren se quedan como están hasta la siguiente escritura.

El filtro figura junto con los demás interruptores a nivel de código en Más ajustes (implícitos).

Copiar stock, peso, dimensiones y otros campos a las traducciones

Cada campo que escribe BEAR termina con la acción woobe_after_update_page_field, que recibe el ID del producto, el objeto del producto, la clave del campo, el valor y el tipo de campo. Una pequeña función enganchada a ella puede repetir el cambio en cada traducción. Esta copia el stock, los datos de envío, la clase de impuesto y las fechas de oferta:

/*
 * BEAR + WPML: copy chosen product fields from the edited product
 * to its translations in all languages.
 * Child theme functions.php or a code snippets plugin.
 */
add_action( 'woobe_after_update_page_field', function ( $product_id, $product, $field_key, $value, $field_type ) {

	// BEAR field keys to copy; each one is a WooCommerce product property
	$copy = array(
		'stock_quantity', 'stock_status', 'manage_stock', 'backorders',
		'weight', 'length', 'width', 'height', 'tax_class',
		'date_on_sale_from', 'date_on_sale_to',
	);

	if ( ! in_array( $field_key, $copy, true ) || ! defined( 'ICL_SITEPRESS_VERSION' ) ) {
		return;
	}

	$source = wc_get_product( $product_id );
	if ( ! $source ) {
		return;
	}

	$getter = 'get_' . $field_key;
	$setter = 'set_' . $field_key;
	$new    = $source->$getter( 'edit' );
	$type   = get_post_type( $product_id ); // product or product_variation

	foreach ( (array) apply_filters( 'wpml_active_languages', null ) as $code => $language ) {
		$translation_id = (int) apply_filters( 'wpml_object_id', $product_id, $type, false, $code );

		if ( ! $translation_id || $translation_id === (int) $product_id ) {
			continue;
		}

		$translation = wc_get_product( $translation_id );
		if ( $translation ) {
			$translation->$setter( $new );
			$translation->save();
		}
	}
}, 10, 5 );

Cómo sacarle el máximo partido:

  • Edita primero un producto en el editor y mira su traducción. Cuando el valor haya llegado, ejecuta la edición masiva.
  • La función copia desde el idioma que editas a todos los demás. Haz estas ediciones en tu idioma principal y trátalo como la fuente.
  • Se ejecuta en cada escritura que pasa por BEAR, incluidas las reversiones de Historial, así que revertir el original también restablece las traducciones.
  • Añade o quita claves en la lista $copy según lo necesites. Mantén fuera los campos de texto (título, descripciones, slug): para eso existen las traducciones.
  • El SKU queda fuera a propósito. WooCommerce rechaza un SKU que otro producto ya usa, así que copiarlo puede fallar según cómo trate tu configuración de WPML el campo _sku. Establece los SKU por idioma, o revisa antes esa configuración.

Si WooCommerce Multilingual ya mantiene sincronizado el stock entre traducciones en tu tienda, copiar los campos de stock es inofensivo: el mismo número se escribe dos veces. El trabajo masivo con el stock en sí se trata en BEAR como gestor de stock de WooCommerce.

Qué editar en cada idioma

Los títulos, las descripciones, las descripciones cortas, los slugs, las notas de compra y todo lo que esté escrito con palabras pertenecen a un solo idioma. Edítalos por idioma: cambia el idioma en la barra de administración, filtra y ejecuta la edición masiva. Repite con el siguiente idioma.

Los filtros trabajan sobre los valores almacenados en los productos del idioma actual. Las categorías, las etiquetas y los términos de atributo también se traducen, así que un filtro creado en inglés apunta a términos en inglés; créalo de nuevo después de cambiar de idioma. Un filtro por un campo meta solo encuentra las traducciones que tienen ese valor por sí mismas, de modo que un campo que WPML no copia puede estar vacío en una traducción y el filtro no encontrará nada allí. Los campos que WPML está configurado para copiar conviene cambiarlos en el idioma original, para que el siguiente guardado por parte de WPML no devuelva el valor antiguo.

Si solo unos pocos productos se quedaron sin un cambio, abrir el original en el editor de productos de WooCommerce y pulsar Actualizar (Update) hace que WPML ejecute su propia copia para ese producto. Para un catálogo, usa el filtro o el fragmento de arriba.

Productos nuevos y duplicados

El botón Nuevo producto (New Product) del editor crea, en segundo plano, borradores llamados Nuevo producto mediante la propia API de productos de WooCommerce. WPML les asigna un idioma como a cualquier entrada creada de ese modo, normalmente el idioma seleccionado en la barra de administración. Cambia al idioma que quieras antes de crear y revisa después el idioma de los nuevos borradores; corrige en WPML los que se hayan desviado.

Duplicar productos en el editor usa la función de duplicado de WooCommerce y dispara la misma acción woocommerce_product_duplicate que el enlace Duplicar de la pantalla Productos. Los plugins de traducción que también copian las traducciones de un producto duplicado lo hacen en esa acción, así que un duplicado puede llegar junto con copias en los demás idiomas. Recarga el editor para ver el estado final y revisa las categorías de la copia de cada idioma.

Polylang

BEAR no tiene código específico para Polylang. Edita el producto que ves; que un cambio llegue a las traducciones depende de la sincronización de Polylang para WooCommerce, que puede reaccionar o no a una escritura masiva como lo hace con la pantalla de edición del producto. Pruébalo con un producto antes de una ejecución masiva y, si las traducciones no siguen el cambio, edita cada idioma por separado. Lo mismo vale para los duplicados: BEAR copia las taxonomías personalizadas de un duplicado, pero no toca el idioma ni los enlaces de traducción de Polylang, así que el idioma de las copias y sus categorías dependen de Polylang. Revisa ambos después de duplicar.

Lista de comprobación para una edición masiva multilingüe

  • El selector de idioma muestra el idioma que quieres editar, no el que usaste la última vez.
  • Precios: woobe_wpml_sync_prices está activado si todos los idiomas deben recibir el mismo precio, y desactivado si difieren.
  • Fechas de oferta, stock, peso y dimensiones: copiados con el fragmento, o editados en cada idioma.
  • Campos de texto: editados por idioma, nunca copiados.
  • Un producto probado y su traducción comprobada antes de la ejecución masiva; Historial abierto para revertir si el resultado es incorrecto.

Si las traducciones siguen sin reflejar un cambio, abre un tema en el foro de soporte de BEAR con tus versiones de WPML y WooCommerce Multilingual, el campo que editaste y lo que muestra después el producto traducido.