add_theme_support( 'title-tag' ) in conflitto con la funzione dei titoli personalizzati

3 feb 2015, 16:47:51
Visualizzazioni: 23.5K
Voti: 4

'Title-tag' è una funzionalità del tema introdotta nella Versione 4.1, e voglio utilizzarla come titolo predefinito del mio tema. Questa funzionalità dovrebbe essere aggiunta nell'azione after_setup_theme o init. È raccomandato qui. L'uso di questa funzionalità funziona perfettamente per me. MA:

Inoltre, ho una funzione per i titoli personalizzati che può essere abilitata/disabilitata utilizzando il framework Option-Tree. Questo framework viene caricato direttamente in functions.php. Quindi, ho il resto delle funzioni aggiunte su after_setup_theme con priorità 2:

add_action( 'after_setup_theme', 'theme_functions', 2);

E questo è il filtro aggiunto per i miei titoli personalizzati:

add_filter( 'wp_title', 'custom_titles', 10, 2 );

Quando disabilito la mia funzione custom_titles(), la nuova funzionalità title-tag funziona perfettamente, ma quando abilito quella personalizzata, restituisce il titolo due volte. Esattamente così:

<title>Esempio di meta titolo della pagina iniziale</title>

Esempio di meta titolo della pagina iniziale<title></title>

Il primo è corretto e sta utilizzando la funzione wp_title() inserita nel header.php tra i tag title, ma il secondo è incluso alla prima riga della funzione wp_head().

In effetti, la mia funzione custom_titles() funzionava perfettamente senza l'uso della nuova funzionalità title-tag. Quindi sembra che il conflitto appaia quando provo a utilizzare entrambi.

Pensate che sarebbe una buona soluzione mettere entrambe le funzionalità in after_theme_setup con priorità 1 in una semplice istruzione condizionale, o c'è un modo migliore per farlo? Sembra che la soluzione dovrebbe essere più semplice.


AGGIORNAMENTO: Questo è assurdo. Se rimuovo i tag title dall'header per utilizzare la nuova funzionalità, il theme-check restituisce:

RICHIESTO: Il tema deve avere i tag title, idealmente nel file header.php.

Se rimuovo la nuova funzionalità per utilizzare la mia funzione personalizzata, il theme-check restituisce:

RACCOMANDATO: Non è stato trovato alcun riferimento a add_theme_support( "title-tag" ) nel tema. Si raccomanda che il tema implementi questa funzionalità per WordPress 4.1 e versioni successive.

Ad essere onesti: LOL. Aggiungendo add_theme_support in functions.php, e i tag title in header.php come «RACCOMANDANO» e «RICHIEDONO», rispettivamente, restituisce sempre il titolo due volte!

2
Commenti

Un suggerimento: quando utilizzi il supporto per il 'title-tag', puoi vedere il codice sorgente di function wp_get_document_title() - ci sono i seguenti filtri (WP 4.7.3): pre_get_document_title, document_title_separator e document_title_parts. Il primo ti dà il controllo completo sul titolo, invece del filtro specificato wp_title nella tua domanda, che ora sembra obsoleto e molto presto potrebbe essere deprecato.

Minister Minister
21 apr 2017 10:54:25
Tutte le risposte alla domanda 2
7

Il tuo problema è che non puoi utilizzare wp_title() nel tema se il tema supporta già title-tag. La sezione <head> del tuo tema dovrebbe essere così:

<head>
    <meta charset="<?php bloginfo( 'charset' ); ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <?php wp_head(); ?>
</head>

Il filtro e il supporto per title-tag:

add_action( 'after_setup_theme', 'theme_functions' );
function theme_functions() {

    add_theme_support( 'title-tag' );

}

add_filter( 'wp_title', 'custom_titles', 10, 2 );
function custom_titles( $title, $sep ) {

    //Verifica se i titoli personalizzati sono abilitati dal tuo framework di opzioni
    if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
        //Un semplice esempio
        $title = "Altro titolo" . $title;;
    }

    return $title;
}

