WordPress 主题 Header 模板

原文:The WordPress Theme Header Template

原文作者:Ian Stewart

译文:WordPress 主题 Header 模板

译文作者:Young

现在我们进一步学习如何创建 header.php 以及如何验证 HTML 主题。这个教程将会有很多 PHP 代码,但是不用失望。同时,我们将学习两个必需的搜索引擎优化技巧,并开始通过 functions.php 文件来装饰您的主题。

Head 部分

此刻您的空白 WordPress 主题还没有通过技术验证,因为它缺乏一个文档来告诉浏览器如何解释 HTML 语言。我们将使用 XHTML 过渡文档 —— 当然还有其他的文档,但是 XHTML 是最好的。

打开 header.php 文件,并把以下代码粘贴到最顶部:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

同时,我们将为 HTML 标签添加一些属性,以便页面更加适合浏览器。用以下代码替代 “<html>” 标签:

  1. <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>

现在我们正在创建 WordPress 主题的 <head> 部分。<head> 部分包括网页的元信息。例如出现于浏览器最顶部(和搜索引擎搜索结果)的文件名、样式表和 RSS Feed 的链接。

先打开 functions.php 文件,我们准备添加一些有用的功能,这些功能用于为文件标题提供页面号码。

先在 functions.php 添加:

  1. <?php

然后添加以下代码:

  1. // Make theme available for translation
  2. // Translations can be filed in the /languages/ directory
  3. load_theme_textdomain( ‘your-theme’, TEMPLATEPATH . ‘/languages’ );
  4.  
  5. ?
  6. $locale = get_locale();
  7. $locale_file = TEMPLATEPATH . "/languages/$locale.php";
  8.  
  9. if ( is_readable($locale_file) )
  10.         require_once($locale_file);
  11. ?
  12. // Get the page number
  13. function get_page_number() {
  14.  
  15.     if ( get_query_var(‘paged’) ) {
  16.         print ‘ | ‘ . __( ‘Page ‘ , ‘your-theme’) . get_query_var(‘paged’);
  17.  
  18.     }
  19. } // end get_page_number
  20.  

第一个功能告诉 WordPress 我们希望我们的主题可以被翻译成不同的语言,翻译文件可以在主题目录的 “languages”文件夹里面找到。如果您准备创建一个 WordPress 主题,就应该尽量使得主题所有的内容都可以翻译。您永远不会知道自己或者别人什么时候需要用另外一种语言显示硬编码内容。

对于下一个功能 get_the_page_number(), 您将会看到一些翻译文本,例如:

  1. __( ‘Page ‘ , ‘your-theme’)

可以翻译的文本是主题名(your-theme) 前面的 “Page”。直截了当,但是还有其他方式可以写翻译文本,以后用到的时候我们再作说明。

您可以猜测 get_page_number() 是做什么用到吗?如果您看功能里面的代码,您会发现我们在检查一个 IF 语句是否一个编好号的页面。当您点击 “较旧的文章”的时候,这个功能就会在地址栏显示当前页面号码。

如果您对 PHP 很陌生,我希望您记住双斜杠后面的所有内容都是被忽略的,只作为一个注释。后面您会看到很多双斜杠。

现在我们回到 header.php 文件。

用以下代码替代 <head></head>

  1. <head profile="http://gmpg.org/xfn/11">
  2.     <title><?php
  3.         if ( is_single() ) { single_post_title(); }      
  4.         elseif ( is_home() || is_front_page() ) { bloginfo(‘name’); print ‘ | ‘; bloginfo(‘description’); get_page_number(); }
  5.  
  6.         elseif ( is_page() ) { single_post_title(”); }
  7.         elseif ( is_search() ) { bloginfo(‘name’); print ‘ | Search results for ‘ . wp_specialchars($s); get_page_number(); }
  8.  
  9.         elseif ( is_404() ) { bloginfo(‘name’); print ‘ | Not Found’; }
  10.  
  11.         else { bloginfo(‘name’); wp_title(‘|’); get_page_number(); }
  12.     ?></title>
  13.  
  14.  
  15.  
  16.         <link rel="stylesheet" type="text/css" href="<?php bloginfo(‘stylesheet_url’); ?>" />
  17.  
  18.         <?php if ( is_singular() ) wp_enqueue_script( ‘comment-reply’ ); ?>
  19.  
  20.  
  21.         <?php wp_head(); ?><link rel="alternate" type="application/rss+xml" href="<?php bloginfo(‘rss2_url’); ?>" title="<?php printf( __( ‘%s latest posts’, ‘your-theme’ ), wp_specialchars( get_bloginfo(‘name’), 1 ) ); ?>" />
  22.  
  23.         <link rel="alternate" type="application/rss+xml" href="<?php bloginfo(‘comments_rss2_url’) ?>" title="<?php printf( __( ‘%s latest comments’, ‘your-theme’ ), wp_specialchars( get_bloginfo(‘name’), 1 ) ); ?>" />
  24.  
  25.         <link rel="pingback" href="<?php bloginfo(‘pingback_url’); ?>" />       
  26. </head>
  27.  
  28.  

