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.
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).
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.
J'ai fait cela de différentes manières.
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="" />