Se segui queste indicazioni, funzionerà perfettamente.

3 feb 2015 18:52:23
Commenti

Capisco. Grazie. Sapevo che doveva essere più semplice... Penso che il mio errore fosse nella funzione dei titoli personalizzati, senza chiamare le variabili $title e $sep. Lasciami provare :)

Unix Unix
3 feb 2015 18:58:06

Ho aggiunto il controllo dell'opzione enable_custom_titles.

cybmeta cybmeta
3 feb 2015 18:59:19

È meglio usare il controllo all'interno della funzione?

Unix Unix
3 feb 2015 19:02:48

C'è un problema: in questa funzione non salvo i titoli nelle variabili, uso le funzioni quando è possibile, come the_title(); o single_tag_title();... E nelle variabili quando è necessario, ad esempio nelle meta-box: $metatitle = get_post_meta($post->ID, 'metabox_title_tag', true);. Come posso risolverlo?

Unix Unix
3 feb 2015 19:06:47

Ok, dovrò modificare la mia funzione custom_titles() per ottenere tutti i valori nelle variabili. La mia soluzione era più veloce, ma la tua risposta è la strada giusta e posso saltare alcune istruzioni condizionali.

Unix Unix
3 feb 2015 19:21:02

the_title(), single_tag_title() e simili sono tag template, cioè funzioni pensate per essere usate nei file template, non per ottenere informazioni al di fuori dei file template. Ad esempio, se vuoi mostrare il titolo di un post in un file template puoi usare the_title() all'interno del loop; se vuoi ottenere il titolo di un post al di fuori di un file template potresti usare get_the_tile( $post_ID ) o un oggetto post restituito da get_post, WP_Query, ecc. Se hai bisogno di aiuto con questo, per favore, apri un'altra domanda.

cybmeta cybmeta
3 feb 2015 19:33:54

Questa risposta va nella direzione giusta, ma i filtri moderni dovrebbero utilizzare document_title_parts o pre_get_document_title ... vedi questa discussione: https://wordpress.stackexchange.com/questions/305353/cant-change-the-title-tag-with-wp-title-filter

Jesse Nickles Jesse Nickles
23 mag 2023 23:30:14
Mostra i restanti 2 commenti
0

Ho trovato una soluzione, quindi sono sicuro che sarà utile anche per altri.


Primo: titoli personalizzati

Spiegazione: Se la mia funzione custom_titles() è abilitata, carico la funzione in functions.php con priorità 2 sotto after_theme_setup, e mostro i tag title nel file header.php.

In functions.php:

if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
    // La funzione per i titoli personalizzati
}

In header.php:

<?php if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) : ?>
<title><?php wp_title( '|', true, 'right' ); ?></title>
<?php endif; ?>

<!-- Il seguente codice restituirà la nuova funzionalità dei titoli di WP se i titoli personalizzati sono disattivati -->
<?php wp_head(); ?>

Secondo: supporto per title-tag

Spiegazione: Se la mia funzione custom_titles() è disabilitata, aggiungo add_theme_support('title-tag'); in functions.php con priorità 1 sotto after_theme_setup.

Quindi, in functions.php:

if ( ot_get_option( 'enable_custom_titles' ) === 'off' ) {
    add_theme_support( 'title-tag' );
}

Riguardo alla priorità di after_theme_setup, nel mio caso è necessaria solo per caricare il framework Option-Tree prima di utilizzare la funzione ot_get_option(), quindi potrebbe essere diversa —o non necessaria— se qualcuno utilizza un framework di opzioni diverso.

Ora il mio tema ha la nuova funzionalità dei titoli della versione 4.1 e i titoli personalizzati per SEO utilizzando meta-box: entrambi disponibili. (So che è territorio da plugin, ma è bello avere alcune funzionalità essenziali —«essenziali» secondo me— integrate nel tema). Grazie a questo, i clienti avranno più controllo su come i titoli vengono visualizzati.

3 feb 2015 18:47:18