Impossibile modificare wp_title utilizzando add_filter
Ho una pagina personalizzata dove sto cercando di modificare il titolo della pagina.
La funzione viene eseguita, ma il titolo non viene modificato. Questo è il codice che sto utilizzando:
add_filter('wp_title', set_page_title($brand));
function set_page_title($brand) {
$title = 'Designer '.$brand['name'].' - '.get_bloginfo('name');
//Qui posso fare l'echo del risultato e vedere che viene effettivamente attivato
return $title;
}
Quindi perché questo non funziona? Sto usando add_filter in modo errato?

Il filtro wp_title
è deprecato da WordPress 4.4 (vedi qui). Puoi utilizzare document_title_parts invece
function custom_title($title_parts) {
$title_parts['title'] = "Titolo Pagina";
return $title_parts;
}
add_filter( 'document_title_parts', 'custom_title' );
Nel filtro custom_title
, $title_parts
contiene le chiavi 'title', 'page' (la paginazione, se presente), 'tagline' (il motto specificato, solo nella homepage) e 'site'. Imposta "title" come preferisci. WordPress manterrà il formato configurato per poi concatenare tutto insieme.
Se vuoi sovrascrivere la formattazione del titolo di WordPress, utilizza pre_get_document_title e fornisci a quel filtro una funzione che accetta una stringa e restituisce il titolo desiderato.
function custom_title($title) {
return "Titolo Pagina";
}
add_filter( 'pre_get_document_title', 'custom_title' );

wp_title
è stato ripristinato. Seguendo il link sopra, troverai il commento: AGGIORNAMENTO 12 novembre [2017] - wp_title è stato ripristinato finché non verranno identificate soluzioni alternative e definito un percorso per il loro utilizzo.

A partire da luglio 2020 document_title_parts
ha funzionato per me mentre wp_title
no.

Non puoi passare un array a set_page_title, la callback del filtro accetta solo il titolo originale come parametro di input.
Se vuoi che la tua funzione funzioni in questo modo, definisci l'array $brand fuori dalla funzione e rendilo globale
add_filter( 'wp_title', 'set_page_title' );
$brand = array( 'name' => 'Brand Name' );
function set_page_title( $orig_title ) {
global $brand;
$title = 'Designer '.$brand['name'].' - '.get_bloginfo( 'name' );
//Qui posso visualizzare il risultato e verificare che venga effettivamente attivato
return $title;
}

Quando faccio questo, la funzione non viene chiamata affatto. Ho anche provato add_filter('wp_title', 'set_page_title');
L'unico modo per chiamare la funzione è fare questo: add_filter('wp_title', set_page_title('test'));
. Qualche motivo per cui non riesco a chiamare la funzione nel tuo modo?

Penso di sapere perché. Potrebbe essere perché sto cercando di usare add_filter
dentro custom_template.php
e non nel mio function.php
?

In entrambi gli esempi di codice, ciò che accade è che add_filter non sta chiamando una funzione per accettare un valore di ritorno come nuovo titolo. La funzione add_filter si aspetta almeno due parametri: il primo è una stringa che contiene il 'tag' o il nome del filtro che si desidera utilizzare, e il secondo è di tipo misto. Nel caso di utilizzo di una funzione definita, si dovrebbe usare il nome della funzione come stringa; può anche accettare un array per un callback all'interno di un namespace, e una funzione anonima.
Nel caso di:
add_filter('wp_title', set_page_title('test'));
La funzione più interna verrà valutata per prima, passando i suoi risultati di ritorno alla funzione più esterna.
Quindi...
add_filter('wp_title', set_page_title(other_function(function() {return "real_filter";})));
Passerebbe la stringa 'real_filter' a add_filter, assumendo che tutte le funzioni intermedie passino i loro parametri di input come valore di ritorno.
Credo che quello che vorresti ottenere sia qualcosa del tipo:
function my_title_filter($old_title, $sep, $seplocation) {
// Aggiungi del codice per determinare se/cosa vuoi modificare nel tuo titolo.
global $brand;
$title = "Designer " . $brand['name'] . " $sep " . get_bloginfo('name');
return $title;
}
add_filter('wp_title', 'my_title_filter', 10, 3); // 10 è la priorità,
// e 3 è il numero di argomenti che la funzione accetta.
// wp_title può passarne 3.
Un'ulteriore avvertenza... Il filtro deve essere inizializzato prima che venga chiamato apply_filters. La migliore pratica è definire la propria funzione prima di chiamare add_filter.
