Modifier dynamiquement le_titre () d'une page

9

Je développe un plugin qui n'utilise pas de type de publication personnalisé, mais des tables de base de données distinctes. C'est un plugin qui affiche une liste de cours avec des liens qui mènent aux différentes pages de détails du cours, où l'utilisateur peut alors 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 veux maintenant changer the_title()dynamiquement, en fonction de la page que le plugin affiche (liste des cours, page de détails du cours avec formulaires, page de réussite de 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';
}

Éditer

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

En essayant d'ajouter une balise conditionnelle, in_the_loop()les liens de pied de page sont toujours affecté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';
}

C'est similaire à cette question: filtrez le problème du titre dans la navigation , juste que les liens affectés sont dans le pied de page et in_the_loop()ne fonctionnent pas.

Comment puis-je changer the_title()tout en n'affectant que le titre de la page en cours sans affecter les liens dans le pied de page ?

Edit 2 - Solution

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 attribué à la page statique nommée «Cours».

Je suppose que cela n'a pas fonctionné auparavant car le nom de la page statique et le nom de fichier du modèle de publication personnalisé étaient les mêmes.

Gchtr
la source
1
Pourquoi lancez-vous vos propres tables de base de données? Votre vie serait beaucoup plus simple si vous implémentiez votre contenu personnalisé en tant que type de publication personnalisé .
Chip Bennett
En fait, je pensais que cette question viendrait. Je développe ce plugin pour connaître Wordpress, donc je ne connaissais pas les types de publication personnalisés. J'ai deux tables de base de données, une pour les cours et une pour les catégories de cours. Une catégorie peut avoir plusieurs cours, les deux tableaux sont donc liés. Je ne pense pas que ce soit aussi facile à réaliser avec des types de publication personnalisés. Bien sûr, je pourrais utiliser des taxonomies personnalisées pour les cours, mais je devrais ajouter plus de champs, car une catégorie de cours n'a pas seulement un nom. Pour l'instant, il est beaucoup plus facile de le faire avec des tables de base de données personnalisées.
Gchtr
1
Votre cas d'utilisation est le cas d'utilisation exact et prévu pour les types de publication personnalisés et les taxonomies personnalisées. Vous pouvez sous- estimer l'élégance, la flexibilité et la puissance des CPT et des taxonomies personnalisées.
Chip Bennett
Il est en effet possible que je le fasse. Je devrais probablement juste essayer. Merci pour le conseil.
Gchtr
in_the_loop()est réglé à truechaque fois qu'il the_post()est déclenché. Sans creuser trop profondément dans le cœur, et sachant que les menus de navigation sont eux-mêmes des boucles , je suppose que quelque part en cours de route, wp_nav_menu()instancie une boucle, provoquant in_the_loop()le retour true.
Chip Bennett

Réponses:

5

J'utiliserais le is_page_template()conditionnel:

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

Éditer

Vous utiliseriez cette condition dans votre rappel de filtre:

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

Maintenant, pour isoler seulement les titres des pages qui utilisent votre modèle de page, vous pouvez profiter de l'autre paramètre transmis à the_title: $id. Puisque vous connaissez l'ID de la publication pour laquelle le titre est filtré, vous pouvez interroger la _wp_page_templateméta de la publication 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-la 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 passer page-courses.phpà un modèle de page personnalisé , ce qui rendrait l'ensemble de ce processus beaucoup plus robuste.

Chip Bennett
la source
Cela n'a pas fonctionné pour l'instant. Mais j'ai affiné ma question, car elle n'était peut-être pas assez précise. Peut-être que le problème se situe ailleurs.
Gchtr
Que voulez-vous dire par " qui n'a pas fonctionné pour l'instant "? Qu'avez -vous essayé exactement ? Que vous attendiez-vous à ce qui ne se produise pas ou que s'est-il passé de façon inattendue?
Chip Bennett
Voir la réponse mise à jour, qui devrait traiter les titres des éléments du menu nav.
Chip Bennett
Je l'ai dit parce que je pense que votre réponse pourrait être la bonne (pousser dans la bonne direction), mais que je n'ai peut-être pas posé ma question assez clairement. get_post_meta( $id, '_wp_page_template', true )revient defaultet je ne sais pas quoi faire avec ça. Lorsque je mets «page-courses.php» sur «par défaut», tous les liens de navigation changent, sauf lorsque je connecte le the_titlefiltre à loop_start, alors seuls les liens de pied de page changent. J'ai vérifié quel fichier de modèle est utilisé, et c'est 'page-courses.php' et non 'page.php' (que je pensais être le fichier par défaut).
Gchtr
Alors, "Cours" est-il le nom de votre page statique?
Chip Bennett
1

Si vous souhaitez uniquement modifier le titre de la page actuelle, utilisez le in_the_loop()conditionnel, 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;
}
pixeline
la source
0

Essayez d'utiliser des balises conditionnelles pour vous assurer the_title()que la modification n'est effectuée que sur les pages souhaitées.

theMojoWill
la source
0

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

Mark Kaplun
la source
1
Comment cela fonctionnerait-il, en supposant que le code en question utilise the_title()? Exemples de code?
Chip Bennett
@ChipBennett, je ne comprends pas la question. S'il a besoin que le filtre soit appliqué uniquement pour la page avec un modèle spécifique, il peut placer le même code dans le modèle avant d'appeler get_header().
Mark Kaplun
Oui, en fait, je pense aussi que cela fonctionnerait. Cependant, je pense que je devrais faire le détour pour définir une variable dans le plugin qui serait disponible dans query_vars? Donc pour moi, le filtrage the_titleest une meilleure solution.
Gchtr