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.
in_the_loop()
est réglé àtrue
chaque fois qu'ilthe_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, provoquantin_the_loop()
le retourtrue
.Réponses:
J'utiliserais le
is_page_template()
conditionnel:Éditer
Vous utiliseriez cette condition dans votre rappel de filtre:
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_template
méta de la publication et vous assurer qu'elle est égale à votre modèle de page: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'
: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.la source
get_post_meta( $id, '_wp_page_template', true )
revientdefault
et 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 lethe_title
filtre à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).Si vous souhaitez uniquement modifier le titre de la page actuelle, utilisez le
in_the_loop()
conditionnel, comme dans:la source
Essayez d'utiliser des balises conditionnelles pour vous assurer
the_title()
que la modification n'est effectuée que sur les pages souhaitées.la source
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.la source
the_title()
? Exemples de code?get_header()
.the_title
est une meilleure solution.