Conflict între add_theme_support('title-tag') și funcția de titluri personalizate
'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!

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.

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 :)

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?

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.

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.

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

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.
