web-dev-qa-db-fra.com

Hiérarchie des modèles pour get_header ()

J'envisage d'avoir différents en-têtes en fonction de la zone du site. Nous avons donc pensé qu'il serait possible de puiser dans la hiérarchie des modèles (ou à tout le moins de réutiliser une partie du code) et de filtrer la sortie.

Est-ce quelque chose que quelqu'un a essayé? Ou quelqu'un pourrait-il m'indiquer la direction du code qui sélectionne le fichier modèle dans la hiérarchie - je n'ai pas pu le trouver.

1
Jamie

get_header() accepte un argument. En l’utilisant, vous pouvez appeler un en-tête différent.

La seule chose que get_header() fait est d’inclure dans le modèle le fichier 'header.php' du thème enfant (si présent) ou du thème.

Si vous utilisez l'argument $name, comme suit: get_header( $name), la fonction recherchera un fichier nommé 'header-{$name}.php'.

Un exemple: vous voulez utiliser un en-tête différent pour la page d'accueil.

Donc, vous créez un fichier appelé 'header-home.php', puis dans le fichier 'home.php' au lieu d'appeler get_header(), vous pouvez appeler get_header( 'home' ) pour inclure 'header-home.php' au lieu de 'header.php'.

Si vous avez plusieurs en-têtes, il est possible que certaines parties soient répétées de la même manière dans tous les fichiers.

Pour éviter cela et utiliser le code DRY, vous pouvez extraire certaines parties et les placer dans des fichiers séparés, puis les réutiliser facilement via get_template_part().

Un exemple:

<?php
// header.php
get_template_part('header', 'start'); // header-start.php contain html tag and other stuff
wp_head(); // should always be called in header
get_template_part('header', 'navigation'); // header-navigation.php for menu


<?php
// header-home.php
get_template_part('header', 'start');
wp_head();
get_template_part('header', 'navigation');
get_template_part('header', 'navigation2'); // header-navigation2.php for additional nav
get_template_part('header', 'home'); // header-home.php contain stuff specific to home

Ceci est juste un exemple, cependant, montre comment créer différents fichiers d’en-tête sans avoir à répéter le code.

En prime, le thème pour enfants est complet (dans un thème pour enfants, vous pouvez remplacer même un seul élément en utilisant les autres du thème parent).

Modifier

En ce qui concerne la façon de définir de manière dynamique l’argument $name en fonction du modèle actuel, cela est relativement facile à faire.

Vous pouvez utiliser le crochet template_include pour configurer une variable accessible globale et l'utiliser comme argument pour get_header.

add_filter( 'template_include', 'my_theme_sniff_template', 99999);

function my_theme_sniff_template( $template ) {
  $info = pathinfo( $template );
  global $my_theme_cur_tmpl;
  $my_theme_cur_tmpl = $info['filename'];
  return $template;
}

En utilisant un tel code, dans vos fichiers de modèles, vous pouvez utiliser

get_header( isset($GLOBALS['my_theme_cur_tmpl']) ? $GLOBALS['my_theme_cur_tmpl'] : '' );

le $GLOBALS['my_theme_cur_template'] contiendra le nom du fichier (sans extension) du modèle actuel. Donc pour home.php ce sera 'home' et ainsi de suite.

Donc get_header cherchera automatiquement 'header-home.php', 'header-front-page.php', 'header-single.php', 'header-page.php' et ainsi de suite ...

Mais ne vous inquiétez pas: vous n'avez pas à créer d'en-tête pour un modèle. Si le fichier d'en-tête spécifique au modèle n'est pas trouvé, get_header chargera automatiquement le 'header.php' standard.

5
gmazzap

J'ai fait cela de différentes manières.

  1. Vous pouvez utiliser un champ personnalisé et une méta-boîte
  2. Charger conditionnellement différents en-têtes
  3. Ou utilisez le code de thèmes Twenty Eleven qui utilise la méta-boîte d'image en vedette pour différents en-têtes

    function featured_headers() 
    
    if ( has_post_thumbnail( $post->ID ) && ( $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 
    
    array( $header_image_width, $header_image_width ) ) ) && $image[1] >=$header_image_width ) :
    
    echo get_the_post_thumbnail( $post->ID, 'large-feature' ); 
    
    else:
    if ( function_exists( 'get_custom_header' ) ) {
    
    $header_image_width  = get_custom_header()->width;
    $header_image_height = get_custom_header()->height;
    }
    ?>
    <img src="<?php header_image(); ?>" width="<?php echo $header_image_width; ?>" height="<?php echo $header_image_height; ?>" alt="" />
    
0
Brad Dalton