Cómo eliminar el #038; al reemplazar cadenas en el contenido
Estoy intentando añadir algunos reemplazos de cadenas a the_title() -
function format_title($content) {
$content = str_replace('&','&<br>', $content); // Reemplazar & con salto de línea
$content = str_replace('!','!<br>', $content); // Reemplazar ! con salto de línea
return $content;
}
add_filter('the_title','format_title',11);
Cuando intento reemplazar los símbolos de "y" (&) obtengo un "#038;" adicional después del reemplazo (código ASCII para &), no estoy seguro de por qué ocurre esto (¿razón de seguridad?) o cómo crear una solución alternativa. He intentado reemplazar "&" con "& amp ;" pero sin efecto.
El objetivo es añadir saltos de línea en ciertos puntos de un título para crear un mejor flujo en la tipografía. Tanto la base de datos como el sitio tienen codificación UTF8.

&
es esencialmente sinónimo de &
. En el filtro the_title
, wptexturize()
se ejecuta con prioridad 1
(¡importante!) y realiza este reemplazo.
Así que para cuando llega a tu función format_title()
con prioridad 11
, en lugar de reemplazar el símbolo &
solitario, estás reemplazando (y rompiendo) la entidad de carácter &
.
Por lo tanto, puedes:
- mover tu función a prioridad
0
para que se ejecute antes de texturize - dejar la prioridad en
11
pero reemplazar$#38;
en lugar de solo&

Esto también puede ser causado por esc_url
. Deberías usar esc_url_raw
en su lugar, en este escenario.
esc_url
tiene este fragmento de código:
// Reemplaza ampersands y comillas simples solo cuando se muestra.
if ( $_context === 'display' ) {
$url = wp_kses_normalize_entities( $url );
$url = str_replace( '&', '&', $url ); <!-- ¡Mira esta línea!
$url = str_replace( "'", ''', $url );
}
Lo que hace esc_url_raw
es simplemente llamar a esc_url
y saltarse ese condicional pasando un contexto diferente como argumento.
