Cambiare dinamicamente the_title() di una pagina

28 gen 2013, 23:39:36
Visualizzazioni: 21K
Voti: 11

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.

5
Commenti

Perché stai creando le tue tabelle del database? La tua vita sarebbe molto più semplice se implementassi il tuo contenuto personalizzato come un Custom Post Type.

Chip Bennett Chip Bennett
29 gen 2013 17:10:30

In realtà pensavo che questa domanda sarebbe arrivata. Sviluppo questo plugin per conoscere WordPress, quindi inizialmente non sapevo dei Custom Post Type. Ho due tabelle del database, una per i corsi e una per le categorie dei corsi. Una categoria può avere diversi corsi, quindi le due tabelle sono collegate. Non credo sia così semplice realizzarlo con i Custom Post Type. Certo, potrei usare Custom Taxonomies per i corsi, ma dovrei aggiungere più campi, perché una categoria di corso non ha solo il nome. Per ora è molto più semplice farlo con tabelle personalizzate.

Gchtr Gchtr
29 gen 2013 21:23:21

Il tuo caso d'uso è esattamente lo scopo previsto per i Custom Post Type e le Custom Taxonomies. Potresti sottovalutare l'eleganza, la flessibilità e la potenza dei CPT e delle Custom Taxonomies.

Chip Bennett Chip Bennett
29 gen 2013 21:25:52

È effettivamente possibile che lo faccia. Probabilmente dovrei solo provare. Grazie per il consiglio.

Gchtr Gchtr
29 gen 2013 21:30:09

in_the_loop() viene impostato a true ogni volta che the_post() viene eseguito. Senza scavare troppo a fondo nel core, e sapendo che i menu di navigazione sono essi stessi dei loop, immagino che da qualche parte lungo il percorso, wp_nav_menu() istanzi un loop, facendo sì che in_the_loop() restituisca true.

Chip Bennett Chip Bennett
30 gen 2013 16:22:06
Tutte le risposte alla domanda 4
9

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.

29 gen 2013 17:09:43
Commenti

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.

Gchtr Gchtr
30 gen 2013 15:46:35

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

Chip Bennett Chip Bennett
30 gen 2013 16:05:09

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

Chip Bennett Chip Bennett
30 gen 2013 16:31:43

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

Gchtr Gchtr
30 gen 2013 17:46:42

Quindi, "Courses" è il nome della tua pagina statica?

Chip Bennett Chip Bennett
30 gen 2013 18:24:30

Sì, è il nome della pagina statica.

Gchtr Gchtr
30 gen 2013 18:37:57

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

Chip Bennett Chip Bennett
30 gen 2013 18:51:07

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!

Gchtr Gchtr
30 gen 2013 19:11:27

Per riferimento futuro: consiglio di non nominare i template di pagina personalizzati come page-foobar.php, proprio per questo motivo. Io uso template-foobar.php invece.

Chip Bennett Chip Bennett
30 gen 2013 19:16:58
Mostra i restanti 4 commenti
3

Sebbene is_page_template() funzioni, preferisco inserire questo tipo di codice direttamente nel template della pagina per avere tutto il codice che genera questo tipo di pagina in un unico file.

29 gen 2013 18:58:58
Commenti

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

Chip Bennett Chip Bennett
29 gen 2013 19:54:19

@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().

Mark Kaplun Mark Kaplun
29 gen 2013 21:25:09

Sì, in effetti penso anch'io che funzionerebbe. Tuttavia, credo che dovrei fare il giro lungo impostando una variabile nel plugin che sarebbe disponibile in query_vars? Quindi per me, filtrare the_title è una soluzione più elegante.

Gchtr Gchtr
30 gen 2013 19:19:45
0

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;
}
8 nov 2016 14:08:32
0

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

29 gen 2013 16:50:06