Problemi con il tag del titolo e document_title_parts


12

Wordpress version 4.5.1

Sto cercando di aggiornare dinamicamente i titoli delle pagine su un modello particolare. Dopo aver scavato e imparato molto sui wp_title()cambiamenti, sto tentando di usarli document_title_parts. Tuttavia, non riesco affatto a far funzionare il filtro.

Sono in tema di un bambino functions.php:

add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });

add_filter( 'document_title_parts', function( $title )
{
    error_log('here');
    return $title;

}, 10, 1 );

Ho provato entrambe le varianti dell'aggiunta del supporto per i temi come mostrato sopra, ma guardando il mio registro, non viene visualizzato nulla al caricamento della pagina. Che error_logè stato lavorare con altre funzioni (come wp_title), quindi la registrazione degli errori funziona.

Ho anche provato pre_get_document_title, che si attiva al caricamento della pagina, anche se non riesco a farlo cambiare effettivamente il titolo.

Così! O sto usando il filtro sbagliato, non ho impostato correttamente il mio tema o qualcos'altro di cui non sono a conoscenza. Qualsiasi aiuto sarebbe molto apprezzato!

modifica per aggiungere maggiori dettagli

Tentativo di una funzione init, ma anche questo non funziona: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Inoltre, mentre ho rimosso qualsiasi riferimento a <title>da header.php, il titolo del sito effettivo viene ancora visualizzato nella fonte.


Perché hai commentato questa riga //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? È un uso corretto dell'aggiunta del supporto per i temi.
Summit

@Sumit Ho provato sia la versione commentata che la versione attiva.
hookedonwinter,

Forse prova ad aggiungere la add_theme_support()funzione in un hook init . Un'altra cosa è assicurarti di sovrascrivere il tuo header.phpfile per non avere un <title>tag html .
Howdy_McGee

@Howdy_McGee Ci ho appena provato, ancora niente. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter

@hookedonwinter E sei sicuro che non ci siano <title>tag nel tuo header.php? Forse prova a sostituirlo 10con PHP_MAX_INT. Inoltre, il parametro passato è un array anziché un valore di stringa.
Howdy_McGee

Risposte:


13

Ho eseguito il filtro nella mia area di sviluppo. Non ha funzionato Quindi ho disattivato il plug-in Yoast SEO, che sapevo anche incasinare il titolo della pagina. Quindi ha funzionato. Quindi il mio suggerimento è che un altro plugin lo stia rovinando.

Nel caso di Yoast, si trattava di una chiamata di filtro al pre_get_document_titleritorno non vuota. In tal caso wp_get_document_titleviene cortocircuitato e il resto della funzione, incluso il documents_title_partsfiltro, non viene valutato, come si può vedere dalle prime righe di codice:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
    }

Quindi, ho preso il tuo filtro e ho cambiato il gancio in pre_get_document_title. Non ha funzionato Quindi ho cambiato la priorità a un livello superiore rispetto allo stesso filtro in Yoast. Quindi ha funzionato. Quindi, non so del tuo set-up, ma ti suggerisco di provare questo:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );

1
Avete capito bene! Ho trovato la stessa cosa e disattivato Yoast. Ho appena riattivato e usato la tua priorità e ha funzionato. GRAZIE!
hookedonwinter


Dal mio sito, la pre_get_document_titlepriorità 15 è sufficiente.
V,

7

Dopo alcuni esperimenti sono arrivato al seguente suggerimento: potrebbe essere che il <title>tag sia "hard coded" all'interno del tema del tuo genitore header.php? In tal caso, potresti provare a rimuovere il <title>tag dal tema del tuo bambino header.php(copia il tuo genitore header.phpnella cartella del tema del tuo figlio) e quindi aggiungere nuovamente il supporto del tema attraverso functions.php:

add_theme_support( 'title-tag' );

Proverò a spiegare cosa mi ha portato a questo suggerimento: ho provato come tu e altri avete suggerito - ma ho scoperto che ho trovato due <title>tag nel codice sorgente. Il primo aveva il titolo standard , il secondo il titolo modificato . Ma (ovviamente) nella barra del titolo del browser ho potuto vedere solo il titolo predefinito.

Ho quindi controllato il header.phptema genitore che ho usato (ventiquattro) e il <title>tag era effettivamente codificato all'interno di quel modello in questo modo:

<title><?php wp_title( '|', true, 'right' ); ?></title>

Dopo averlo rimosso, ho aggiunto il seguente codice al tema figlio functions.phpe ha funzionato:

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {

    // change title parts here
    $title['title'] = 'My Title'; 
    $title['tagline'] = 'My fancy tagline'; // optional
    $title['site'] = 'example.org'; //optional

// }

return $title; 

}

add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );

