Cambiare dinamicamente the_title() di una pagina
Sto sviluppando un plugin che non utilizza un custom post type, ma tabelle separate nel database. È un plugin che mostra un elenco di corsi con link che portano alle diverse pagine di dettaglio del corso, dove l'utente può quindi iscriversi a un corso.
Allo stato attuale, sto utilizzando uno shortcode per inserire i dati del plugin in una pagina con un template personalizzato (page-courses.php).
Ora voglio modificare the_title()
dinamicamente, in base alla pagina che il plugin mostra (elenco dei corsi, pagina dei dettagli del corso con moduli, pagina di successo invio modulo). Ma ogni volta che lo faccio con il seguente filtro, anche i link alle altre pagine nel footer cambiano:
<?php
add_filter('the_title', 'custom_page_title');
function custom_page_title() {
return 'Titolo Personalizzato';
}
Modifica
Nel footer.php ho una funzione che include i link del footer con wp_nav_menu()
così posso definirli in Aspetto > Menu. Ma con il filtro sopra, tutti i link nel footer cambiano anche loro in 'Titolo Personalizzato'. Ma voglio solo cambiare il titolo della pagina, senza influenzare i link del menu nel footer.
Provando ad aggiungere un tag condizionale in_the_loop()
i link del footer sono ancora influenzati, anche se non sono nel loop.
<?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 'Titolo Personalizzato';
}
È simile a questa domanda: problema con il filtro the_title nel nav, solo che i link interessati sono nel footer e in_the_loop()
non funziona.
Come posso modificare the_title()
influenzando solo il titolo della pagina corrente mostrata senza influenzare i link nel footer?
Modifica 2 - Soluzione
Alla fine l'ho fatto funzionare:
<?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 'Titolo Personalizzato';
}
return $title;
}
Il file page-listcourses.php è un Template di Post Personalizzato che ho assegnato alla pagina statica chiamata 'Corsi'.
Presumo che prima non funzionasse perché il nome della pagina statica e il nome del file del Template di Post Personalizzato erano gli stessi.

Utilizzerei il condizionale is_page_template()
:
if ( is_page_template( 'page-courses.php' ) ) {
// La pagina corrente utilizza il tuo
// template di pagina personalizzato;
// fai qualcosa
}
Modifica
Utilizzeresti questo condizionale all'interno della tua funzione di callback del filtro:
function wpse83525_filter_the_title( $title ) {
if ( is_page_template( 'page-courses.php' ) ) {
return 'Titolo Personalizzato';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Ora, per isolare solo i titoli delle pagine che utilizzano il tuo template di pagina, puoi sfruttare l'altro parametro passato a the_title
: $id
. Dal momento che conosci l'ID del post per cui viene filtrato il titolo, puoi interrogare il post meta _wp_page_template
e assicurarti che corrisponda al tuo template di pagina:
function wpse83525_filter_the_title( $title, $id ) {
if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
return 'Titolo Personalizzato';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
Modifica 2
Se vuoi puntare specificamente alla pagina "Courses", usa is_page()
con lo slug della pagina 'courses'
, o il titolo della pagina 'Courses'
:
function wpse83525_filter_the_title( $title ) {
if ( is_page( 'Courses' ) ) {
return 'Titolo Personalizzato';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Tuttavia, consiglierei di cambiare page-courses.php
in un Template di Pagina Personalizzato, il che renderebbe l'intero processo molto più robusto.

Per ora non ha funzionato. Ma ho perfezionato la mia domanda, perché potrebbe non essere stata abbastanza specifica. Forse il problema si trova da un'altra parte.

Cosa intendi con "per ora non ha funzionato"? Cosa hai provato esattamente? Cosa ti aspettavi che accadesse e non è successo, o cosa è accaduto inaspettatamente?

Vedi la risposta aggiornata, dovrebbe risolvere il problema dei titoli degli elementi del menu di navigazione.

L'ho detto perché penso che la tua risposta potrebbe essere quella giusta (spingendo nella direzione corretta), ma che forse non ho formulato la mia domanda in modo abbastanza chiaro. get_post_meta( $id, '_wp_page_template', true )
restituisce default
e non so cosa farci. Quando imposto 'page-courses.php' come 'default', tutti i link di navigazione cambiano, tranne quando aggancio il filtro the_title
a loop_start
, allora cambiano solo i link nel footer. Ho verificato quale file template viene utilizzato, ed è 'page-courses.php' e non 'page.php' (che pensavo potesse essere quello predefinito).

Vedi la risposta aggiornata. Puoi puntare a una pagina usando il suo titolo o slug, utilizzando is_page()
.

Ora ho risolto. Vedi il primo post della domanda per vedere cosa ho fatto. Il file page-courses.php era sempre un Template di Pagina Personalizzato. Suppongo che prima non funzionasse perché il nome della pagina statica e il nome del file del Template di Post Personalizzato erano uguali. Grazie per il tuo aiuto!

Come funzionerebbe, nell'ipotesi che il codice in questione utilizzi the_title()
? Esempi di codice?

@ChipBennett, non capisco la domanda. Se ha bisogno che il filtro venga applicato solo per le pagine con un template specifico, allora può inserire lo stesso codice nel template prima di chiamare get_header()
.

Se vuoi modificare solo il titolo della pagina corrente, utilizza il condizionale in_the_loop()
, come in:
add_filter( 'the_title', 'modify_onpage_title', 10, 2);
function modify_onpage_title( $title , $id = null ) {
if(!in_the_loop()){
// ritorna subito se non pertinente (come nei loop dei menu personalizzati)
return $title;
}
// Modifica il tuo titolo
$title = "Yolo! ". $title;
return $title;
}

Prova a utilizzare i tag condizionali per assicurarti che the_title()
venga modificato solo nelle pagine che desideri.
