Cambia dinamicamente the_title () di una pagina


9

Sto sviluppando un plug-in che non utilizza un tipo di post personalizzato, ma tabelle di database separate. È un plug-in che visualizza un elenco di corsi con collegamenti che conducono alle diverse pagine dei dettagli del corso, in cui l'utente può quindi iscriversi a un corso.

Allo stato attuale, sto usando un shortcode per ottenere i dati dei plugin in una pagina con un modello di pagina personalizzato (page-course.php).

Ora voglio cambiare the_title()dinamicamente, in base alla pagina che mostra il plugin (elenco dei corsi, pagina dei dettagli del corso con moduli, pagina di successo dell'invio del modulo). Ma ogni volta che lo faccio con il seguente filtro, cambiano anche i collegamenti ad altre pagine nel piè di pagina:

<?php

add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Custom Title';
}

modificare

Nel footer.php ho una funzione che include collegamenti a piè di pagina in wp_nav_menu()modo da poterli definire in Aspetto> Menu. Ma con il filtro sopra, tutti i collegamenti nel piè di pagina cambiano anche in "Titolo personalizzato". Ma voglio solo cambiare il titolo della pagina, senza influire sui collegamenti dei menu nel piè di pagina.

Tentando di aggiungere un tag condizionale, in_the_loop()i collegamenti a piè di pagina sono comunque interessati, sebbene non siano presenti nel ciclo.

<?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 'Custom Title';
}

È simile a questa domanda: filtra il problema the_title in nav , solo che i collegamenti interessati sono nel piè di pagina e in_the_loop()non funzionano.

Come posso cambiare the_title()mentre influisco solo sul titolo della pagina corrente visualizzato senza influire sui collegamenti nel piè di pagina ?

Modifica 2 - Soluzione

Quindi ho finalmente funzionato:

<?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 'Custom Title';
    }
    return $title;
}

Il file page-listcourses.php è un modello di post personalizzato che ho assegnato alla pagina statica denominata "Corsi".

Suppongo che prima non funzionasse perché il nome della pagina statica e il nome file del modello di post personalizzato erano gli stessi.


1
Perché stai rotolando le tue tabelle di database? La tua vita sarebbe molto più semplice se implementassi i tuoi contenuti personalizzati come Tipo di post personalizzato .
Chip Bennett,

In realtà pensavo che questa domanda sarebbe arrivata. Sviluppo questo plugin per conoscere Wordpress, quindi prima non conoscevo i tipi di posta personalizzati. Ho due tabelle di database, una per i corsi e una per le categorie di corso. Una categoria può avere più corsi, quindi le due tabelle sono collegate. Non credo sia facile realizzarlo con i tipi di posta personalizzati. Certo potrei usare tassonomie personalizzate per i corsi, ma dovrei aggiungere più campi, perché una categoria di corso non ha solo un nome. Solo per ora è molto più facile farlo con tabelle di database personalizzate.
Gchtr,

1
Il tuo caso d'uso è l' esatto, previsto caso d'uso per tipi di posta personalizzati e tassonomie personalizzate. È possibile che si stiano fraintendendo l'eleganza, la flessibilità e la potenza di CPT e tassonomie personalizzate.
Chip Bennett,

È davvero possibile che io lo faccia. Probabilmente dovrei solo provare. Grazie per il consiglio.
Gchtr,

in_the_loop()è impostato su trueogni volta che the_post()viene attivato. Senza scavare troppo nel profondo, e sapendo che i menu di navigazione sono essi stessi dei loop , immagino che da qualche parte lungo la strada, wp_nav_menu()crei un'istanza di un loop, causando il in_the_loop()ritorno true.
Chip Bennett,

Risposte:


5

Vorrei usare il is_page_template()condizionale:

if ( is_page_template( 'page-courses.php' ) ) {
    // The current page uses your
    // custom page template;
    // do something
}

modificare

Utilizzeresti questo condizionale nel callback del filtro:

function wpse83525_filter_the_title( $title ) {
    if ( is_page_template( 'page-courses.php' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Ora, per isolare solo i titoli delle pagine che utilizzano il modello di pagina, è possibile usufruire dell'altro parametro passato a the_title: $id. Poiché conosci l'ID del post per cui viene filtrato il titolo, puoi eseguire una query sul _wp_page_templatemeta meta e assicurarti che sia uguale al modello di pagina:

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );

Modifica 2

Se vuoi scegliere come target specifico la pagina "Corsi", usa is_page()con la lumaca di pagina 'courses'o il titolo della pagina di 'Courses':

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Courses' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Tuttavia, consiglierei di passare page-courses.phpa un modello di pagina personalizzato , che renderebbe l'intero processo molto più solido.


Per ora non ha funzionato. Ma ho perfezionato la mia domanda, perché potrebbe non essere stata abbastanza specifica. Forse il problema sta altrove.
Gchtr,

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

Vedi la risposta aggiornata, che dovrebbe riguardare i titoli delle voci del menu di navigazione.
Chip Bennett,

L'ho detto perché penso che la tua risposta potrebbe essere quella giusta (spingendo nella giusta direzione), ma che forse non ho posto la mia domanda in modo sufficientemente chiaro. get_post_meta( $id, '_wp_page_template', true )ritorna defaulte non so cosa farne. Quando imposto 'page-course.php' su 'default', tutti i collegamenti di navigazione cambiano, tranne quando aggancio il the_titlefiltro loop_start, quindi cambiano solo i collegamenti a piè di pagina. Ho controllato quale file modello è usato, ed è 'page-course.php' e non 'page.php' (che pensavo potesse essere quello predefinito).
Gchtr,

Quindi, "Corsi" è il nome della tua pagina statica?
Chip Bennett,

1

Se si desidera modificare solo il titolo della pagina corrente, utilizzare il in_the_loop()condizionale, come in:

add_filter( 'the_title', 'modify_onpage_title', 10, 2);

function modify_onpage_title( $title , $id = null ) {

    if(!in_the_loop()){
        // returns early if not relevant (as in custom menu loops)
        return $title;
    }

    // Tweak your title
    $title = "Yolo! ". $title;
    return $title;
}


0

Mentre is_page_template()funzionerà, preferisco inserire questo tipo di codice nel modello di pagina stesso per avere tutto il codice che genera questo tipo di pagina in un file.


1
Come funzionerebbe, supponendo che il codice in questione utilizzi the_title()? Esempi di codice?
Chip Bennett,

@ChipBennett, non capisco la domanda. Se ha bisogno di applicare il filtro solo per la pagina con un modello specifico, può inserire lo stesso codice nel modello prima di chiamare get_header().
Mark Kaplun,

Sì, in realtà anche io penso che funzionerebbe. Tuttavia, penso che dovrei prendere la deviazione per impostare una variabile nel plugin che sarebbe disponibile in query_vars? Quindi per me il filtro the_titleè una soluzione migliore.
Gchtr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.