Impossibile modificare wp_title utilizzando add_filter

12 feb 2011, 13:31:59
Visualizzazioni: 22.8K
Voti: 10

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?

1
Commenti

Se desideri modificare solo il titolo per un template specifico, credo sarebbe più appropriato chiamare la tua funzione personalizzata per il titolo al posto di wp_title nel markup del template.

Steve Buzonas Steve Buzonas
27 dic 2011 21:51:50
Tutte le risposte alla domanda 3
3
20

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' );
28 mag 2016 07:09:03
Commenti

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.

amurrell amurrell
27 ott 2018 02:20:49

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

GreatBlakes GreatBlakes
9 lug 2020 17:16:55

@GreatBlakes Questo è ancora valido nel mio caso. A marzo 2022, document_title_parts ha funzionato per me mentre wp_title no.

Clarus Dignus Clarus Dignus
25 mar 2022 02:08:56
3

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;  
  }
12 feb 2011 15:16:19
Commenti

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?

Steven Steven
13 feb 2011 15:01:38

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

Steven Steven
13 feb 2011 17:39:41

Devi inserire questa funzione nel tuo file function.php che si trova nella directory del tuo tema!

keatch keatch
13 feb 2011 18:22:29
0

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.

27 dic 2011 21:49:28