Saltar al contenido Saltar a la barra lateral

Este es el foro de soporte técnico de WPML, el plugin multilingüe de WordPress.

Todas las personas pueden leerlo pero solo los clientes de WPML pueden ingresar comentarios. El equipo de WPML responde en los foros 6 días a la semana, 22 horas por día.

Sun Mon Tue Wed Thu Fri Sat
- - 9:00 – 18:00 9:00 – 18:00 9:00 – 18:00 9:00 – 18:00 9:00 – 18:00
- - - - - - -

Zona horaria del soporte: America/Lima (GMT-05:00)

Etiquetado: 

Este tema contiene 18 respuestas, tiene 1 voz.

Última actualización por Andreas W. hace 1 mes, 2 semanas.

Asistido por: Andreas W..

Autor Publicaciones
febrero 11, 2026 a las 15:41 #17813481

eduardoC-35

1- ejecuto el import en español con un cron.
2- ejecuto con otro cron el import en inglés.
3- Ejecuto WP-CLI para WPML Export and Import que es el que asigna los lenguajes.
Me está creando esta estructura en las urls:
enlace oculto
enlace oculto

febrero 11, 2026 a las 15:49 #17813496

eduardoC-35

Esto funcionaba bien, hasta hace unos días que he detectado este problema con los slugs

febrero 11, 2026 a las 18:16 #17814069

eduardoC-35

He revisado más información y lo extraño es que empezó a generar los slugs con "-2" en medio de la ejecución de un import, el día 27 . Rastreando por propiedad_id veo :

enlace oculto
Esa está correcta.
Desde ahí, todas las nuevas propiedades que se han importado se generan con "-2" para el idioma inglés.
enlace oculto

febrero 13, 2026 a las 04:18 #17819191

Andreas W.
Partidario de WPML desde 12/2018

Idiomas: Inglés (English ) Español (Español ) Alemán (Deutsch )

Zona horaria: America/Lima (GMT-05:00)

Hola,

WordPress añade -2 o más números al slug si ya se usa en el sitio.

Esto significa que debes haber importado el mismo contenido dos veces.

enlace oculto
y
enlace oculto

¿Podría ser que haya una segunda publicación de esta propiedad sin publicar o en la papelera?

Saludos cordiales.
Andreas

febrero 13, 2026 a las 13:47 #17820909

eduardoC-35

Gracias por tu respuesta, no se trata de eso, son importaciones que si funcionaban pero ahora no se por que motivo WPML no debe estar asignando bien el idioma o wordpress genera el slug antes de asignar el idioma. En realidad correctamente debería ser un slug en español, y el mismo slug en ingles sin el "-2" solo el "en/" que hace la diferencia del idioma.

Por otra parte me gustaría hablar con alguien de soporte pero no responde nadie, este soporte de este plugin la verdad que deja bastante que desear.

Saludos.

febrero 13, 2026 a las 17:26 #17821497

Andreas W.
Partidario de WPML desde 12/2018

Idiomas: Inglés (English ) Español (Español ) Alemán (Deutsch )

Zona horaria: America/Lima (GMT-05:00)

¡Muchas gracias por esta información!

Intentaré replicar este problema en un sitio de desarrollo y, si es posible, buscaré una solución.

febrero 13, 2026 a las 18:07 #17821518

eduardoC-35

Lo que creo que puede estar pasando:

Resumen del problema con slugs duplicados (-2) en imports multilingües

Estamos ejecutando dos imports secuenciales con WP All Import:

Import 14 → Español

Import 15 → Inglés

Ambos usan el mismo Unique Identifier y funcionan correctamente en términos de actualización.

Lo que está ocurriendo

Desde el 27 de enero, las propiedades nuevas en inglés se están creando con -2 en el slug.

Ejemplo:

Español: for-sale-fully-furnished-office-one

Inglés: for-sale-fully-furnished-office-one-2

Esto no ocurría antes de esa fecha.

Lo que ya verificamos

Unique Identifier funciona correctamente

Ambos imports registran el mismo unique_key en vjm_pmxi_posts.

WPML está vinculando correctamente las traducciones

Ambos posts comparten el mismo trid en vjm_icl_translations.

Es decir, la relación de traducción existe y se crea correctamente.

El problema ocurre solo en propiedades nuevas

Las antiguas no presentan el problema.

El issue comienza después del 27 de enero.

Lo que se hizo pero creo que no fue en esa fecha del 27 de enero si no antes:

Se desinstaló WPML All Import Add-On

