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.