如果您觉得这些代码像教条,没关系,我会重点解释。

一个搜索引擎优化的标题只包含单独日志和静态页面的标题。当然,还要通过 get_page_number() 显示 “较旧文章”页面的页号。

  1.  <title><?php
  2.         if ( is_single() ) { single_post_title(); }      
  3.         elseif ( is_home() || is_front_page() ) { bloginfo(‘name’); print ‘ | ‘; bloginfo(‘description’); get_page_number(); }
  4.  
  5.         elseif ( is_page() ) { single_post_title(”); }
  6.         elseif ( is_search() ) { bloginfo(‘name’); print ‘ | Search results for ‘ . wp_specialchars($s); get_page_number(); }
  7.  
  8.         elseif ( is_404() ) { bloginfo(‘name’); print ‘ | Not Found’; }
  9.  
  10.         else { bloginfo(‘name’); wp_title(‘|’); get_page_number(); }
  11.     ?></title>

下面是一些关于页面内容的元信息:

  1. <meta http-equiv="content-type" content="<?php bloginfo(‘html_type’); ?>; charset=<?php bloginfo(‘charset’); ?>" />

样式表链接:

  1. <link rel="stylesheet" type="text/css" href="<?php bloginfo(‘stylesheet_url’); ?>" />

以下这个脚本的调用让我们可以使用评论功能:

  1. <?php if ( is_singular() ) wp_enqueue_script( ‘comment-reply’ ); ?>

调用插件和其他功能的代码:

  1.         <?php wp_head(); ?>

RSS Feed 和 Pingback 链接:

  1. <link rel="alternate" type="application/rss+xml" href="<?php bloginfo(‘rss2_url’); ?>" title="<?php printf( __( ‘%s latest posts’, ‘your-theme’ ), wp_specialchars( get_bloginfo(‘name’), 1 ) ); ?>" />
  2.  
  3.         <link rel="alternate" type="application/rss+xml" href="<?php bloginfo(‘comments_rss2_url’) ?>" title="<?php printf( __( ‘%s latest comments’, ‘your-theme’ ), wp_specialchars( get_bloginfo(‘name’), 1 ) ); ?>" />
  4.  
  5.         <link rel="pingback" href="<?php bloginfo(‘pingback_url’); ?>" />

Header 部分

现在我们想在博客上添加标题,链接到主页并且显示博客描述和菜单。

我们将在 hearder.php 的 #branding DIV 标签里面添加博客标题和描述。但是我们将做得和其他大多数的主题有点不一样。

您会发现很多 WordPress 主题都会告诉搜索引擎每个页面最重要的东西是博客标题。这些主题通过 h1 标签来打包标题,h1 标签意味著“这个页面就是讲这个的”。我和其他一小部分主题开发者认为这是一个坏主意。例如,定义您现在看到这个页面最重要的文本不是 “ThemeShaper” 而是 “WordPress 主题 Header 模板”。而在主页,最重要的东西是博客的描述。博客的描述实际上总体描述了博客的所有内容。

幸运的是,这个很容易做到。

