为什么要自定义 WordPress 标题标签?
WordPress 默认通过 wp_head() 函数在页面头部输出 <title> 标签。有时,为了满足特定的 SEO 策略、品牌展示或页面设计需求,开发者需要完全控制标题的生成逻辑和显示内容。这就需要先移除默认的标题输出,然后实现自定义的标题显示方案。
方法一:移除默认标题并创建自定义函数
此方法分两步:首先移除 WordPress 核心的标题渲染动作,然后在主题中编写并调用自定义的标题函数。
步骤 1:移除默认的 title 标签输出
在主题的 functions.php 文件中添加以下代码,以解除 wp_head() 对标题标签的自动渲染:
// 删除 wp_head() 中的默认 title 标签输出
remove_action( 'wp_head', '_wp_render_title_tag', 1 );
步骤 2:创建并调用自定义标题函数
移除默认输出后,你需要在主题模板文件(通常是 header.php)中手动输出标题。你可以创建一个自定义函数来生成复杂的标题逻辑,然后在 <head> 区域调用它。
// 示例:一个简单的自定义标题函数
function my_custom_document_title() {
$title = '';
if ( is_home() || is_front_page() ) {
$title = get_bloginfo( 'name' ) . ' - ' . get_bloginfo( 'description' );
} elseif ( is_single() || is_page() ) {
$title = get_the_title() . ' - ' . get_bloginfo( 'name' );
} elseif ( is_category() ) {
$title = single_cat_title( '', false ) . ' - 分类目录 - ' . get_bloginfo( 'name' );
} else {
$title = wp_title( '', false ) . ' - ' . get_bloginfo( 'name' );
}
echo '' . esc_html( $title ) . ' ';
}
// 在 header.php 的 <head> 部分调用此函数
// <?php my_custom_document_title(); ?>
优势: 此方法提供最高的灵活性,你可以完全控制标题的拼接规则、分隔符和所有页面的逻辑。
方法二:使用过滤器直接重写归档标题
如果你主要想修改分类、标签、作者等归档页面的标题格式,而不想完全接管所有页面的标题输出,可以使用 WordPress 提供的过滤器。这通常用于美化或简化归档页面的标题,但请注意,此方法通常不用于控制整个站点的 <title> 标签,它主要影响通过 the_archive_title() 等函数输出的标题。
以下示例演示如何重写归档标题的显示内容:
add_filter( 'get_the_archive_title', function ($title) {
if ( is_category() ) {
// 分类页面:只显示分类名称
$title = single_cat_title( '', false );
} elseif ( is_tag() ) {
// 标签页面:只显示标签名称
$title = single_tag_title( '', false );
} elseif ( is_author() ) {
// 作者页面:显示作者名称,可添加额外HTML
$title = '' . get_the_author() . '';
} elseif ( is_post_type_archive() ) {
// 自定义文章类型归档页
$title = post_type_archive_title( '', false );
}
// 返回修改后的标题
return $title;
});
重要说明: 方法二中的 get_the_archive_title 过滤器主要用于修改在页面内容区显示的归档标题(如“分类:XXX”),它不会直接影响 <head> 中的 <title> 标签。要全局修改浏览器标签页和SEO中的标题,应使用方法一,或结合使用 document_title_parts 过滤器(这是更现代、更推荐的方法)。
推荐方法:使用 document_title_parts 过滤器(最佳实践)
对于 WordPress 4.4.0 及以上版本,最标准且非破坏性的自定义标题方法是使用 document_title_parts 过滤器。它允许你精细地修改标题的各个部分(如站点名称、页面标题、分隔符),而无需移除核心功能。
add_filter( 'document_title_parts', function( $title_parts ) {
// 修改标题数组中的特定部分
if ( is_singular() ) {
// 为单篇文章/页面标题添加前缀
$title_parts['title'] = '【精选】' . $title_parts['title'];
}
// 可以移除或修改站点名称部分
// unset( $title_parts['site'] );
// $title_parts['site'] = '我的网站';
return $title_parts;
});
这种方法无需调用 remove_action,保持了与核心功能和插件的更好兼容性,是当前自定义 WordPress 页面标题的首选方案。