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 ); ?>">