Saltar navegación
Actualizado
junio 12, 2024

Muchos temas muestran entradas, Páginas y Categorías especiales de forma especial, normalmente basándose en IDs.
Por ejemplo, una sección de entradas «Destacadas» en la página de inicio, o categorías destacadas.
En algunos casos, estos ID están codificados en el PHP del tema y, en otros, el usuario los selecciona en la pantalla de configuración del tema.
Para que se muestren correctamente, el tema debe seleccionar los ID por idioma.
En WPML, los ID de las Entradas, Páginas, Categorías y Etiquetas cambian cuando cambia el idioma, por lo que el tema debe utilizar los ID correctos del idioma activo.
WPML incluye dos opciones para conseguirlo.
Puedes activar el ajuste automático del ID o utilizar el wpml_object_id manualmente en tu tema.

¿Qué opción utilizar?

El ajuste automático del ID no requiere cambios en tu código.
Puedes utilizarlo con cualquier tema y todo «simplemente funciona».
La desventaja de utilizarlo es que aumenta ligeramente el tiempo de procesamiento y el acceso a la base de datos, ya que WPML se conectará a muchas funciones y comprobará que la salida es correcta para el idioma activo.
El ajuste manual del ID mediante la función wpml_object_id conseguirá los mismos resultados y puede ser más eficiente en términos de procesamiento.
Sin embargo, requiere una codificación significativa en el tema.
Si estás creando un tema desde cero, deberías considerar utilizar wpml_object_id para hacerlo manualmente.
Si partes de un tema ya existente, hackear y modificar el tema puede no ser realista y el ajuste automatizado del ID es probablemente el camino a seguir.
En cualquier caso, utilizando cualquier extensión de cache, el impacto en el rendimiento de esta operación se reduce a cero.
El cache es siempre recomendable para sitios de cualquier tamaño.
WPML funciona correctamente con WP Super Cache y W3 Total Cache (que también utilizamos en otros sitios).

1) Ajusta automáticamente las identificaciones

WPML puede engancharse a las funciones de la API de WordPress, detectar cuándo se cargan determinados elementos y ajustar los ID para que los resultados se ajusten al idioma activo.
Esta funcionalidad está activada por defecto y puedes acceder a ella a través de WPMLIdiomas:

Ajusta los identificadores para la funcionalidad multilingüe

Esto ajustará automáticamente todos los ID y se puede utilizar en cualquier tema de WordPress que utilice la API correctamente (casi cualquier tema que puedas encontrar).

2) Manualmente, utilizando la función wpml_object_id

Alternativamente, si el ajuste automático del ID está desactivado, puedes utilizar la función wpml_object_id para conseguir lo mismo manualmente.

apply_filters( ‘wpml_object_id’, int $element_id, cadena $element_type, bool $return_original_if_missing, mixed $ulanguage_code )

Nota: Para las versiones de WPML >=3.2 utiliza el filtro hook wpml_object_id.
Desde WPML 3.3, la función icl_object_id ha sido etiquetada como Obsoleta y eliminada por completo en 3.3

Ejemplo de uso

echo apply_filters( 'wpml_object_id', 4, 'category', TRUE  );

Devuelve el ID de categoría en el idioma actual para el ID de categoría 4.
Si falta la traducción, devolverá el original (aquí: categoría ID 4).
Consulta nuestra Página de la API para ver otros ejemplos y obtener información más detallada sobre su uso.

Traducir matrices de ID

Muchas veces necesitas convertir toda una matriz de identificadores de objetos (normalmente identificadores de Categoría).
Para ello, puedes utilizar la siguiente función:

function lang_object_ids($object_id, $type) {
    if( is_array( $object_id ) ){
        $translated_object_ids = array();
        foreach ( $object_id as $id ) {
            $translated_object_ids[] = apply_filters( 'wpml_object_id', $id, $type, true, $current_language );
        }
        return $translated_object_ids;
    } else {
  return apply_filters( 'wpml_object_id', $object_id, $type, true, $current_language );
 }
}

Esta función también acepta el tipo de objeto como argumento.
Por ejemplo, para obtener una matriz de identificadores de Categoría para las categorías 1,3 y 6 llamaremos a:

lang_object_ids(array(1,3,6),'category')

