1
Polylang multiidioma
OpenClaw Agent edited this page 2026-05-20 09:11:28 -04:00

Polylang (multiidioma)

5 idiomas: ES, EN, FR, IT, PT (heredados de Joomla). Polylang gestiona traducciones de posts, categorías, menús y páginas.

Idiomas

Idioma term_taxonomy_id URL prefix
ES 1404 (FEA_LANG_ES_TTID en código) sin prefijo (default)
EN /en/
FR /fr/
IT /it/
PT /pt/

5 portadas

Cada idioma tiene su propia portada. Todas usan los shortcodes de fea-homepage.php.

Idioma Page ID
ES 26542
EN 43889
FR 42756
IT 42757
PT 42758

fea_is_front_page() en fea-homepage.php detecta cualquiera de las 5 para inyectar el CSS de portada.

Bug WP_Tax_Query con Polylang

Bug conocido en Polylang + WordPress core. La query:

get_posts([
    'lang' => $lang,
    'category__in' => [$cat],
]);

genera SQL con AND 0=1 cuando se combinan lang y category__in con category__in siendo numérico. La query devuelve vacío y, en contextos de archivo de categoría, WordPress responde 404.

Fix

NO pasar lang explícito. Polylang ya filtra automáticamente por el idioma actual de la página/petición:

get_posts([
    'category__in' => [$cat],   // sin 'lang'
]);

Dónde afecta

  • /category/cartasemana/ en EN/FR/IT/PT → 404. Issue #2.
  • Cualquier código que combine filtro por idioma y filtro por categoría numérica.

Bug get_term_by('slug', ...) en idiomas no-ES

get_term_by('slug', $slug, 'category') devuelve false cuando el idioma actual no es ES, incluso si el término existe en la traducción.

Fix

Saltar la API y usar $wpdb directo:

$tt_id = $wpdb->get_var($wpdb->prepare(
    "SELECT t.term_id FROM {$wpdb->terms} t
     JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
     WHERE t.slug = %s AND tt.taxonomy = %s",
    $slug, 'category'
));

Menú multiidioma

El selector de idioma en el header se renderiza con JavaScript inyectado en wp_footer, no con el widget de Polylang. Razones:

  • Permite construir un mapa idioma → URL traducida de la página actual con $wpdb directo, bypaseando el filtro de Polylang.
  • Resultado robusto incluso cuando el sitio está en un idioma minoritario.

Comportamiento por defecto

  • Idioma por defecto: ES.
  • URLs sin prefijo → ES.
  • Cookie + browser detection para redirigir a /lang/ la primera visita (configurado en Polylang settings).

Polylang admin

wp-admin → Idiomas → Configuración. La gestión de traducciones de post/categorías se hace desde cada editor individual con el widget "Idioma" en la sidebar.