web-dev-qa-db-fra.com

Change dynamiquement le_title () d'une page

Je développe un plugin qui n'utilise pas un type de publication personnalisé, mais des tables de base de données séparées. C'est un plugin qui affiche une liste de cours avec des liens menant aux différentes pages de détail du cours, où l'utilisateur peut s'abonner à un cours.

Dans l'état actuel, j'utilise un shortcode pour obtenir les données des plugins dans une page avec un modèle de page personnalisé (page-courses.php).

Je souhaite maintenant changer the_title() de manière dynamique, en fonction de la page affichée par le plug-in (liste des cours, page de détails du cours avec les formulaires, page de réussite de la soumission de formulaire). Mais chaque fois que je le fais avec le filtre suivant, les liens vers d'autres pages du pied de page changent également:

<?php

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

Modifier

Dans le footer.php, j'ai une fonction qui inclut les liens de pied de page avec wp_nav_menu() afin que je puisse les définir dans Apparence> Menus. Mais avec le filtre ci-dessus, tous les liens dans le pied de page deviennent également "Titre personnalisé". Mais je veux juste changer le titre de la page, sans affecter les liens de menu dans le pied de page.

Si vous essayez d’ajouter une balise conditionnelle in_the_loop(), les liens de bas de page restent concernés, bien qu’ils ne soient pas dans la boucle.

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

Cela ressemble à cette question: filtre le problème the_title dans nav , mais les liens affectés sont dans le pied de page et in_the_loop() ne fonctionne pas.

Comment puis-je changer de the_title() en n'affectant que le titre de la page en cours affichée n'affectant pas les liens dans le pied de page ?

Edit 2 - Solution

Alors j'ai finalement réussi à le faire fonctionner:

<?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;
}

Le fichier page-listcourses.php est un modèle de publication personnalisé que j'ai affecté à la page statique nommée "Cours".

Je suppose que cela ne fonctionnait pas auparavant car le nom de la page statique et du nom de fichier du modèle de publication personnalisée étaient les mêmes.

9
Gchtr

Je voudrais utiliser le is_page_template() conditionnel:

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

Modifier

Vous utiliseriez ceci à l'intérieur votre callback de filtre conditionnel:

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' );

Désormais, pour isoler uniquement les titres des pages qui utilisent votre modèle de page, vous pouvez tirer parti de l’autre paramètre transmis à the_title: $id. Puisque vous connaissez l'identifiant de l'article pour lequel le titre est filtré, vous pouvez interroger la méta _wp_page_template post et vous assurer qu'elle est égale à votre modèle de page:

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

Modifier 2

Si vous souhaitez cibler spécifiquement la page "Cours", utilisez is_page() avec le slug de page 'courses' ou le titre de la page 'Courses':

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

Cependant, je recommanderais de remplacer page-courses.php par un Modèle de page personnalisé , ce qui rendrait tout ce processus beaucoup plus robuste.

5
Chip Bennett

Si vous souhaitez uniquement modifier le titre de la page actuelle, utilisez la fonction in_the_loop()conditional, comme dans

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;
}
1
pixeline

Essayez d’utiliser les balises conditionnelles pour vous assurer que the_title() n’est modifié que sur les pages souhaitées.

0
theMojoWill

Bien que is_page_template() fonctionne, je préfère mettre ce type de code dans le modèle de page lui-même pour que tout le code qui génère ce type de page dans un fichier.

0
Mark Kaplun