Números ID dependientes del idioma
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 para entradas, páginas, categorías y etiquetas varían cada vez que cambia el idioma, de manera tal que el Tema necesita utilizar el número ID relacionado con el idioma activo.
WPML proporciona una función API que realiza lo siguiente:
icl_object_id(ID, tipo, devuelve_el_original_si_no_existe)
- ID: el número ID de la entrada, página, etiqueta o categoría.
- tipo: ‘post’, ‘page’, ‘tag’ o ‘category’
- devuelve_el_original_si_no_existe: true cuando WPML debe devolver el número ID del elemento original del idioma si la traducción no existe o false cuando WPML debe devolver un valor NULL si la traducción no existe.
El argumento ID puede ser el número ID del objeto en cada idioma. Lo que realizará la función es buscar el grupo de traducción para ese objeto y luego el número de ID del objeto correspondiente para el idioma activo.
Ejemplo de utilización
icl_object_id(3, 'category', false)
Devuelve el número ID de la categoría que corresponde a la traducción de la categoría 3. Si no existe, devuelve NULL.
Cómo aplicarlo en Temas
Si está escribiendo un Tema que necesita ser utilizado con WPML, pero también desea que se ejecute adecuadamente sin WPML, debería realizar esas llamadas por medio de la función function_exists(). Por ejemplo: puede crear esta función en su archivo functions.php:
function lang_category_id($id){
if(function_exists('icl_object_id')) {
return icl_object_id($id,'category',true);
} else {
return $id;
}
}
Esta función devolverá el número ID de la categoría traducida (si existe) o el número ID de la categoría original (si no hay traducción). Si WPML no está instalado, el número ID original de la categoría será devuelto siempre.
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($ids_array, $type) {
if(function_exists('icl_object_id')) {
$res = array();
foreach ($ids_array as $id) {
$xlat = icl_object_id($id,$type,false);
if(!is_null($xlat)) $res[] = $xlat;
}
return $res;
} else {
return $ids_array;
}
}
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')
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
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!
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); ?>
2, 'order'=> 'DESC', 'orderby' => 'date', 'category' => $category_exclude );
$postslist = get_posts( $args );
$counter = 2;
foreach ($postslist as $post) : setup_postdata($post); ?>