web-dev-qa-db-ja.com

Get_header()のテンプレート階層

私は、サイトの地域によって異なるヘッダーを持つことを考えています。そのため、テンプレートの階層構造を活用して(または少なくとも、コードの一部を再利用して)出力をフィルタリングすることは可能かもしれないと考えました。

これは誰もが試したことのあるものでしょうか。あるいは、階層のテンプレートファイルを選択するコードの方向を誰かが私に指摘することもできます - 私はそれを見つけることができませんでした。

1
Jamie

get_header()は引数を受け入れ、それを使用して別のヘッダーを呼び出すことができます。

get_header()が行う唯一のことは、子テーマ(存在する場合)またはテーマからのファイル'header.php'と呼ばれるテンプレートに含めることです。

引数$nameを使用すると、get_header( $name)のように、関数は'header-{$name}.php'という名前のファイルを探します。

例:ホームページに別のヘッダーを使用する場合。

したがって、'header-home.php'というファイルを作成し、get_header()を呼び出す代わりに'home.php'というファイルに'header-home.php'の代わりに'header.php'を含めるようにget_header( 'home' )を呼び出すことができます。 。

複数のヘッダーがある場合、一部の部分がすべてのファイルで同じように繰り返される可能性があります。

それを避けてDRYコードを使用するには、いくつかの部分を抽出して個別のファイルに入れ、get_template_part()で簡単に再利用できます。

例:

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

これは単なる例ですが、コードを繰り返さなくてもさまざまなヘッダーファイルを作成する方法を示しています。

ボーナスは完全な子テーマフレンドリーであるため(子テーマでは、親テーマから他のものを使用して、1つの「ピース」のみを置き換えることができます)。

編集

現在のテンプレートに基づいて$name引数を動的に設定する方法については、比較的簡単です。

template_includeフックを使用して、グローバルにアクセス可能な変数をセットアップし、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;
}

このようなコードを使用すると、テンプレートファイルで使用できます

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

$GLOBALS['my_theme_cur_template']には、現在のテンプレートのファイル名(拡張子なし)が含まれます。 home.phpの場合、'home'などとなります。

get_headerは、'header-home.php''header-front-page.php''header-single.php''header-page.php'などを自動的に検索します...

ただし、心配しないでください。テンプレート用のヘッダーを作成する必要はありません。テンプレート固有のヘッダーファイルが見つからない場合、get_headerは標準の'header.php'を自動的にロードします。

5
gmazzap

私はこれとは違うやり方をしました。

  1. カスタムフィールドとメタボックスを使用できます
  2. 条件付きで異なるヘッダをロードする
  3. または、さまざまなヘッダーにおすすめの画像メタボックスを使用するTwenty Elevenテーマコードを使用します。

    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