Esiste un modo per sovrascrivere il tag <title> specificato in header.php?
Innanzitutto questa non è una domanda SEO né una domanda su come modificare il tag title in tutto il sito. Se cerchi su Google la mia domanda, troverai solo quelle risposte.
Quindi abbiamo il nostro tema personalizzato e abbiamo il controllo completo su header.php. Sappiamo come impostare il titolo. Attualmente è così:
<head>
<title><?php wp_title(' | ', true, 'right'); bloginfo('name'); ?></title>
etc...
No, il problema è questo. Per la maggior parte delle pagine vogliamo che il titolo appaia come sopra. Ma ci siamo resi conto che per un particolare custom post type (e il suo template associato) il titolo del CPT non dovrebbe essere mostrato pubblicamente. È solo per uso amministrativo. Strano, ma è così. Non lo mostriamo da nessuna parte nel template, né nell'H1, né nel contenuto, ecc.
Ma viene mostrato nel title.
Idealmente vorremmo un modo per sovrascrivere il titolo di header.php direttamente dal template, per specificare un titolo alternativo solo per questo particolare gruppo di pagine. È possibile?

Innanzitutto, modifichiamo il tuo tag <title>
in:
<title><?php wp_title(' | ', true, 'right'); ?></title>
Perché aggiungere stringhe al titolo in quel modo non è molto orientato al futuro, è invece meglio utilizzare un filtro per apportare modifiche al titolo. Quindi aggiungiamo (nel file functions.php):
add_filter('wp_title', 'my_custom_title');
function my_custom_title( $title )
{
// Restituisce il titolo personalizzato
return sprintf("%s %s", $title, get_bloginfo('name'));
}
Ora estendiamo questo utile filtro per il titolo per fare ciò che desideri ottenere:
add_filter('wp_title', 'my_custom_title');
function my_custom_title( $title )
{
if( is_singular("your_post_type"))
{
return ""; // Restituisce vuoto
}
// Restituisce il titolo personalizzato
return sprintf("%s %s", $title, get_bloginfo('name'));
}

Ho pubblicato questa risposta per un'altra domanda ma poiché è rilevante e più aggiornata, ho pensato che potesse essere utile per alcune persone.
Il modo in cui viene generato il titolo del documento è cambiato dalla versione 4.4.0 di WordPress. Ora è wp_get_document_title
a determinare come viene generato il titolo:
/**
* Visualizza il tag del titolo con il contenuto.
*
* @ignore
* @since 4.1.0
* @since 4.4.0 Migliorata l'output del titolo sostituendo `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 rimosso ---
/**
* 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 di pagina se paginato.
* @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 rimosso ---
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
a seconda della 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 );

Combinando diverse risposte, ecco cosa ha funzionato per me su WordPress v5.7.2
e il mio custom post type company
. Sono riuscito a sovrascrivere facilmente il titolo nella pagina del custom post per aggiungere il Nome del Sito alla fine
function custom_document_title( $title ) {
if( is_singular("company"))
{
return sprintf("%s - %s", $title, get_bloginfo('name'));
}
return $title; // Ritorna il titolo predefinito negli altri casi
}
add_filter( 'pre_get_document_title', 'custom_document_title', 99 );

La versione precedente non funzionava per me in WordPress 6.1.1 poiché restituiva un $title vuoto. Questa versione restituisce il titolo della pagina + il nome del blog o qualsiasi testo personalizzato tu voglia.
function custom_document_title( $title ) {
global $post;
$title = get_the_title($post);
if( is_singular("event")){
return sprintf("%s - %s", $title, 'Registrazione Evento');
} else {
// Restituisce il titolo standard di Wordpress
return sprintf("%s - %s", $title, get_bloginfo('name'));
}
}
add_filter( 'pre_get_document_title', 'custom_document_title', 99 );