Se activó WPML Export & Import siguiendo recomendación de soporte

Desde ese momento comenzó el problema.

Comportamiento técnico observado

Actualmente el flujo es:

WP All Import crea el post en español.

WP All Import crea el post en inglés como post independiente.

WordPress genera el slug.

WordPress detecta que el slug ya existe y añade -2.

Luego WPML enlaza ambos posts bajo el mismo trid.

Es decir:

La relación de traducción se crea correctamente, pero ocurre después de que WordPress haya generado el slug.

Hipótesis técnica

Cuando estaba instalado WPML All Import Add-On, el idioma se establecía antes de ejecutar wp_insert_post(), permitiendo que WPML interviniera en el filtro wp_unique_post_slug.

Desde que se desinstaló ese add-on y se utiliza únicamente WPML Export & Import, el idioma parece establecerse después de la creación del post, lo que provoca que WordPress trate el slug como duplicado y añada -2.

¿WPML Export & Import sustituye completamente la funcionalidad del antiguo WPML All Import Add-On en lo que respecta a la creación de traducciones durante un import con WP All Import?

¿Cómo debe configurarse actualmente WP All Import para que el idioma de la traducción se establezca antes de la generación del slug?

¿Cuál es la forma correcta de evitar que WordPress añada -2 al slug en imports multilingües secuenciales?

Muchas gracias por tu atención.

febrero 14, 2026 a las 07:57 #17822265

Andreas W.
Partidario de WPML desde 12/2018

Idiomas: Inglés (English ) Español (Español ) Alemán (Deutsch )

Zona horaria: America/Lima (GMT-05:00)

Pude confirmar el mismo problema en un sitio de prueba al importar entradas de WordPress que comparten el mismo título o slug.

Al importar, las entradas se generan en el idioma predeterminado del sitio y WordPress añadirá "-2" a los slugs duplicados, ya que no se puede usar el mismo slug más de una vez.

Al fusionar las traducciones con WPML Export & Import, actualmente no hay ninguna función para normalizar dichos slugs.

Este problema está a punto de escalarse como una solicitud de función para WPML > Export & Export.

Si no experimentaste estos problemas con WPML All Import, te recomiendo que sigas usando este complemento mientras tanto.

febrero 14, 2026 a las 10:44 #17822388

Andreas W.
Partidario de WPML desde 12/2018

Idiomas: Inglés (English ) Español (Español ) Alemán (Deutsch )

Zona horaria: America/Lima (GMT-05:00)

Este problema se ha escalado a nuestro gerente de producto para su revisión.

Ya he creado una función para la importación con WPML Export & Import. Si lo deseas, puedo ofrecerle implementarla en un sitio de prueba de tu sitio web para que puedas probarla.

febrero 18, 2026 a las 18:21 #17833654

eduardoC-35

Gracias, ¿Cómo procedemos para solucionarlo? ¡Cual es el próximo paso? Por favor, nos urge una solución.
Lo que me extraña es que nadie lo haya reportado antes.

Ya estaba utilizando WPML All Import antes, pero en vuestro soporte nos recomendaron que usáramos mejor WP MP Exporta and Import, que el otro plugin estaba obsoleto. Por eso hicimos el cambio...¿volver a cambiar no implica ningún ajuste extra en las importaciones? y que efectos puede tener en todas las propiedades ya existentes así como en las nuevas propiedades? No es un cambio para tomar a la ligera estando el sitio web en producción y con importaciones masivas diarias automatizadas.

febrero 18, 2026 a las 20:42 #17833936

Andreas W.
Partidario de WPML desde 12/2018

Idiomas: Inglés (English ) Español (Español ) Alemán (Deutsch )

Zona horaria: America/Lima (GMT-05:00)

Hay dos cosas que podríamos hacer ahora mismo:

- Si te funciona, sigue usando WPML All Import.

o

- Podría implementar la solución que creé para WPML Export & Import en tu sitio web y que la pruebes.

Lamentablemente, aún no he recibido respuesta interna sobre la escalación de este problema.

Déjame saber cómo te gustaría proceder.

febrero 20, 2026 a las 15:06 #17838888

eduardoC-35

Hola,

Después de tu comentario nunca me deja responder, de ahí que tarde en hacerlo. Pasado un tiempo si me aparece la opción de sigo necesitando ayuda y entonces si puedo responder.

El caso es que me gustaría una respuesta definitiva a este problema. Volver a WPML All Import entiendo que conlleva riesgos y posible rotura de enlaces que ya existen? No quiero dañar la base de datos que me ha generado ya muchos problemas la utilización de este plugin y las respectivas limpiezas de restos de enlaces, traducciones mal enlazadas , etc