我们用 WordPress 的条件标签以及简单的 HTML 代码来设置博客标题以及描述:

  1.                 <div id="branding">
  2.                                 <div id="blog-title"><span><a href="<?php bloginfo( ‘url’ ) ?>/" title="<?php bloginfo( ‘name’ ) ?>" rel="home"><?php bloginfo( ‘name’ ) ?></a></span></div>
  3.  
  4. <?php if ( is_home() || is_front_page() ) { ?>
  5.                                 <h1 id="blog-description"><?php bloginfo( ‘description’ ) ?></h1>
  6.  
  7. <?php } else { ?>       
  8.                                 <div id="blog-description"><?php bloginfo( ‘description’ ) ?></div>
  9.  
  10. <?php } ?>
  11.                         </div><!– #branding –>
  12.  
  13.  

所以,博客标题通过一个简单的 DIV 标签搞定,博客描述则通过 PHP 语句和一些 WordPress 条件标签实现,要不使用主页或者首页的非常重要的 h1 打包描述,要不就使用其他页面的 DIV 标签里面的相关标题。

对初学者来讲,现在最好回过头看看我们的代码。在上面的代码里面,我们使用了 WordPress 的模板标签 bloginfo() 用来获取 WordPress 博客的 URL、名称和描述。它可以用来获取 WordPress 博客 20 多种不同的信息。理解这个就理解了 WordPress 主题。我们通过 HTML 结构、包含 PHP 代码的 WordPress 模板标签来实现这种功能。真的很简单。只要见惯那些模板标签以及一些 IF 语句和一些 PHP 循环。

在 #access DIV 标签里面,我们会添加一个跳转链接,以便别人通过屏幕阅读器浏览您的博客的时候可以跳过菜单直接看文章内容。

  1. <div class="skip-link"><a href="#content" title="<?php _e( ‘Skip to content’, ‘your-theme’ ) ?>"><?php _e( ‘Skip to content’, ‘your-theme’ ) ?></a></div>

添加页面菜单很简单,只有一个模板标签,一个函数:

  1.                 <?php wp_page_menu( ‘sort_column=menu_order’ ); ?>

很简单,对吧?所以您的 #access DIV 标签应该像这样子:

  1.                 <div id="access">
  2.                                 <div class="skip-link"><a href="#content" title="<?php _e( ‘Skip to content’, ‘your-theme’ ) ?>"><?php _e( ‘Skip to content’, ‘your-theme’ ) ?></a></div>
  3.  
  4.                                 <?php wp_page_menu( ‘sort_column=menu_order’ ); ?>                     
  5.                         </div><!– #access –>
  6.  
  7.  

至此,您的 WordPress 主题的 Header 模板已经是经过搜索引擎优化的了。

如何创建 WordPress 主题

这篇文章是如何创建 WordPress 主题教程系列的其中一部分,该系列将会教您如何从零开始创建强大的 WordPress 主题。建议您从头开始阅读这个系列并自己动手编写一些漂亮的代码。

相关博文:

  1. 创建 WordPress 主题 HTML 结构
  2. WordPress 主题模板和目录结构
  3. WordPress 主题之单独日志、附档和 404 模板
  4. WordPress 主题之搜索模板和静态页面模板
  5. 如何创建 WordPress 主题

此文发表于 博客技术 以及标签 , , ; 收藏永久链接. 发表评论或者留下引用: 引用链接.
Post comment as twitter logo facebook logo
Sort: Newest | Oldest

发完评论,某些代码吞了,郁闷
1、单引号全角 和 单引号半角 ,发现在发完评论后对会变成上一条显示状态,大家知道什么意思就成了;

2、两个错误的PHP注释分别是,branding 和access结尾的地方的注释,大家看看代码就看到了,非常明显。这两个代码也吞了~

害我再发一遍评论,老大不要打我啊~

主要问题:
1、老外原文博客里德引号就是用的全角,所以这边直接复制就全错了,‘ ----全角的and '-----半角的区别还是非常明显的;这个问题解决了,validator.w3.org那就不会报“停顿错误”了。

2、 这个PHP注释,真揪心应该是 不知道前者是什么状态下的横杠杠;问题同上,真纠结~~

3、functions.php最后一行,缺个结束标记 ?&gt;,老外博客里也是缺,不知道是否故意的。(锻炼我们自己敲代码?),我觉得结束标记是必须的,也不麻烦。php的简写也仅仅是,还得服务器支持简写,,好像扯远了。

