WordPress : Modifier les modèles disponibles (dans la liste déroulante)

Publié par Jean-Michel le

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)

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *