Come modificare il separatore nel titolo
Modificare il separatore del titolo.
Sto lavorando con il tema starter Underscores. Voglio apportare una piccola modifica al titolo, cambiando il separatore da "Titolo articolo | nome sito" a "Titolo articolo - nome sito".
Il modo più semplice per farlo era inserire:
<title><?php wp_title('-', true, 'right' ); ?><?php bloginfo( 'name' ); ?></title>
nell'header. Ma ora ho letto che con l'introduzione di add_theme_support( 'title-tag' );
non si dovrebbe usare il markup <title>
nell'header.
Quindi c'è un modo semplice per modificare il separatore nel titolo?
Perché questa domanda è diversa da altre simili:
Si tratta veramente delle best practice, dall'introduzione di add_theme_support( 'title-tag' );
e di come usarlo e modificarlo, dato che non dovremmo più usare il tag <title>
nell'header.
[Spero davvero di non dover scrivere 8 righe di codice per una modifica così piccola.
Se decido alla fine di usare il tag <title>
come soluzione più diretta, dovrei commentare/rimuovere add_theme_support( 'title-tag' );
da functions.php?]

AGGIORNAMENTO per WordPress 4.4
A partire da WordPress 4.4 il filtro wp_title
non funziona più perché la funzione wp_title()
non viene più utilizzata nel core. Questa funzione è stata contrassegnata come deprecata, poi ripristinata fino a nuovo avviso ma gli autori di temi sono scoraggiati dal suo utilizzo. Per questo motivo, il filtro wp_title
continuerà a funzionare se utilizzerai direttamente la funzione wp_title()
nel tuo tema, ma non è raccomandato.
Ci sono nuovi filtri per personalizzare il titolo del documento quando il supporto per title-tag
è abilitato nel tema:
Se vuoi solo personalizzare il separatore, puoi usare document_title_separator
in questo modo:
add_filter( 'document_title_separator', 'cyb_document_title_separator' );
function cyb_document_title_separator( $sep ) {
$sep = "-";
return $sep;
}
Risposta precedente
Puoi usare il filtro wp_title
per personalizzare il tag <title>
.
add_filter( 'wp_title', 'customize_title_tag', 10, 3 );
function customize_title_tag( $title, $sep, $seplocation ) {
// Personalizza $title qui.
// Esempio preso da https://generatepress.com/forums/topic/title-tag-separator/
$title = str_replace( '|', '-', $title );
return $title;
}
Un esempio più complesso di come usare questo filtro (tratto dal tema TwentyTwelve):
function twentytwelve_wp_title( $title, $sep ) {
global $paged, $page;
if ( is_feed() )
return $title;
// Aggiunge il nome del sito.
$title .= get_bloginfo( 'name' );
// Aggiunge la descrizione del sito per la home/front page.
$site_description = get_bloginfo( 'description', 'display' );
if ( $site_description && ( is_home() || is_front_page() ) )
$title = "$title $sep $site_description";
// Aggiunge un numero di pagina se necessario.
if ( $paged >= 2 || $page >= 2 )
$title = "$title $sep " . sprintf( __( 'Pagina %s', 'twentytwelve' ), max( $paged, $page ) );
return $title;
}
add_filter( 'wp_title', 'twentytwelve_wp_title', 10, 2 );

Grazie. Ho verificato. Il problema è che TwentyTwelve non utilizza add_theme_support( 'title-tag' );
che tra l'altro è ora richiesto come best practice. Utilizza la sua funzione personalizzata e <title></title?>
nell'header.php (cosa che non è più consentita). E credo che questa specifica funzione non modifichi il separatore.

Era solo un esempio di come puoi usare il filtro wp_title
per personalizzare l'output del tag title, non importa se il tema supporta title-tag o utilizza la funzione wp_title()
, il filtro funziona per entrambi.

wp_title()
non è deprecata, è stata ripristinata fino a nuovo avviso. Sì, non è più consigliato utilizzarla, ma non è deprecata

Oh, sì, è stata ripristinata, non lo sapevo. Ma, comunque, il filtro wp_title
non funziona se non usi direttamente la funzione wp_title()
.

Il modo in cui viene generato il titolo del documento è cambiato a partire da WordPress v4.4.0. Ora è wp_get_document_title
a determinare come viene generato il titolo:
/**
* Mostra il tag title con il contenuto.
*
* @ignore
* @since 4.1.0
* @since 4.4.0 Miglioramento dell'output del titolo che ha sostituito `wp_title()`.
* @access private
*/
function _wp_render_title_tag() {
if ( ! current_theme_supports( 'title-tag' ) ) {
return;
}
echo '<title>' . wp_get_document_title() . '</title>' . "\n";
}
Ecco il codice dalla versione 5.4.2. Questi sono i filtri che puoi utilizzare per manipolare il tag del titolo:
function wp_get_document_title() {
/**
* Filtra il titolo del documento prima che venga generato.
*
* Passare un valore non vuoto interromperà wp_get_document_title(),
* restituendo quel valore invece.
*
* @since 4.4.0
*
* @param string $title Il titolo del documento. Valore predefinito stringa vuota.
*/
$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
return $title;
}
// --- codice omesso ---
/**
* Filtra il separatore per il titolo del documento.
*
* @since 4.4.0
*
* @param string $sep Separatore del titolo del documento. Predefinito '-'.
*/
$sep = apply_filters( 'document_title_separator', '-' );
/**
* Filtra le parti del titolo del documento.
*
* @since 4.4.0
*
* @param array $title {
* Le parti del titolo del documento.
*
* @type string $title Titolo della pagina visualizzata.
* @type string $page Opzionale. Numero della pagina se paginata.
* @type string $tagline Opzionale. Descrizione del sito nella home page.
* @type string $site Opzionale. Titolo del sito quando non nella home page.
* }
*/
$title = apply_filters( 'document_title_parts', $title );
// --- codice omesso ---
return $title;
}
Quindi ci sono due modi per farlo.
Il primo utilizza il filtro pre_get_document_title
che interrompe la generazione del titolo ed è quindi più performante se non devi apportare modifiche al titolo corrente:
function custom_document_title( $title ) {
return 'Ecco il nuovo titolo';
}
add_filter( 'pre_get_document_title', 'custom_document_title', 10 );
Il secondo modo utilizza gli hook document_title_separator
e document_title_parts
per il titolo e il separatore del titolo che vengono eseguiti più avanti nella funzione, dopo che il titolo è stato generato utilizzando funzioni come single_term_title
o post_type_archive_title
in base alla pagina e sta per essere visualizzato:
// La funzione personalizzata deve restituire una stringa
function custom_seperator( $sep ) {
return '>';
}
add_filter( 'document_title_separator', 'custom_seperator', 10 );
// La funzione personalizzata deve restituire un array
function custom_html_title( $title ) {
return array(
'title' => 'Titolo Personalizzato',
'site' => 'Sito Personalizzato'
);
}
add_filter( 'document_title_parts', 'custom_html_title', 10 );
