WordPress函数:get_header 引入头部模板

编辑文章

简介

get_header 是 WordPress 的核心模板函数,用于在当前模板中引入并执行指定的头部模板文件(通常是 header.php)。它是构建 WordPress 主题的基础,确保了每个页面的头部区域(包括 <head> 和页面顶部的可见部分)保持一致且易于维护。

语法

此函数定义于 wp-includes/general-template.php 文件中。它内部调用 locate_template() 函数来定位主题目录下的模板文件,并使用 load_template() 将其加载执行。

get_header( string $name = null )
参数 类型 默认值 说明
$name 字符串 null (可选)指定要加载的头部模板变体的名称。例如,传入 'special' 会尝试加载 header-special.php
返回值 布尔值 成功定位并加载模板时返回 true,失败时返回 false

用法

基础用法

在 WordPress 主题中,get_header() 通常在每个页面模板(如 page.php, single.php, index.php)的最开头调用,用于引入网站的公共头部。

<?php
/**
 * 示例:页面模板 (page.php) 的典型结构
 */
get_header(); // 引入默认的 header.php

// 主循环开始
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        // 输出页面内容...
    endwhile;
endif;

get_sidebar(); // 引入侧边栏(可选)
get_footer(); // 引入页脚
?>

进阶用法

通过传递 $name 参数,可以为不同的页面类型或特定条件加载不同的头部模板。这在需要为特定页面定制头部样式(如登录页面、产品页面)时非常有用。

<?php
/**
 * 在特定页面模板中加载自定义头部
 * 文件:page-landing.php
 */
// 加载名为 header-landing.php 的头部文件
get_header( 'landing' );

// ... 落地页的特定内容 ...

get_footer( 'landing' ); // 同样可以加载自定义页脚
?>

更动态的用法是根据条件判断来加载不同的头部:

<?php
// 在某个模板文件中
if ( is_front_page() ) {
    // 首页加载一个带有特殊横幅的头部
    get_header( 'home' );
} elseif ( is_singular( 'product' ) ) {
    // 产品详情页加载一个简化的头部
    get_header( 'product' );
} else {
    // 其他页面加载默认头部
    get_header();
}
?>

易错点

模板文件不存在导致静默失败

调用 get_header( 'special' ) 时,WordPress 会按顺序查找 header-special.php -> header.php。如果两者都不存在,函数会返回 false 且不会输出任何内容或显式错误,导致头部区域空白。开发时应始终确保至少有一个默认的 header.php 文件存在。

混淆与 wp_head() 钩子的区别

get_header() 是引入一个模板文件,而 wp_head() 是一个动作钩子,通常位于 header.php 文件内 <head> 部分的末尾,用于让插件和主题在此注入脚本、样式和元数据。忘记在 header.php 中调用 wp_head() 是常见错误,会导致某些插件功能失效、主题样式异常。

最佳实践

确保 header.php 包含必要的钩子和元标签

一个标准的 header.php 文件应该包含以下关键元素,以确保 WordPress 核心、主题和插件能正常运作:

<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
    <meta charset="<?php bloginfo( 'charset' ); ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <?php wp_head(); // 必须!用于插件和主题添加脚本、样式和元数据 ?>
</head>
<body <?php body_class(); // 输出 body 的 CSS 类,便于样式控制 ?>>
<?php wp_body_open(); // WordPress 5.2+ 引入的钩子,用于在 body 开始后立即执行代码 ?>
    <header id="masthead" class="site-header">
        <!-- 头部内容,如 logo、导航菜单等 -->
    </header>
    <main id="primary" class="site-main">

为什么重要wp_head() 钩子允许插件和主题在 <head> 中插入代码(如 SEO 插件添加的元标签、统计分析代码等)。body_class() 函数输出当前页面的 CSS 类,使主题开发者能够针对不同页面类型编写CSS样式。wp_body_open() 钩子让插件可以在 <body> 开始后立即输出内容(如 cookie 同意横幅)。

性能考虑:避免在头部进行复杂查询

header.php 会在每个页面加载时被引入,因此应避免在其中执行复杂的数据库查询或耗时操作。如果必须使用,考虑使用缓存(如 Transients API)来存储结果。

<?php
// 示例:缓存头部中的动态数据
function get_cached_header_data() {
    $data = get_transient( 'cached_header_data' );
    if ( false === $data ) {
        // 执行复杂的查询或处理
        $data = ...; // 获取数据
        set_transient( 'cached_header_data', $data, 12 * HOUR_IN_SECONDS );
    }
    return $data;
}

安全性:转义输出

header.php 中,任何从数据库或用户输入中获取的数据在输出时都必须进行转义,以防止 XSS 攻击。常用的转义函数包括 esc_html()esc_attr()esc_url() 等。

<title><?php echo esc_html( $custom_title ); ?></title>
<meta name="description" content="<?php echo esc_attr( $meta_description ); ?>">