Saltar navegación
Actualizado
julio 3, 2017

Muchos Temas despliegan entradas, páginas y categorías especiales en particular, basados generalmente en números ID. Por ejemplo, una sección de entradas «Especiales» en la página principal o categorías destacadas.

En algunos casos, esos números ID están integrados directamente dentro del código PHP del Tema, mientras que en otros el usuario los elige en la pantalla de configuración del Tema.

Para desplegarse correctamente, el Tema necesita elegir el número ID correspondiente a cada idioma. En WPML, los números ID de entradas, páginas, categorías y etiquetas cambian con el idioma; por lo tanto, el Tema debe utilizar los números de ID correctos para el idioma que esté activo.

WPML incluye dos opciones para lograr esto.

Usted puede: habilitar el ajuste automático de ID o utilizar la función wpml_object_id de forma manual en el Tema.

¿Qué opción utilizar?

El ajuste automático de ID no necesita de cambios en el código. Puede utilizarlo en cualquier Tema y todo se verá «correctamente». La desventaja de su utilización es un pequeño aumento en el tiempo de procesamiento y de acceso a las bases de datos dado que WPML ejecuta una serie de funciones y verifica que la salida sea la correcta para el idioma activo.

El ajuste manual del ID por medio de la función wpml_object_id logrará los mismos resultados y resultará más eficiente en términos de procesamiento. Sin embargo, requiere de mucha codificación en el Tema.

Si está construyendo un Tema desde cero, debería considerar seriamente la posibilidad de utilizar la función manual wpml_object_id. Si está editando un Tema ya existente, modificar el código puede no ser una solución realista; la mejor forma de lograrlo sería mediante el ajuste automático.

En todo caso, utilizar el plugin desde la memoria caché reduce a casi nada el impacto en el rendimiento. La utilización de esta memoria es recomendable siempre para cualquier sitio web. WPML funciona correctamente con WP Super Cache y W3 Total Cache (que nosotros mismos utilizamos en varios sitios web).

1) Ajuste automático de números ID

WPML tiene la propiedad de enlazarse a las funciones API de WordPress, detectar cuando elementos específicos son cargados y ajustar los ID de forma tal que los números sean siempre los correctos para el idioma activo.

Esta funcionalidad está habilitada por defecto y puede ser accedida desde WPML->Idiomas:

Ajuste de números ID para funcionalidad multilingüe

Esta acción permitirá ajustar automáticamente todos los ID y puede ser aprovechada en cualquier Tema de WordPress que utilice correctamente la API (casi todos los temas disponibles).

2) Manualmente, por medio de la función wpml_object_id

De forma alternativa, si el ajuste automático de ID está inhabilitado, puede utilizar la función wpml_object_id para logar el mismo resultado pero de forma manual.

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

Nota: para las versiones de WPML 3.2 y superiores utilice el ancla de filtro wpml_object_id. A partir de WPML 3.3, la función icl_object_id ha sido definida como no funcional y eliminada totalmente en 3.3

Ejemplo de utilización

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

Devuelve el ID de categoría del idioma actual para el ID de categoría número 4. Si la traducción no existe, devuelve el ID original (en este ejemplo: ID de categoría número 4).

Consulte nuestra página API para ver otros ejemplos y obtener más información detallada sobre su uso.

Traducir arreglos de números ID

Muchas veces se necesita generar un arreglo completo de números ID para objetos (mayoritariamente, de categorías). Para lograr esto, puede utilizar la función siguiente:

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

 }

}

Además, esta función acepta el tipo de objeto como un argumento.

Por ejemplo: para recuperar un arreglo de números ID para las categorías 1,3 y 6 podríamos realizar la llamada siguiente:

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

Mostrar elementos de página en idiomas diferentes

El parámetro opcional ulanguage_code permite mezclar los elementos de página en idiomas diferentes.

Por ejemplo: si tiene una galería de imágenes y no desea multiplicarlas para cada idioma, siga las instrucciones siguientes:

  1. Obtenga el ID de la página de idioma donde estén las imágenes.
  2. Navegue por las imágenes de esa página y muéstrelas en pantalla.

8 respuestas para “Números de ID dependientes del idioma”

  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