Come eliminare #038; quando si sostituiscono stringhe nel contenuto
Sto cercando di aggiungere alcune sostituzioni di stringa a the_title() -
function format_title($content) {
// Sostituisce & con & seguito da un break line
$content = str_replace('&','&<br>', $content);
// Sostituisce ! con ! seguito da un break line
$content = str_replace('!','!<br>', $content);
return $content;
}
add_filter('the_title','format_title',11);
Quando provo a sostituire gli ampersand ottengo un "#038;" aggiuntivo dopo la sostituzione (ASCII per ampersand), non sono sicuro del perché questo accada (motivi di sicurezza?) o come creare una soluzione alternativa. Ho provato a sostituire "&" con "& amp ;" ma senza effetto.
L'obiettivo è aggiungere interruzioni di riga in certi punti di un titolo per creare un migliore flusso nella tipografia. Sia il database che il sito hanno codifica UTF8.

&
è essenzialmente un sinonimo di &
. Nel filtro the_title
, wptexturize()
viene eseguito con priorità 1
(importante!) e effettua questa sostituzione.
Quindi quando arriva alla tua funzione format_title()
con priorità 11
, invece di sostituire il singolo simbolo &
, stai sostituendo (e rompendo) l'entità carattere &
.
Puoi dunque:
- spostare la tua funzione a priorità
0
e verrà eseguita prima di texturize - mantenere la priorità a
11
ma sostituire$#38;
invece del semplice&

Questo può anche essere causato da esc_url
. In questo scenario, dovresti usare esc_url_raw
invece.
esc_url
contiene questo pezzo di codice:
// Sostituisce le e commerciali e gli apici singoli solo durante la visualizzazione.
if ( $_context === 'display' ) {
$url = wp_kses_normalize_entities( $url );
$url = str_replace( '&', '&', $url ); <!-- Guarda questa riga!
$url = str_replace( "'", ''', $url );
}
Ciò che fa esc_url_raw
è semplicemente chiamare esc_url
e saltare quel condizionale passando un contesto diverso come argomento.
