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: Feature request
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. |
| 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 |
| 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 ¿Podría ser que haya una segunda publicación de esta propiedad sin publicar o en la papelera? Saludos cordiales. |
| 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. 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.