Conflict între add_theme_support('title-tag') și funcția de titluri personalizate

3 feb. 2015, 16:47:51
Vizualizări: 23.5K
Voturi: 4

'Title-tag' este o funcționalitate pentru teme introdusă în Versiunea 4.1 și vreau să o folosesc ca titlu implicit pentru tema mea. Această funcționalitate trebuie adăugată în acțiunea after_setup_theme sau init. Este recomandat aici. Folosirea acestei funcționalități funcționează perfect pentru mine. DAR:

În plus, am o funcție personalizată pentru titluri care poate fi activată/dezactivată folosind framework-ul Option-Tree. Acest framework este încărcat direct în functions.php. Apoi, am restul funcțiilor adăugate în after_setup_theme cu prioritatea 2:

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

Și acesta este filtrul adăugat pentru titlurile mele personalizate:

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

Când dezactivez funcția mea custom_titles(), noua funcționalitate title-tag funcționează perfect, dar când activez pe cele personalizate, returnează titlul de două ori. Exact așa:

<title>Exemplu meta titlu pagina principala</title>

Exemplu meta titlu pagina principala<title></title>

Primul este corect și folosește funcția wp_title() inserată în header.php între tag-urile title, dar al doilea este inclus în prima linie a funcției wp_head().

De fapt, funcția mea custom_titles() a funcționat perfect fără utilizarea noii funcționalități title-tag. Deci se pare că conflictul apare când încerc să le folosesc pe ambele.

Credeți că ar fi o soluție bună să pun ambele funcționalități în after_theme_setup cu prioritatea 1 într-o simplă instrucțiune condițională, sau există o modalitate mai bună de a face asta? Se pare că soluția ar trebui să fie mai simplă.


ACTUALIZARE: Este nebunie. Dacă elimin tag-urile title din header pentru a folosi noua funcționalitate, theme-check returnează:

NECESAR: Tema are nevoie de tag-uri title, ideal în fișierul header.php.

Dacă elimin noua funcționalitate pentru a folosi funcția mea personalizată, theme-check returnează:

RECOMANDAT: Nu s-a găsit nicio referință la add_theme_support("title-tag") în temă. Este recomandat ca tema să implementeze această funcționalitate pentru WordPress 4.1 și versiunile ulterioare.

Sincer: LOL. Adăugând add_theme_support în functions.php, și tag-urile title în header.php așa cum «RECOMANDĂ» și «CER», respectiv, returnează întotdeauna titlul de două ori!

2
Comentarii

Un indiciu: Când folosești suportul pentru 'title-tag', poți vedea codul sursă al funcției function wp_get_document_title() - există următoarele filtre (WP 4.7.3): pre_get_document_title, document_title_separator și document_title_parts. Primul oferă control complet asupra titlului, în loc de filtrul specificat wp_title din întrebarea ta, care acum pare învechit și foarte curând ar putea deveni depreciat.

Minister Minister
21 apr. 2017 10:54:25
Toate răspunsurile la întrebare 2
7

Problema ta este că nu poți folosi wp_title() în tema dacă tema suportă deja title-tag. Secțiunea <head> a temei tale ar trebui să arate astfel:

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

Filtrul și suportul pentru 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 ) {

    //Verifică dacă titlurile personalizate sunt activate din cadrul opțiunilor
    if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
        //Un exemplu simplist
        $title = "Alt titlu" . $title;;
    }

    return $title;
}

Dacă faci astfel, va funcționa perfect.

3 feb. 2015 18:52:23
Comentarii

Am înțeles. Mulțumesc. Știam că trebuie să fie mai ușor... Cred că greșeala mea a fost în funcția de titluri personalizate, fără a apela variabilele $title și $sep. Lasă-mă să încerc :)

Unix Unix
3 feb. 2015 18:58:06

Am adăugat verificarea opțiunii enable_custom_titles.

cybmeta cybmeta
3 feb. 2015 18:59:19

Este mai bine să folosesc verificarea în interiorul funcției?

Unix Unix
3 feb. 2015 19:02:48

Există o problemă: în această funcție nu salvez titlurile în variabile, folosesc funcții acolo unde este posibil, precum the_title(); sau single_tag_title();... Și în variabile atunci când este necesar, de exemplu în meta-box-uri: $metatitle = get_post_meta($post->ID, 'metabox_title_tag', true);. Cum o pot rezolva?

Unix Unix
3 feb. 2015 19:06:47

Ok, va trebui să modific funcția mea custom_titles() pentru a obține toate valorile în variabile. Soluția mea era mai rapidă, dar răspunsul tău este cel corect și pot sări peste unele instrucțiuni condiționale.

Unix Unix
3 feb. 2015 19:21:02

the_title(), single_tag_title() și altele asemenea sunt tag-uri de șablon, adică funcții destinate să fie folosite în fișierele de șablon, nu pentru a obține informații în afara fișierelor de șablon. De exemplu, dacă dorești să afișezi titlul unui articol într-un fișier de șablon, poți folosi the_title() în interiorul buclei; dacă dorești să obții titlul unui articol în afara unui fișier de șablon, ai putea folosi get_the_tile( $post_ID ) sau un obiect post returnat de get_post, WP_Query, etc. Dacă ai nevoie de ajutor cu asta, te rog, postează altă întrebare.

cybmeta cybmeta
3 feb. 2015 19:33:54

Acest răspuns merge în direcția corectă, dar filtrele moderne ar trebui să utilizeze document_title_parts sau pre_get_document_title ... vezi acest thread: https://wordpress.stackexchange.com/questions/305353/cant-change-the-title-tag-with-wp-title-filter

Jesse Nickles Jesse Nickles
23 mai 2023 23:30:14
Arată celelalte 2 comentarii
0

Am găsit o soluție, așa că sunt sigur că va fi utilă pentru alții.


Primul pas: titluri personalizate

Explicație: Dacă funcția mea custom_titles() este activată, încărcați funcția în functions.php sub prioritatea after_theme_setup 2 și afișați tag-urile title în fișierul header.php.

În functions.php:

if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
    // Funcția pentru titluri personalizate
}

În header.php:

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

<!-- Următorul cod va returna noua funcționalitate de titluri din WP dacă titlurile personalizate sunt dezactivate -->
<?php wp_head(); ?>

Al doilea pas: suport pentru title-tag

Explicație: Dacă funcția mea custom_titles() este dezactivată, adăugați add_theme_support('title-tag'); în functions.php sub prioritatea after_theme_setup 1.

Deci, în functions.php:

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

În ceea ce privește prioritatea after_theme_setup, în cazul meu este necesară doar pentru a încărca cadrul Option-Tree înainte de a utiliza funcția ot_get_option(), așa că poate fi diferită —sau chiar inutilă— dacă cineva folosește un alt cadru de opțiuni.

Acum tema mea are noua funcționalitate de titluri din versiunea 4.1 și titluri personalizate pentru SEO folosind meta-boxuri: ambele opțiuni sunt disponibile. (Știu că acest lucru este mai degrabă în sfera plugin-urilor, dar este bine să ai câteva funcționalități esențiale —«esențiale» în opinia mea— integrate în temă). Datorită acestui lucru, clienții vor avea mai mult control asupra modului în care sunt afișate titlurile.

3 feb. 2015 18:47:18