WordPress : Modifier les modèles disponibles (dans la liste déroulante)
Je développe un thème WordPress avec plusieurs templates. Un modèle est appelé « Tabs ». Si une page avec ce modèle attribué a des pages enfants, des parties de leur contenu sont affichées dans des onglets sur la page parent. Par conséquent, je souhaite uniquement autoriser certains modèles pour les pages enfants.
Est-il possible de modifier la liste (déroulante) des templates disponibles sous certaines conditions ? Y a-t-il un crochet pour y parvenir?
Mon filtre/action devrait ressembler à ceci (pseudocode) :
if(parent_page->template == 'tabs')
remove template != 'tab-content'
Solution n°1 trouvée
Vous pouvez faire quelque chose comme ça
function wpdocs_filter_theme_page_templates( $page_templates, $this, $post ) {
$parent_id = wp_get_post_parent_id( $post->ID );
$parent_template = get_page_template_slug( $parent_id );
if( 'template-parent.php' === $parent_template ){ // compare parent template
foreach ($page_templates as $key => $value) {
if( 'template-child.php' != $key ){ // compare child template
unset( $page_templates[$key] ); // This will unset all the template except default template and child template
}
}
}
return $page_templates;
}
add_filter( 'theme_page_templates', 'wpdocs_filter_theme_page_templates', 20, 3 );
Voir https://developer.wordpress.org/reference/hooks/theme_page_templates/
Solution n°2 trouvée
La liste des modèles disponibles est générée par get_page_templates
. À la fin de cette fonction, vous voyez un filtre qui vous permet de modifier la sortie. Vous pouvez l’utiliser pour le changer sous certaines conditions comme celle-ci :
add_filter ('theme_page_templates','wpse302574_conditional_templates', 10, 4);
function wpse302574_conditional_templates ($post_templates, $this, $post, $post_type) {
$parent_id = wp_get_post_parent_id ($post->ID);
if (get_page_template_slug ($parent_id) == 'slug_of_your_parent_template') {
// remove unwanted templates from $post_templates
}
return $post_templates;
}
(Je n’ai pas testé ce code, un débogage peut être nécessaire)
0 commentaire