BEAR - WooCommerce Bulk Editor and Products Manager Professional

Modifier en masse les prix WooCommerce dans toutes les langues WPML (et Polylang)

Vous baissez une centaine de prix dans l'éditeur en masse, vous vérifiez la boutique en anglais et les nouveaux prix s'affichent, puis vous passez à l'allemand et vous retrouvez les anciens. Avec WPML, une modification en masse des prix WooCommerce dans toutes les langues demande une étape de plus que dans une boutique monolingue, car chaque traduction d'un produit est un produit à part entière. Cette page explique quelle langue BEAR modifie, comment répercuter les prix sur toutes les traductions avec un seul filtre, comment faire de même pour le stock, le poids et d'autres champs, et ce qu'il faut modifier langue par langue, volontairement.

Comment BEAR fonctionne avec WPML : une langue à la fois

WPML ne stocke pas un produit traduit à l'intérieur de l'original. Il crée un second produit WooCommerce avec son propre ID, ses propres prix, son propre stock et ses propres métadonnées, puis relie les deux dans un groupe de traduction. BEAR voit ces produits comme WooCommerce les voit, donc :

  • L'Editeur de produits liste les produits de la langue choisie dans le sélecteur de langue de WPML, en haut de l'écran d'administration. Changez la langue à cet endroit et l'éditeur affiche les produits de cette langue.
  • Les filtres, l'onglet Modifier en bloc et l'export travaillent sur les produits listés, c'est-à-dire sur une seule langue. Une exécution en masse en anglais ne modifie que les produits anglais.
  • BEAR écrit dans le produit que vous modifiez et nulle part ailleurs. La copie des champs vers les traductions par WPML est conçue autour de l'enregistrement de l'original sur l'écran d'édition du produit, et une écriture depuis l'éditeur en masse ne la déclenche pas de façon fiable. Ne comptez pas dessus pour une modification portant sur tout le catalogue.

Choisissez une langue précise dans le sélecteur avant de commencer, et vérifiez la langue active avant chaque exécution en masse. La note de compatibilité WPML énonce la même règle : les produits de chaque langue sont modifiés en masse séparément. Les deux sections ci-dessous présentent les moyens de faire quand même parvenir une modification aux autres langues.

Synchroniser les prix dans toutes les langues WPML avec woobe_wpml_sync_prices

Pour les prix, BEAR dispose d'un interrupteur intégré. Ajoutez ce filtre :