4、大家注意删除function.php代码行里的两个? ,否则验证代码有你好看的,呵呵~

5、meta元标记加在CSS引用语句之前,尽管后面单独提起说明。但是逻辑中断了,琢磨郁闷了好久。

大家把这几个问题注意下,是可以完全通过验证的。不知道Vicia同学遇到别的什么揪心问题了~

博主估计那个单引号问题改起来麻烦些,其他的做个注释好些。或者批量替换下挺方便的。我用的编辑器是notepad++.

还有个学习疑惑,把代码直接复制进我的编辑器里,多了很多#,都出现在代码换行的地方,估计是识别不了带忙行前的数字。害得我手工把#个个删除~~

嗯,我爱水煮鱼那个教程简单些,学完后在代码布局与结构方面不太够用。正在学习精品博客这个,孔老二说:学而不思则罔,思而不学则殆。看到Header模板这篇就深刻感受到了尽信书不如无书鸟~我爱水煮鱼那个系列教程学习中发现不下5处明显代码错误,学习的过程还得不断改错啊,就像读某些计算机编程类图书时候一样,一边看一遍改,不知道校对怎么弄的 ^_^

温故而知新,精品博客的这个WP主题设计系列很给力,正在全力突破!

呃,后来问题没有解决,就没有再继续下去。感觉这一篇偏难。还是水煮鱼的那套更适合我。&gt;&lt;

1. 这篇结束后,我的主题无法预览,在浏览器显示title那里出现了很长的错误代码,大致是说function那里有问题。但是我和这里给的代码对过了。都一样的说。@_@
2. 原文中,“用以下代码替代 ‘head’‘/head’:”(为避免代码被吞掉,用引号代替了)这句话下面的code里,没有meta信息呀,在后面的解释里才有。所以第一次看文章的时候在这里迷惑了好久。
3. 关于code的显示,我很喜欢这篇文章的风格:http://uicss.cn/adding-reply-functions-in-comments...;:)
4. 对于“...也没事”的说法,我不是很认同,我还是更赞成用最严谨的代码去处理主题。就像也说得通,但还是用更规范的一样。严谨没有错,不是么?^_^

branding下的php没有用分号。我好像都没致谢,还一个劲儿挑错。&gt;&lt;

function那里,php不需要关闭么?@_@ 没太看明白。
另外,view code视野太窄,总是出现滚动条,很影响阅读情绪。&gt;&lt;

发完评论,某些代码吞了,郁闷
1、单引号全角 和 单引号半角 ,发现在发完评论后对会变成上一条显示状态,大家知道什么意思就成了;

2、两个错误的PHP注释分别是,branding 和access结尾的地方的注释,大家看看代码就看到了,非常明显。这两个代码也吞了~

害我再发一遍评论,老大不要打我啊~

主要问题:
1、老外原文博客里德引号就是用的全角,所以这边直接复制就全错了,‘ ----全角的and '-----半角的区别还是非常明显的;这个问题解决了,validator.w3.org那就不会报“停顿错误”了。

2、 这个PHP注释,真揪心应该是 不知道前者是什么状态下的横杠杠;问题同上,真纠结~~

3、functions.php最后一行,缺个结束标记 ?>,老外博客里也是缺,不知道是否故意的。(锻炼我们自己敲代码?),我觉得结束标记是必须的,也不麻烦。php的简写也仅仅是,还得服务器支持简写,,好像扯远了。

4、大家注意删除function.php代码行里的两个? ,否则验证代码有你好看的,呵呵~

5、meta元标记加在CSS引用语句之前,尽管后面单独提起说明。但是逻辑中断了,琢磨郁闷了好久。

大家把这几个问题注意下,是可以完全通过验证的。不知道Vicia同学遇到别的什么揪心问题了~

博主估计那个单引号问题改起来麻烦些,其他的做个注释好些。或者批量替换下挺方便的。我用的编辑器是notepad++.

还有个学习疑惑,把代码直接复制进我的编辑器里,多了很多#,都出现在代码换行的地方,估计是识别不了带忙行前的数字。害得我手工把#个个删除~~