Mostrar los elementos de la Página en diferentes idiomas

El parámetro opcional ulanguage_code permite mezclar elementos de la Página en distintos idiomas.
Por ejemplo, si tienes una galería de imágenes y no quieres duplicar las imágenes por idioma, sigue estos pasos:

  1. Obtén el ID de la Página en el idioma en el que existe la galería.
  2. Haz un bucle sobre las imágenes de esa Página y muéstralas.

8 respuestas para “Identificadores dependientes de la lengua”

  1. Buenas,

    os cuento lo que estoy intentando hacer:

    Tengo un blog con este plugin instalado y configurado. Fuera del blog, tengo una web en varios idiomas, donde muestro los últimos post del blog. En español (idioma predeterminado de mi blog y web) se muestran facilmente, utilizando el siguiente código:

    define(‘WP_USE_THEMES’, false);
    require(‘../blog/wp-load.php’);
    query_posts(‘category_name=desarrolloweb&showposts=4’);

    Las entradas en inglés están en una categoría llamada: English. Si intento mostrar los últimos post en inglés, cuando en la web se elige el idioma inglés. No lo hace! Y lo intento de igual forma que en español:

    define(‘WP_USE_THEMES’, false);
    require(‘../blog/wp-load.php’);
    query_posts(‘category_name=ingles&showposts=4’);

    ¿WPML utiliza un ID o nombre de categoría diferente al que usa WordPress por defecto?

    • Hola enrique, prueba con esta query:

      query_posts(‘category_name=ingles&showposts=4&suppress_filter=0′);

      Déjame saber si funciona.

      Saludos

  2. Hola.

    Tengo un blog con idioma espanol e ingles.
    En el home visualizo la categoria noticias con el id 33.

    He realizado la traduccion de sus entradas al ingles.

    Cuando ingreso al Home en idioma Ingles la entrada esta no aparece.
    Me aparece nuevamente la version en espanol.

    Que debo hacer, para que aparezcan las entradas en sus respectivos idiomas?

    Muchas Gracias!

  3. Asi se realiza la llamada..

    2, ‘order’=> ‘DESC’, ‘orderby’ => ‘date’, ‘category’ => $category_exclude );
    $postslist = get_posts( $args );

    $counter = 2;
    foreach ($postslist as $post) : setup_postdata($post); ?>

  4. 2, 'order'=> 'DESC', 'orderby' => 'date', 'category' => $category_exclude );
    $postslist = get_posts( $args );

    $counter = 2;
    foreach ($postslist as $post) : setup_postdata($post); ?>

  5. Hola,
    Necesito algo de ayuda en relacion con todo esto…
    he modificado mi archivo function.php , tal y como se señala más arriba, añadiendo la función:

    function lang_category_id($id){
    if(function_exists(‘icl_object_id’)) {
    return icl_object_id($id,’category’,true);
    } else {
    return $id;
    }
    }

    Pero no me sale con las instrucciones que he leído.¿Qué puedo estar haciendo mal?¿me falta hacer algo?

    …Lo que quiero hacer es lo que se describe más arriba en este hilo, es decir, que al realizar una llamada por categoría, me devuelva las entradas traducidas que haya, y también las que no están traducidas. Es decir, que lo muestre todo, eligiendo la traduccion cuando la haya.

    Por otro lado, en la «configuracion de WPML» en el apartado «Instrucciones para utilizar los idiomas sin traducir» he probado alternativamente a seleccionar tanto «Omitir el idioma» como la opcion «Enlace hacia la página de inicio de idiomas para las traducciones faltantes». Asimismo en la opción «Entradas de blog para mostrar» tengo seleccionado «Todas las entradas (mostrar la traducción si existiera o, de lo contrario, entradas en el idioma predeterminado). »

    Gracias y saludos!

    • El codigo que has copiado en functions.php no hace nada de por si, tienes que llamarlo de alguna forma. Se trata solo de un ejemplo de function_exists() que sirve para que el theme siga funcionando si desactivas WPML.

      Para darte un soporte apropiado con un seguimiento correcto tienes que plantear tu pregunta en nuestro foro de soporte: http://wpml.org/es/forums/forum/soporte-en-espanol/

      Gracias