Quindi, in pratica, ha funzionato anche prima di rimuovere il <title>tag dal modello, solo che c'erano poi due <title> tag di cui il successivo è stato ignorato. Potrebbe essere lo stesso problema con il tuo tema?

A partire da wp 4.4.0, tuttavia, il <title>tag viene creato dinamicamente dalla funzione _wp_render_title_tag()che sostanzialmente chiama un'altra funzione wp_get_document_title()e avvolge i tag html attorno al risultato. Per farla breve: se il tuo tema non ha header.phpil <title>tag, è probabile che tu possa ignorare il titolo direttamente attraverso pre_get_document_titleo document_title_partscome descritto qui :

1) cambia direttamente il titolo:

add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
    return 'The expected title';
}

2) filtraggio delle parti del titolo:

add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
    return array('a', 'b', 'c');
}

3

Dopo aver letto il tuo post dall'alto verso il basso e dal basso verso l'alto, hai con tutta probabilità un filtro che passa un titolo attraverso il pre_get_document_titlefiltro. L'indizio qui la seguente dichiarazione:

Ho anche provato pre_get_document_title, che si attiva al caricamento della pagina,

Guardando il codice soure perwp_get_document_title() , vediamo il seguente codice:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

Ciò significa che, ogni volta che un valore non vuoto passa attraverso il pre_get_document_titlefiltro, la wp_get_document_title()funzione restituirà qualsiasi valore che è stato passato attraverso il pre_get_document_titlefiltro. In questo caso, il document_title_separatorfiltro e il document_title_partsfiltro non verranno mai eseguiti poiché vengono eseguiti solo dopo il pre_get_document_titlefiltro.

Guardando quello che hai detto un po 'più avanti:

... anche se non riesco a farlo cambiare effettivamente il titolo.

hai sicuramente un pre_get_document_titlefiltro con autorità che sta sovrascrivendo la tua istanza dello stesso filtro e, a causa di questo filtro, la funzione restituisce tutto ciò che gli viene passato, il che comporta la document_title_partsmancata esecuzione del filtro.

Quello che dovrai fare è usare uno grepo un buon editor e cercare wp-contentquel pre_get_document_titlefiltro nella tua intera cartella . Una volta individuato quel filtro, puoi prenderlo da lì per rimuovere quel filtro e sostituirlo con il tuo


Grazie per la risposta! Sfortunatamente, la ricerca di tutto il contenuto di wp document_title_partso pre_get_document_titlerestituisce 0 risultati. Sto usando SublimeText 2 per cercare tutto il contenuto di wp ...
hookedonwinter

Questo mi batte davvero. È davvero strano che un filtro in una funzione si attivi correttamente e il filtro dopo non lo faccia. Prova a cancellare tutte le cache e reinstalla WordPress se sei sicuro che non sia un plugin o il tuo tema. Cosa succede in un'installazione vanilla con un tema in bundle, cosa succede se si modifica direttamente il tema principale. Questo è purtroppo per quanto posso aiutare con le informazioni fornite. Se hai ulteriori informazioni, invia una modifica in modo che possiamo aiutarti a risolverlo
Pieter Goosen,

@PieterGoosen Quando il primo filtro ritorna non vuoto, la funzione viene cortocircuitata e il secondo filtro non viene valutato.
cjbj,

@cjbj sì, giusto, questo è quello che ho detto nella mia risposta, il problema è cosa. Come ha detto l'OP, non riesce a trovare un filtro pre_get_document_title, cosa avrebbe spiegato totalmente perché il secondo filtro non si sarebbe attivato. Questo lascia il pre_get_document_titlefiltro vuoto, il che significa che gli altri due filtri nella funzione devono attivarsi, ma non lo fanno. Mi lascia concludere un core di Wordpress corrotto.
Pieter Goosen,

Solo che ho fatto in modo che quel filtro funzionasse facilmente.
cjbj,

2

Se il tema principale non dichiara il supporto per title-tagte, puoi farlo in questo modo nel tema figlio

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );

Filtrare l' document_title_partsarray del tipo di ritorno previsto, in questo modo, assicurarsi di modificare la condizione if in base alle proprie esigenze o rimuoverla completamente per modificare il titolo in tutto il sito solo per verificare se funziona.

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title['title'] - Page Title
 * $title['tagline'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is 'template-homepage.php'
    if ( is_page_template( 'template-homepage.php' ) ) {
        $title['title'] = 'Changed title for a template';
    }

    return $title;

}

add_filter( 'document_title_parts', 'change_title_for_a_template' );

Puoi provare queste due funzioni?


Grazie per la risposta. L'ho provato, rimuovendo l'istruzione if per renderla più ampia e ho aggiunto alcuni errori di registrazione per vedere cosa succede. Ecco il codice. . È add_theme_support_childregistrato solo.
hookedonwinter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.