Me gustaría poder aplicar una solución definitiva y testeada a este problema. Por ahora se siguen importando nuevas propiedades diariamente con el problema del "-2" para los slugs en inglés. Y entiendo que me va a tocar hacer una depuración posterior...hablamos de miles de propiedades...unas 10 mil , no es algo para tomar a la ligera.

Saludos!

febrero 20, 2026 a las 18:34 #17839354

Andreas W.
Partidario de WPML desde 12/2018

Idiomas: Inglés (English ) Español (Español ) Alemán (Deutsch )

Zona horaria: America/Lima (GMT-05:00)

Yo he creado un patch que debe solucionar el problema, pero el soporte del segundo nivel todavía no lo he revisado.

Te sugeriría que configure un sitio de prueba en el que yo parchee el complemento para usted y luego ejecute algunas importaciones de prueba.

Seria possible?

Esto es el patch:

Agregar un nuevo archivo a wp-content\plugins\wpml-import\classes\Commands\FixImportedPostSlugs.php

<?php

namespace WPML\Import\Commands;

use WPML\Collect\Support\Collection;
use WPML\Import\Commands\Base\Query;
use WPML\Import\Fields;

// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared

class FixImportedPostSlugs implements Base\Command {

	use Query;

	/**
	 * Optional meta key for import tools that map a "Slug" column into post meta.
	 */
	const DESIRED_SLUG_META = '_wpml_import_desired_slug';
	const DUPLICATE_OF_META = '_icl_lang_duplicate_of';
	const DUPLICATE_STATUS_META = '_icl_lang_duplicate_status';

	const DEFAULT_LIMIT = 50;

	/** @var \wpdb */
	protected $wpdb;

	/** @var string|null */
	private $forcedSlug = null;

	/** @var int|null */
	private $forcedPostId = null;



	public function __construct( \wpdb $wpdb ) {
		$this->wpdb = $wpdb;
	}

	public static function getTitle() {
		return __( 'Fixing Imported Post Slugs', 'wpml-import' );
	}

	public static function getDescription() {
		return __( 'Normalize imported translation slugs to match their WPML source post slug.', 'wpml-import' );
	}

	public function countPendingItems( Collection $args = null ) {
		return count( $this->getPendingItems() );
	}

	public function run( Collection $args = null ) {
		$items = $this->getPendingItems( self::DEFAULT_LIMIT );

		if ( empty( $items ) ) {
			return 0;
		}

		// Prevent WP from re-suffixing while we intentionally align translation slugs.
		add_filter( 'pre_wp_unique_post_slug', [ $this, 'preUniqueSlug' ], 10, 6 );

		foreach ( $items as $item ) {
			$postId = (int) $item->post_id;

			if ( ! $postId ) {
				continue;
			}

			$current     = sanitize_title( (string) get_post_field( 'post_name', $postId ) );
			$slugToApply = sanitize_title( (string) $item->source_slug );

			if ( '' === $slugToApply || '' === $current ) {
				$this->cleanupDuplicateMeta( $postId );
				$this->cleanupMeta( $postId );
				continue;
			}

			if ( $current !== $slugToApply ) {
				$this->forcedSlug   = $slugToApply;
				$this->forcedPostId = $postId;

				$res = wp_update_post([ 
					'ID' => $postId, 
					'post_name' => $slugToApply 
					], 
					true);

				$this->forcedSlug   = null;
				$this->forcedPostId = null;

				$this->cleanupOldSlugMeta( $postId );
			}

			$this->cleanupDuplicateMeta( $postId );
			$this->cleanupMeta( $postId );
		}

		remove_filter( 'pre_wp_unique_post_slug', [ $this, 'preUniqueSlug' ], 10 );

		return count( $items );
	}

	/**
	 * Short-circuit WP slug uniqueness only while we are forcing a slug.
	 */

	public function preUniqueSlug( $override, $slug, $post_ID, $post_status, $post_type, $post_parent ) {
		if ( ! $this->forcedSlug || (int) $post_ID !== (int) $this->forcedPostId ) {
			return $override;
		}

		// Attachments excluded by query, but keep it defensive.
		if ( 'attachment' === $post_type ) {
			return $override;
		}

		$obj = get_post_type_object( $post_type );
		$isHierarchical = $obj && ! empty( $obj->hierarchical );

		if ( $isHierarchical ) {
			// If a sibling already has that slug, let WP generate a unique one.
			$exists = $this->wpdb->get_var(
				$this->wpdb->prepare(
					"
					SELECT ID FROM {$this->wpdb->posts}
					WHERE post_type = %s
					AND post_parent = %d
					AND post_name = %s
					AND ID <> %d
					LIMIT 1
					",
					$post_type,
					(int) $post_parent,
					$this->forcedSlug,
					(int) $post_ID
				)
			);

			if ( $exists ) {
				return $override; // let WP suffix
			}
		}

		return $this->forcedSlug;
	}