嗯,我爱水煮鱼那个教程简单些,学完后在代码布局与结构方面不太够用。正在学习精品博客这个,孔老二说:学而不思则罔,思而不学则殆。看到Header模板这篇就深刻感受到了尽信书不如无书鸟~我爱水煮鱼那个系列教程学习中发现不下5处明显代码错误,学习的过程还得不断改错啊,就像读某些计算机编程类图书时候一样,一边看一遍改,不知道校对怎么弄的 ^_^

温故而知新,精品博客的这个WP主题设计系列很给力,正在全力突破!

很杯具,引号全都错了,全部都是全角

@Centiyo 谢谢指正。

从哪儿复制的啊,这么多错误.引号全是全角的

呃,后来问题没有解决,就没有再继续下去。感觉这一篇偏难。还是水煮鱼的那套更适合我。><

@Vicia 你可以和原作者直接联系啊,他还有一个论坛是专门讨论他那个 WordPress 主题的。

看着别人的开始做,实践就是最好的学习,Young做博客很用心哈,祝早日能博客赚钱做Soho…

@Mr.Chen 在 PHP 上,我还真的有很多要学。现在作为一个自由职业者,赚钱的问题将会一直困绕着我,这是不得不考虑的,毕竟那么大个人再向父母借钱就不好意思了,所以,我会做些不同的尝试,如果突然走错了,还望你多加提醒。你也换了一个黑白主题了,恭喜!

@Vicia 哈哈,难怪我不会做主题,复制粘贴多了。你的主题现在可以用了吗?

我用的是Vim。我不是粘贴,我是自己照着这儿说的敲的。因为我觉得粘贴没有用,自己还是什么都记不住,不如写一遍好。

汗,写着写着又忘记了。我是说:就像(‘br’)也说得通,但还是用(‘br /’)更规范的一样。

1. 这篇结束后,我的主题无法预览,在浏览器显示title那里出现了很长的错误代码,大致是说function那里有问题。但是我和这里给的代码对过了。都一样的说。@_@
2. 原文中,“用以下代码替代 ‘head’‘/head’:”(为避免代码被吞掉,用引号代替了)这句话下面的code里,没有meta信息呀,在后面的解释里才有。所以第一次看文章的时候在这里迷惑了好久。
3. 关于code的显示,我很喜欢这篇文章的风格:http://uicss.cn/adding-reply-functions-in-comments...;:)
4. 对于“...也没事”的说法,我不是很认同,我还是更赞成用最严谨的代码去处理主题。就像也说得通,但还是用更规范的一样。严谨没有错,不是么?^_^

@Vicia 你用的是什么编辑器啊?我用 DreamWeaver 粘贴作者的代码的时候,保存之后再打开就会出现一些多余的问号,如果你碰到的也是这种情况,把那些多余的问号去掉应该就可以了。
CK's blog 用的应该是 “coolcode”,我有在精博上尝试过,不过效果不好(最右边不能显示边框),所以就没有用了。关于严谨嘛,它的确没有错。

@Vicia 哈哈,可见你是一个好学的同学。我对 PHP 是一知半解,看能回答多少就回答多少吧。

1、 function那里,php不需要关闭么?—— 你是对的,应该关闭,但是好像不关闭也没事。
2、view code视野太窄 —— 哈哈,这个我没有办法,要请插件作者出马才行。WP-codebox 是我目前能找到的最好的插件,如果你有更好的,欢迎推荐。
3、“head”那段代码里少了“meta”信息 ——文章里面是有的啊。
4、branding下的 php 没有用分号 —— 对此我只能哑口无言,因为没有分号它也照样没事。

看了下原作者的文章,里面确实也没有分号,而且没有分号的语句里面(和‘之间还有一个空格。为什么这些语句要这样写呢?有什么特别的原因么?

branding下的php没有用分号。我好像都没致谢,还一个劲儿挑错。><

汗,我的代码被吞掉了。我是说“head”那段代码里少了“meta”信息。

那段代码里面漏了哦。^^

function那里,php不需要关闭么?@_@ 没太看明白。
另外,view code视野太窄,总是出现滚动条,很影响阅读情绪。><