webentwicklung-frage-antwort-db.com.de

Vorlagenhierarchie für get_header ()

Ich denke darüber nach, je nach Bereich der Site unterschiedliche Header zu haben. Ich dachte also, es könnte möglich sein, auf die Vorlagenhierarchie zuzugreifen (oder zumindest einen Teil des Codes erneut zu verwenden) und die Ausgabe zu filtern.

Hat das jemand ausprobiert? Oder könnte mich jemand in die Richtung des Codes lenken, der die Vorlagendatei in der Hierarchie auswählt - ich konnte sie nicht finden.

1
Jamie

get_header() akzeptiert ein Argument, mit dem Sie andere Header aufrufen können.

Das einzige, was get_header() macht, ist, die Datei 'header.php' aus dem untergeordneten Thema (falls vorhanden) oder aus dem Thema in die Vorlage aufzunehmen.

Wenn Sie das Argument $name wie folgt verwenden: get_header( $name), sucht die Funktion nach einer Datei mit dem Namen 'header-{$name}.php'.

Ein Beispiel: Sie möchten einen anderen Header für die Homepage verwenden.

Sie erstellen also eine Datei mit dem Namen 'header-home.php'. In der Datei 'home.php' können Sie anstelle von get_header() auch get_header( 'home' ) aufrufen, um 'header-home.php' anstelle von 'header.php' einzuschließen.

Wenn Sie mehrere Header haben, ist es möglich, dass einige Teile in allen Dateien gleich wiederholt werden.

Um dies zu vermeiden und den Code DRY zu verwenden, können Sie einige Teile extrahieren und in separate Dateien einfügen und sie dann einfach über get_template_part() wiederverwenden.

Ein Beispiel:

<?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

Dies ist nur ein Beispiel, das jedoch zeigt, wie Sie verschiedene Header-Dateien erstellen, ohne den Code wiederholen zu müssen.

Als Bonus gibt es ein volles Kinderthema (in einem Kinderthema können Sie sogar nur ein 'Stück' durch die anderen aus dem Elternthema ersetzen).

Bearbeiten

In Bezug auf den Weg zum dynamischen Setzen des $name-Arguments basierend auf der aktuellen Vorlage ist dies relativ einfach.

Sie können template_include hook verwenden, um eine global zugängliche Variable einzurichten und sie als Argument für get_header zu verwenden.

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;
}

Mit einem solchen Code können Sie in Ihren Vorlagendateien verwenden

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

der $GLOBALS['my_theme_cur_template'] enthält den Dateinamen (ohne Erweiterung) der aktuellen Vorlage. Für home.php ist es also 'home' und so weiter.

Also sucht get_header automatisch nach 'header-home.php', 'header-front-page.php', 'header-single.php', 'header-page.php' und so weiter ...

Aber keine Sorge: Sie müssen für keine Vorlage einen Header erstellen. Wenn die vorlagenspezifische Header-Datei nicht gefunden wird, lädt get_header automatisch den Standard-'header.php'.

5
gmazzap

Ich habe das anders gemacht.

  1. Sie können ein benutzerdefiniertes Feld und eine Meta-Box verwenden
  2. Unterschiedliche Header bedingt laden
  3. Oder verwenden Sie den Twenty Eleven Themes-Code, in dem die Meta-Box für die ausgewählten Bilder für verschiedene Überschriften verwendet wird

    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