	private function cleanupMeta( $postId ) {
		if ( $postId ) {
			delete_post_meta( $postId, self::DESIRED_SLUG_META );
		}
	}

	/**
	 * Prevent WordPress canonical redirects based on historical slugs after normalization.
	 */
	private function cleanupOldSlugMeta( $postId ) {
		if ( $postId ) {
			delete_post_meta( $postId, '_wp_old_slug' );
			delete_post_meta( $postId, '_wp_old_date' );
		}
	}

	/**
	 * Ensure imported translations are not kept as "duplicates of original" by WPML.
	 */
	private function cleanupDuplicateMeta( $postId ) {
		if ( $postId ) {
			delete_post_meta( $postId, self::DUPLICATE_OF_META );
			delete_post_meta( $postId, self::DUPLICATE_STATUS_META );
		}
	}

	/**
	 * Returns imported posts that need slug normalization.
	 */
	private function getPendingItems( $limit = null ) {
		return $this->getResultsWithLimit(
			"
			SELECT
				tr.element_id AS post_id,
				sourcePost.post_name AS source_slug
			FROM {$this->wpdb->prefix}icl_translations tr
			INNER JOIN {$this->wpdb->postmeta} pm
				ON pm.post_id = tr.element_id
				AND pm.meta_key = '" . Fields::TRANSLATION_GROUP . "'
			INNER JOIN {$this->wpdb->prefix}icl_translations sourceTr
				ON sourceTr.trid = tr.trid
				AND sourceTr.element_type = tr.element_type
				AND COALESCE(sourceTr.source_language_code, '') = ''
			INNER JOIN {$this->wpdb->posts} post
				ON post.ID = tr.element_id
			INNER JOIN {$this->wpdb->posts} sourcePost
				ON sourcePost.ID = sourceTr.element_id
			LEFT JOIN {$this->wpdb->postmeta} duplicateMeta
				ON duplicateMeta.post_id = tr.element_id
				AND duplicateMeta.meta_key = '" . self::DUPLICATE_OF_META . "'
			WHERE tr.element_type LIKE '" . $this->wpdb->esc_like( 'post_' ) . "%'
				AND tr.element_type <> 'post_attachment'
				AND COALESCE(tr.source_language_code, '') <> ''
				AND (
					post.post_name <> sourcePost.post_name
					OR NULLIF(duplicateMeta.meta_value, '') IS NOT NULL
				)				
			ORDER BY tr.element_id ASC
			",
			$limit
		);
	}
}

Incluya la clase en wp-content\plugins\wpml-import\classes\Commands\Provider.php:getProcessCommands() justo después de SetPostsLanguage::class:

public static function getProcessCommands( $context ) {
		$processCommands = [
			SetTermsLanguage::class,
			SetPostsLanguage::class,
		  FixImportedPostSlugs::class,
		  ...

Después de estos cambios WPML Export & IMport va a ajustar los slugs al momento de la migración.

febrero 23, 2026 a las 20:39 #17844436

eduardoC-35

Gracias Andreas, prefiero esperar a la solución definitiva ya testeada por ustedes. ¿Cuándo estará disponible el fix? ¿No hay ningún usuario WPML más al que le esté pasando esto?

Saludos

febrero 24, 2026 a las 17:30 #17848275

Andreas W.
Partidario de WPML desde 12/2018

Idiomas: Inglés (English ) Español (Español ) Alemán (Deutsch )

Zona horaria: America/Lima (GMT-05:00)

La solución para este problema se implementará en WPML Export & Import 1.2.0.

Lamentablemente, hasta ahora no puedo decir cuándo estará disponible esta actualización, pero podría tardar semanas o incluso meses, ya que esta actualización solucionará muchos otros problemas que aún están en desarrollo.

Mientras tanto, puedo ofrecerte nuevamente la posibilidad de parchear el plugin directamente en su sitio.

El tema '[Feature Request] Problema con las importaciones y traducciones automatizadas' está cerrado a nuevas respuestas.