Títulos en MAYÚSCULAS (legacy Joomla) → sentence case en todo el front (single, SEO, RSS) — solo presentación #87

Closed
opened 2026-06-28 19:14:23 +00:00 by rafa · 0 comments
Owner

Labels: area:aesthetic, area:plugin, improvement

Resumen

Los títulos de los artículos se ven en TODO MAYÚSCULAS, heredado de Joomla. Hay que mostrarlos en formato normal (sentence case: "Una relación de amor, no comercial"), de forma coherente con la portada.

Enfoque elegido: solo presentación (no se toca la BD). Se aplica una transformación en render; el dato crudo sigue en mayúsculas pero nunca se ve en el front. Reversible y sin riesgo de pérdida de datos.

Documentado para implementar desde cero contexto. Datos verificados el 2026-06-15 contra el WP local.


Estado actual verificado

  • 20.708 de 25.368 posts publicados (82%) tienen el post_title en TODO MAYÚSCULAS en la BD (BINARY post_title = BINARY UPPER(post_title)). Origen: migración FG Joomla → WP.
  • Ya existe la función fea_title() en wordpress/wp-content/mu-plugins/fea-homepage.php:675:
    function fea_title(string $title): string {
        $lower = mb_strtolower($title, 'UTF-8');
        return mb_strtoupper(mb_substr($lower,0,1,'UTF-8'),'UTF-8') . mb_substr($lower,1,null,'UTF-8');
    }
    
    Es sentence case naïve: todo a minúsculas + primera letra en mayúscula.
  • Ya existe un filtro the_title (fea-homepage.php:51) que aplica fea_title(), pero solo en listados/archivos/búsqueda y excluye explícitamente single, portada y admin:
    add_filter('the_title', function($title, $post_id = 0) {
        if (is_admin() || is_singular() || is_front_page()) return $title;
        if (!(is_archive() || is_search() || is_home())) return $title;
        if (!in_the_loop()) return $title;
        return function_exists('fea_title') ? fea_title($title) : $title;
    }, 20, 2);
    
  • La portada llama a fea_title() directamente en su código (cards, hero, secciones), por eso ahí ya se ve bien.

Dónde SIGUE viéndose en mayúsculas (lo que hay que cubrir)

  1. Vista del artículo (single)is_singular() está excluido → el <h1> del post sale en MAYÚSCULAS. Es el caso principal que reporta el usuario.
  2. <title> del documento / SEO — lo genera Yoast / document_title_parts, no pasa por the_title.
  3. RSS/feeds — usan el filtro the_title_rss.
  4. Breadcrumbs, "entradas relacionadas", navegación ←/→, widgets según de dónde tiren el título.
  5. wp-admin — se mantiene en mayúsculas a propósito (el editor ve el dato real para editarlo). No se cambia.

Qué hacer (solo presentación)

  1. Ampliar el filtro the_title para que cubra también el single: quitar is_singular() de la exclusión (mantener is_admin() excluido). Revisar la guarda in_the_loop() — el bloque post-title de la plantilla FSE (single, wp_template ID 42359) debe quedar cubierto; si el título principal no está "in the loop" en ese contexto, ajustar la condición para incluir is_singular() && in_the_main_query().
  2. Cubrir el <title> del documento y SEO:
    • Filtro document_title_parts (núcleo WP).
    • Yoast: wpseo_title, wpseo_opengraph_title, wpseo_twitter_title (y metadescription si procede). Aplicar fea_title() a la parte del título del post.
  3. Cubrir RSS: filtro the_title_rssfea_title().
  4. Multiidioma: fea_title() ya funciona en FR/IT/PT (solo capitaliza la inicial). No requiere lógica por idioma.
  5. Mantener is_admin() excluido.

Mejora opcional de fea_title() (casos peligrosos)

Al pasar el single por fea_title(), se hace más visible un defecto del sentence case naïve con títulos compuestos, sobre todo citas bíblicas que son el propio título:

  • ISAÍAS 5, 1-7 / FILIPENSES 4, 6-9 → hoy quedaría Isaías 5, 1-7 / filipenses 4, 6-9 (la 2ª parte tras / en minúscula).
  • También nombres propios y siglas se pierden (MARIA CLARA BINGEMERMaria clara bingemer), pero es el mismo criterio que ya se aplica y aprueba en la portada, así que se acepta salvo que se quiera afinar.