/*
 * 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' );

À partir de là, chaque fois que BEAR écrit un prix normal supérieur à zéro ou un prix promotionnel dans un produit, il écrit la même valeur dans les traductions de ce produit, dans toutes les langues WPML. Peu importe la manière dont le prix a été écrit : saisi dans une cellule, défini avec le calculateur de prix, modifié par valeur ou par pourcentage dans l'onglet Modifier en bloc, ou rétabli par une restauration dans l'Historique. Les variations sont également couvertes : le prix d'une variation est répercuté sur les variations traduites. Supprimer un prix promotionnel avec -1, comme décrit dans comment supprimer en masse les prix promotionnels, l'efface aussi dans les traductions.

Trois points à connaître avant de vous y fier :

  • Le même nombre est écrit dans chaque langue. C'est correct lorsque toutes les langues vendent dans la même devise. Si une langue doit avoir son propre prix, laissez le filtre désactivé et modifiez cette langue séparément.
  • Les dates de promotion n'en font pas partie. Un prix promotionnel copié dans les traductions sans ses champs Début de la promotion (Sale time from) et Fin de la promotion (Sale time to) est actif tout de suite dans ces langues. Définissez les dates dans chaque langue ou copiez-les avec l'extrait de code de la section suivante.
  • Seules les modifications faites après l'ajout du filtre sont copiées. Les prix qui diffèrent déjà restent tels quels jusqu'à la prochaine écriture.

Le filtre figure avec les autres interrupteurs au niveau du code dans Plus de paramètres (implicites).

Copier le stock, le poids, les dimensions et d'autres champs vers les traductions

Chaque champ que BEAR écrit se termine par l'action woobe_after_update_page_field, qui reçoit l'ID du produit, l'objet produit, la clé du champ, la valeur et le type de champ. Une petite fonction accrochée à cette action peut répéter la modification sur chaque traduction. Celle-ci copie le stock, les données d'expédition, la classe de taxe et les dates de promotion :

/*
 * 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 );

Comment bien l'utiliser :

  • Modifiez d'abord un seul produit dans l'éditeur et regardez sa traduction. Quand la valeur est bien arrivée, lancez la modification en masse.
  • La fonction copie depuis la langue que vous modifiez vers toutes les autres. Faites ces modifications dans votre langue principale et considérez-la comme la source.
  • Elle s'exécute à chaque écriture passant par BEAR, restaurations de l'Historique comprises : restaurer l'original remet donc aussi les traductions en état.
  • Ajoutez ou retirez des clés dans la liste $copy selon vos besoins. N'y mettez pas les champs de texte (titre, descriptions, slug) : c'est précisément pour eux que les traductions existent.
  • L'UGS (SKU) est volontairement exclue. WooCommerce refuse une UGS déjà utilisée par un autre produit, si bien que la copier peut échouer selon la manière dont votre configuration WPML traite _sku. Définissez les UGS langue par langue, ou vérifiez d'abord cette configuration.

Si WooCommerce Multilingual maintient déjà le stock synchronisé entre les traductions sur votre boutique, copier les champs de stock est sans effet néfaste : le même nombre est écrit deux fois. La gestion du stock en masse est traitée dans BEAR comme gestionnaire de stock WooCommerce.

Ce qu'il faut modifier dans chaque langue

Les titres, descriptions, descriptions courtes, slugs, notes d'achat et tout ce qui s'écrit en mots appartiennent à une seule langue. Modifiez-les langue par langue : changez la langue dans la barre d'administration, filtrez, puis lancez la modification en masse. Recommencez pour la langue suivante.

Les filtres travaillent sur les valeurs stockées dans les produits de la langue en cours. Les catégories, les étiquettes et les termes d'attributs sont eux aussi traduits : un filtre construit en anglais pointe donc vers des termes anglais ; reconstruisez-le après avoir changé de langue. Un filtre sur un champ méta ne trouve que les traductions qui contiennent elles-mêmes cette valeur ; un champ que WPML ne copie pas peut donc être vide dans une traduction, et le filtre n'y trouve rien. Les champs que WPML est configuré pour copier se modifient de préférence dans la langue d'origine, afin que le prochain enregistrement côté WPML ne ramène pas l'ancienne valeur.

Si seuls quelques produits ont échappé à une modification, ouvrir l'original dans l'éditeur de produits WooCommerce et cliquer sur Mettre à jour (Update) laisse WPML exécuter sa propre copie pour ce produit. Pour un catalogue entier, utilisez le filtre ou l'extrait de code ci-dessus.

Produits nouveaux et dupliqués

Le bouton Nouveau produit (New Product) de l'éditeur crée des brouillons nommés Nouveau produit (New Product) via l'API produit propre à WooCommerce, en arrière-plan. WPML leur attribue une langue comme pour tout contenu créé de cette façon, normalement la langue sélectionnée dans la barre d'administration. Passez à la langue voulue avant de créer, puis vérifiez ensuite la langue des nouveaux brouillons ; corrigez dans WPML ceux qui se seraient égarés.

La duplication de produits dans l'éditeur utilise la fonction de duplication de WooCommerce et déclenche la même action woocommerce_product_duplicate que le lien Dupliquer de l'écran Produits. Les extensions de traduction qui copient aussi les traductions d'un produit dupliqué le font sur cette action : un doublon peut donc arriver accompagné de copies dans les autres langues. Rechargez l'éditeur pour voir l'état final, et vérifiez les catégories de la copie de chaque langue.

Polylang

BEAR n'a pas de code propre à Polylang. Il modifie le produit que vous voyez ; que la modification atteigne les traductions dépend de la synchronisation de Polylang for WooCommerce, qui peut réagir ou non à une écriture en masse comme elle réagit à l'écran d'édition du produit. Testez sur un produit avant une exécution en masse, et si les traductions ne suivent pas, modifiez chaque langue séparément. Il en va de même pour les doublons : BEAR copie les taxonomies personnalisées d'un doublon mais laisse intacts la langue et les liens de traduction de Polylang ; la langue des copies et leurs catégories viennent donc de Polylang. Vérifiez les deux après la duplication.

Liste de contrôle pour une modification en masse multilingue

  • Le sélecteur de langue affiche la langue que vous voulez modifier, pas celle que vous avez utilisée en dernier.
  • Prix : woobe_wpml_sync_prices est activé si toutes les langues doivent recevoir le même prix, désactivé si elles diffèrent.
  • Dates de promotion, stock, poids et dimensions : copiés par l'extrait de code, ou modifiés dans chaque langue.
  • Champs de texte : modifiés langue par langue, jamais copiés.
  • Un produit testé et sa traduction vérifiée avant l'exécution en masse ; l'Historique ouvert pour annuler si le résultat est mauvais.

Si les traductions ne suivent toujours pas une modification, ouvrez un sujet sur le forum d'assistance de BEAR en indiquant vos versions de WPML et de WooCommerce Multilingual, le champ que vous avez modifié et ce qu'affiche ensuite le produit traduit.