Modifică dinamic the_title() pentru o pagină
Dezvolt un plugin care nu folosește un tip de postare personalizat, ci tabele separate în baza de date. Este un plugin care afișează o listă de cursuri cu linkuri care duc către diferite pagini cu detalii despre cursuri, unde utilizatorul poate apoi să se înscrie la un curs.
În starea actuală, folosesc un shortcode pentru a introduce datele pluginului într-o pagină cu un șablon de pagină personalizat (page-courses.php).
Acum vreau să modific the_title()
în mod dinamic, în funcție de pagina pe care o afișează pluginul (lista de cursuri, pagina cu detalii despre curs cu formulare, pagina de succes pentru trimiterea formularului). Dar ori de câte ori fac asta cu următorul filtru, și linkurile către alte pagini din footer se modifică:
<?php
add_filter('the_title', 'custom_page_title');
function custom_page_title() {
return 'Titlu Personalizat';
}
Editare
În footer.php am o funcție care include linkuri de footer cu wp_nav_menu()
astfel încât să le pot defini în Aspect > Meniuri. Dar cu filtrul de mai sus, toate linkurile din footer se schimbă și ele în 'Titlu Personalizat'. Dar vreau doar să schimb titlul paginii, fără a afecta linkurile din meniu din footer.
Încercând să adaug o etichetă condițională in_the_loop()
linkurile din footer sunt încă afectate, deși nu sunt în buclă.
<?php
add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
if ( in_the_loop() ) {
add_filter( 'the_title', 'custom_page_title' );
}
}
function custom_page_title() {
return 'Titlu Personalizat';
}
Este similar cu această întrebare: problemă cu filtrul the_title în nav, doar că linkurile afectate sunt în footer și in_the_loop()
nu funcționează.
Cum pot modifica the_title()
afectând doar titlul paginii curente afișate fără a afecta linkurile din footer?
Editare 2 - Soluție
În final am reușit să-l fac să funcționeze:
<?php
add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
}
function wpse83525_filter_the_title( $title, $id ) {
if ( 'page-listcourses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
return 'Titlu Personalizat';
}
return $title;
}
Fișierul page-listcourses.php este un Șablon de Pagină Personalizat pe care l-am atribuit paginii statice numite 'Cursuri'.
Presupun că nu a funcționat înainte deoarece numele paginii statice și numele fișierului Șablonului de Pagină Personalizat erau identice.

Aș folosi condiția is_page_template()
:
if ( is_page_template( 'page-courses.php' ) ) {
// Pagina curentă folosește
// șablonul personalizat;
// fă ceva
}
Editare
Ați folosi această condiție în interiorul funcției de callback a filtrului:
function wpse83525_filter_the_title( $title ) {
if ( is_page_template( 'page-courses.php' ) ) {
return 'Titlu Personalizat';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Acum, pentru a izola doar titlurile paginilor care folosesc șablonul dvs., puteți profita de celălalt parametru transmis la the_title
: $id
. Deoarece cunoașteți ID-ul postării pentru care se filtrează titlul, puteți interoga metadatele postului _wp_page_template
și vă asigurați că acesta este egal cu șablonul dvs. de pagină:
function wpse83525_filter_the_title( $title, $id ) {
if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
return 'Titlu Personalizat';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
Editare 2
Dacă doriți să țintiți pagina "Cursuri" în mod specific, utilizați is_page()
cu slug-ul paginii 'courses'
, sau titlul paginii 'Cursuri'
:
function wpse83525_filter_the_title( $title ) {
if ( is_page( 'Cursuri' ) ) {
return 'Titlu Personalizat';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Cu toate acestea, aș recomanda schimbarea page-courses.php
într-un Șablon de Pagină Personalizat, ceea ce ar face întregul proces mult mai robust.

Asta nu a funcționat deocamdată. Dar am rafinat întrebarea mea, pentru că poate nu a fost suficient de specifică. Poate problema se află altundeva.

Ce înțelegi prin "asta nu a funcționat deocamdată"? Ce exact ai încercat? Ce te așteptai să se întâmple, dar nu s-a întâmplat, sau ce s-a întâmplat neașteptat?

Vezi răspunsul actualizat, care ar trebui să rezolve problemele cu titlurile elementelor din meniul de navigare.

Am spus asta pentru că cred că răspunsul tău ar putea fi cel corect (îndreptând în direcția bună), dar poate nu mi-am pus întrebarea suficient de clar. get_post_meta( $id, '_wp_page_template', true )
returnează default
și nu știu ce să fac cu asta. Când setez 'page-courses.php' la 'default', toate linkurile din navigație se schimbă, cu excepția când conectez filtrul the_title
la loop_start
, atunci doar linkurile din footer se schimbă. Am verificat ce fișier de template este folosit, și este 'page-courses.php' și nu 'page.php' (pe care credeam că ar putea fi cel implicit).

Vezi răspunsul actualizat. Poți direcționa o pagină după titlul sau slug-ul ei, folosind is_page()
.

Am reușit să fac să funcționeze acum. Vezi primul post cu întrebarea pentru a vedea ce am făcut. Fișierul page-courses.php a fost întotdeauna un Șablon de Pagină Personalizat. Presupun că nu a funcționat înainte pentru că numele paginii statice și numele fișierului Șablonului de Postare Personalizat erau la fel. Mulțumesc pentru eforturile tale!

Cum ar funcționa asta, plecând de la ipoteza că codul în cauză folosește the_title()
? Exemple de cod?

@ChipBennett, nu înțeleg întrebarea. Dacă are nevoie ca filtrul să se aplice doar pentru pagina cu un anumit template, atunci poate plasa același cod în template înainte de apelul la get_header()
.

Dacă dorești să editezi doar titlul paginii curente, folosește condiția in_the_loop()
, ca în exemplul următor:
add_filter( 'the_title', 'modify_onpage_title', 10, 2);
function modity_onpage_title( $title , $id = null ) {
if(!in_the_loop()){
// întoarce rezultatul imediat dacă nu este relevant (ca în cazul meniurilor personalizate)
return $title;
}
// Modifică titlul după preferințe
$title = "Yolo! ". $title;
return $title;
}

Încearcă să folosești etichete condiționale pentru a te asigura că the_title()
este modificat doar pe paginile dorite.