Mejora recomendable (no bloqueante): que fea_title() capitalice también la primera letra tras separadores (/, :, , «, ¿, ¡, "). Eso arregla las citas bíblicas dobles sin meterse en detección de nombres propios. Si se quiere ir más allá, mantener una lista corta de siglas/acrónimos a preservar — pero eso ya es opcional.


Plan de implementación

  1. Editar el filtro the_title en fea-homepage.php para incluir el single (mantener admin fuera).
  2. Añadir filtros document_title_parts, the_title_rss y los wpseo_* aplicando fea_title().
  3. (Opcional) Mejorar fea_title() para capitalizar tras separadores.
  4. Probar en local: artículo individual, listados, búsqueda, RSS (/feed/), <title> de la pestaña, y un título con cita bíblica doble.
  5. Deploy a prod (/web/wp-nuevo): subir el mu-plugin (scp NO va → ssh '... cat > ruta'; sin proc_open). Verificar server-side o con Rafa (Cloudflare bloquea headless).

Ficheros y referencias

  • wordpress/wp-content/mu-plugins/fea-homepage.php — filtro the_title (L51), fea_title() (L675).
  • Plantilla single FSE: wp_posts ID 42359.
  • Yoast SEO está activo (plugins del proyecto).

Criterios de aceptación

  • El título en la vista del artículo se muestra en sentence case (no en mayúsculas).
  • El <title> de la pestaña / SEO y los feeds RSS también en sentence case.
  • Listados, archivos, búsqueda y portada se mantienen correctos (sin regresiones).
  • El wp-admin sigue mostrando el título tal cual (en mayúsculas) para edición.
  • No se modifica la BD (enfoque reversible).
  • (Si se hace la mejora) las citas bíblicas dobles tipo ISAÍAS 5,1 / FILIPENSES 4,6 se capitalizan bien en ambas partes.
**Labels:** area:aesthetic, area:plugin, improvement ## Resumen Los títulos de los artículos se ven en **TODO MAYÚSCULAS**, heredado de Joomla. Hay que mostrarlos en **formato normal (sentence case:** *"Una relación de amor, no comercial"*), de forma coherente con la portada. **Enfoque elegido: solo presentación** (no se toca la BD). Se aplica una transformación en render; el dato crudo sigue en mayúsculas pero nunca se ve en el front. Reversible y sin riesgo de pérdida de datos. > Documentado para implementar desde cero contexto. Datos **verificados el 2026-06-15** contra el WP local. --- ## Estado actual verificado - **20.708 de 25.368** posts publicados (**82%**) tienen el `post_title` en TODO MAYÚSCULAS en la BD (`BINARY post_title = BINARY UPPER(post_title)`). Origen: migración FG Joomla → WP. - Ya existe la función **`fea_title()`** en `wordpress/wp-content/mu-plugins/fea-homepage.php:675`: ```php function fea_title(string $title): string { $lower = mb_strtolower($title, 'UTF-8'); return mb_strtoupper(mb_substr($lower,0,1,'UTF-8'),'UTF-8') . mb_substr($lower,1,null,'UTF-8'); } ``` Es sentence case naïve: todo a minúsculas + primera letra en mayúscula. - Ya existe un **filtro `the_title`** (`fea-homepage.php:51`) que aplica `fea_title()`, **pero solo en listados/archivos/búsqueda** y excluye explícitamente single, portada y admin: ```php add_filter('the_title', function($title, $post_id = 0) { if (is_admin() || is_singular() || is_front_page()) return $title; if (!(is_archive() || is_search() || is_home())) return $title; if (!in_the_loop()) return $title; return function_exists('fea_title') ? fea_title($title) : $title; }, 20, 2); ``` - La **portada** llama a `fea_title()` directamente en su código (cards, hero, secciones), por eso ahí ya se ve bien. ### Dónde SIGUE viéndose en mayúsculas (lo que hay que cubrir) 1. **Vista del artículo (single)** — `is_singular()` está excluido → el `<h1>` del post sale en MAYÚSCULAS. **Es el caso principal que reporta el usuario.** 2. **`<title>` del documento / SEO** — lo genera Yoast / `document_title_parts`, no pasa por `the_title`. 3. **RSS/feeds** — usan el filtro `the_title_rss`. 4. **Breadcrumbs, "entradas relacionadas", navegación ←/→, widgets** según de dónde tiren el título. 5. **wp-admin** — se mantiene en mayúsculas a propósito (el editor ve el dato real para editarlo). No se cambia. --- ## Qué hacer (solo presentación) 1. **Ampliar el filtro `the_title`** para que cubra también el **single**: quitar `is_singular()` de la exclusión (mantener `is_admin()` excluido). Revisar la guarda `in_the_loop()` — el bloque *post-title* de la plantilla FSE (single, `wp_template` ID 42359) debe quedar cubierto; si el título principal no está "in the loop" en ese contexto, ajustar la condición para incluir `is_singular() && in_the_main_query()`. 2. **Cubrir el `<title>` del documento y SEO:** - Filtro `document_title_parts` (núcleo WP). - Yoast: `wpseo_title`, `wpseo_opengraph_title`, `wpseo_twitter_title` (y metadescription si procede). Aplicar `fea_title()` a la parte del título del post. 3. **Cubrir RSS:** filtro `the_title_rss` → `fea_title()`. 4. **Multiidioma:** `fea_title()` ya funciona en FR/IT/PT (solo capitaliza la inicial). No requiere lógica por idioma. 5. **Mantener `is_admin()` excluido.** ### Mejora opcional de `fea_title()` (casos peligrosos) Al pasar el single por `fea_title()`, se hace más visible un defecto del sentence case naïve con **títulos compuestos**, sobre todo **citas bíblicas que son el propio título**: - `ISAÍAS 5, 1-7 / FILIPENSES 4, 6-9` → hoy quedaría `Isaías 5, 1-7 / filipenses 4, 6-9` (la 2ª parte tras `/` en minúscula). - También nombres propios y siglas se pierden (`MARIA CLARA BINGEMER` → `Maria clara bingemer`), pero **es el mismo criterio que ya se aplica y aprueba en la portada**, así que se acepta salvo que se quiera afinar. Mejora recomendable (no bloqueante): que `fea_title()` **capitalice también la primera letra tras separadores** (`/`, `:`, `–`, `«`, `¿`, `¡`, `"`). Eso arregla las citas bíblicas dobles sin meterse en detección de nombres propios. Si se quiere ir más allá, mantener una lista corta de siglas/acrónimos a preservar — pero eso ya es opcional. --- ## Plan de implementación 1. Editar el filtro `the_title` en `fea-homepage.php` para incluir el single (mantener admin fuera). 2. Añadir filtros `document_title_parts`, `the_title_rss` y los `wpseo_*` aplicando `fea_title()`. 3. (Opcional) Mejorar `fea_title()` para capitalizar tras separadores. 4. Probar en local: artículo individual, listados, búsqueda, RSS (`/feed/`), `<title>` de la pestaña, y un título con cita bíblica doble. 5. **Deploy a prod** (`/web/wp-nuevo`): subir el mu-plugin (scp NO va → `ssh '... cat > ruta'`; sin `proc_open`). Verificar server-side o con Rafa (Cloudflare bloquea headless). ## Ficheros y referencias - `wordpress/wp-content/mu-plugins/fea-homepage.php` — filtro `the_title` (L51), `fea_title()` (L675). - Plantilla single FSE: `wp_posts` ID **42359**. - Yoast SEO está activo (plugins del proyecto). ## Criterios de aceptación - [ ] El título en la **vista del artículo** se muestra en sentence case (no en mayúsculas). - [ ] El `<title>` de la pestaña / SEO y los feeds RSS también en sentence case. - [ ] Listados, archivos, búsqueda y portada se mantienen correctos (sin regresiones). - [ ] El wp-admin sigue mostrando el título tal cual (en mayúsculas) para edición. - [ ] No se modifica la BD (enfoque reversible). - [ ] (Si se hace la mejora) las citas bíblicas dobles tipo `ISAÍAS 5,1 / FILIPENSES 4,6` se capitalizan bien en ambas partes.
rafa closed this issue 2026-06-28 19:14:23 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#87