WordPress主题制作全过程(五):制作header.php

Ludou
文章目录

     你可以尝试用文本编辑器打开从WordPress主题制作全过程(三):HTML静态模板制作下载到的 .html 文件,不知道你有没有发现他们头部的代码都非常的相似呢?其实我们可以提取这部分相似的代码,放到一个单独的文件header.php中,各个页面想用这部分代码的时候再用php的include包含进去,省的每个页面里面都要写这部分代码,更改起来也可以达到一改全改的目的。

     再次提醒:如果你不打算动手编写代码,这个系列教程就别看了,对你无益!

     接着我们上次创建的主题目录wp-content\themes\Aurelius,在该目录下新建一个php文件header.php,我们提取出index.php中的头部代码复制粘贴到header.php中,下面是的代码就是目前header.php中的所有代码了(当然不同主题的头部代码都是不一样,在你实际的项目中可以自定决定):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Aurelius | Blog</title>
<!-- Stylesheets -->
<link rel="stylesheet" href="./style.css" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper" class="container_12 clearfix">
    <!-- Text Logo -->
    <h1 id="logo" class="grid_4">Aurelius</h1>
    <!-- Navigation Menu -->
    <ul id="navigation" class="grid_8">
        <li><a href="contact.html"><span class="meta">Get in touch</span><br />
            Contact Us</a></li>
        <li><a href="blog.html" class="current"><span class="meta">Latest news</span><br />
            Blog</a></li>
        <li><a href="index.html"><span class="meta">Homepage</span><br />
            Home</a></li>
    </ul>
    <div class="hr grid_12 clearfix">&nbsp;</div>
    <!-- Caption Line -->
    <h2 class="grid_12 caption clearfix">Our <span>blog</span>, keeping you up-to-date on our latest news.</h2>
    <div class="hr grid_12 clearfix">&nbsp;</div>

     再用文本编辑器打开index.php、archive.php、contact.php、full_width.php、page.php和single.php,删掉以上类似代码,改成:

1
<?php get_header(); ?>

     好,现在打开你的测试博客主页,看看我们制作的主题是否还可以正常工作,答案是可以的,跟原来几乎没什么两样,但还是一片混乱。get_header()就相当于将header.php中的代码拷贝到当前的php文件。接下来,我们将仔细探讨header.php中的动态内容。header.php将会被所有的模板页面(主页、分类页、页面、标签页等)所包含,所以header.php中代码应该是动态,适合不同页面的,所以这里面需要用到PHP代码,而不是单纯的HTML。下面让我们一起来修改header.php:

1、更改<title>

     我们都知道不同页面的title都是不一样,而且title的设置还会直接影响到SEO的效果,所以这里应该谨慎设置。下面提供一种SEO优化的title写法,将<title>Aurelius | Blog</title>改成:

1
2
3
4
5
6
7
8
9
10
11
12
13
<title><?php if ( is_home() ) {
        bloginfo('name'); echo " - "; bloginfo('description');
    } elseif ( is_category() ) {
        single_cat_title(); echo " - "; bloginfo('name');
    } elseif (is_single() || is_page() ) {
        single_post_title();
    } elseif (is_search() ) {
        echo "搜索结果"; echo " - "; bloginfo('name');
    } elseif (is_404() ) {
        echo '页面未找到!';
    } else {
        wp_title('',true);
    } ?></title>

     以上添加的php代码运用了条件判断,针对不同的页面采用不同title,这里解释一下这几个条件标签。

  • is_home() :当前页面为主页时返回true
  • is_category():当前页面为分类页时返回true
  • is_single():当前页面为单文章页时返回true
  • is_page():当前页面为单页面时返回true
  • 更详细的内容参阅WordPress文档:条件标签

     到目前为止,可能你对这些条件判断标签还没有深入的认识,也搞不懂到底是用了这些标签会对主题造成怎样的影响的,随着我们教程的进一步深入,你会慢慢理解的。

2、更改样式表style.css路径

     在此之前你看到的首页都是混乱的,原因是还没加载css样式。现在我们一起把样式加上。你可以在header.php中找到这一段代码:

1
<link rel="stylesheet" href="./style.css" type="text/css" media="screen" />

     聪明的你可能问:wp-content\themes\Aurelius目录下不是已经有一个 style.css 吗?那为什么 header.php 没有加载css呢?结果你是可以看到的,页面一篇混乱,可以确定确实没有加载到css。因为这是WordPress的主题,是要被WordPress的主程序调用,经过层层解析才能把你的博客显示出来,而不是简简单单的html静态网页文件。正确的改法:

1
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />

     bloginfo('stylesheet_url')输出的是你的主题css文件绝对网址,如http://localhost/wp/wp-content/themes/Aurelius/style.css,WordPress程序会自动识别你的WordPress安装地址,当前启用的主题,自动输出这个style.css链接。现在你可以试着更改一下,然后刷新一下你的博客首页,查看网页源代码,style.css的链接是不是变成你的了?页面是否可以正常显示了呢?

     不过,还有几张图片的路径不对,还不能显示出来,现在我们一起用文本编辑器打开index.php、archive.php、contact.php、full_width.php、page.php和single.php,给这些图片加上正确的URL,搜索代码,将所有的:src="images/,批量替换成src="<?php bloginfo('template_url'); ?>/images/。现在再刷新你的主页,看文章的缩略图610×150是否可以正常显示。<?php bloginfo('template_url'); ?>用于输出主题目录的URL。

3、添加pingback

     至于什么是pingback,你可以在搜索引擎中输入关键字WordPress pingback,就可以得到你想要的答案了。如果你需要这个功能,可以将在<head>里面添加代码:

1
<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />

4、更改博客名称和描述

     在header.php,下面两行代码用于显示博客名称和描述:

1
2
<h1 id="logo" class="grid_4">Aurelius</h1>
<h2 class="grid_12 caption clearfix">Our <span>blog</span>, keeping you up-to-date on our latest news.</h2>

     上面是静态代码,现在做如下修改:

1
2
<h1 id="logo" class="grid_4"><a href="<?php echo get_option('home'); ?>/"><?php bloginfo('name'); ?></a></h1>
<h2 class="grid_12 caption clearfix"><?php bloginfo('description'); ?></h2>

     现在你的博客首页看到的就是你博客名称和描述了,并且logo也是一个链接指向你的博客首页。我们这里说说这些php代码的作用。

  • <?php echo get_option('home'); ?>  输出你的博客首页网址
  • <?php bloginfo('name'); ?>  输出你的博客名称
  • <?php bloginfo('description'); ?>  输出博客描述

     博客名称和描述可以在WordPress管理后台 – 设置 – 常规那里更改。以后制作你自己的WordPress主题的时候,你可参照上面的说明对你的主题进行修改。

5、添加订阅feed链接

     相信每个已发布的WordPress博客主题都会提供feed订阅,当然我们的主题也应该提供这样的功能。在</head>之前添加以下代码:

1
2
<link rel="alternate" type="application/rss+xml" title="RSS 2.0 - 所有文章" href="<?php echo get_bloginfo('rss2_url'); ?>" />
<link rel="alternate" type="application/rss+xml" title="RSS 2.0 - 所有评论" href="<?php bloginfo('comments_rss2_url'); ?>" />

6、添加wp_head

     有些插件需要在网页头部添加一些js或css,要让这些插件能够正常的工作,也让你的主题有更好的兼容性,你应该添加wp_head()函数。打开header.php,在</head>前面添加以下代码即可:

1
<?php wp_head(); ?>

     现在打开你的博客主页,查看源代码,</head>前面是不是多了以下类似代码(这些都是wp_head()的功劳):

1
2
3
4
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://ludou.co.tv/blog/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://ludou.co.tv/blog/wp-includes/wlwmanifest.xml" />
<link rel='index' title='露兜实验室' href='http://ludou.co.tv' />
<meta name="generator" content="WordPress 2.9.2" />

7、添加Description 和 Keywords

     关于添加网页描述和关键字,可以查看我之前写过的文章:WordPress使用经验(一)独立的Description 和 Keywords

8、显示菜单栏

     目前菜单栏有Home、Blog和Contact Us几个菜单,不过这些都是静态的内容,并不是你博客上的页面。现在我们将菜单栏换成你的菜单,这里只在菜单栏中列出页面page,当然你也可以再放置分类,根据你的喜好来吧,将header.php中:

1
2
3
4
5
6
7
8
<ul id="navigation" class="grid_8">
    <li><a href="contact.html"><span class="meta">Get in touch</span><br />
        Contact Us</a></li>
    <li><a href="blog.html" class="current"><span class="meta">Latest news</span><br />
        Blog</a></li>
    <li><a href="index.html"><span class="meta">Homepage</span><br />
        Home</a></li>
</ul>

改成:

1
2
3
4
<ul id="navigation" class="grid_8">
    <?php wp_list_pages('depth=1&title_li=0&sort_column=menu_order'); ?>
    <li <?php if (is_home()) { echo 'class="current"';} ?>><a title="<?php bloginfo('name'); ?>"  href="<?php echo get_option('home'); ?>/">主页</a></li>
</ul>

     具体如何在菜单栏显示分类,你可以看这篇文章,有什么问题再给我留言:WordPress 分类做导航栏,并高亮显示

另外,可以参考这两个函数的说明(英文):

9、刷新缓存

在<body>前面,</head>后面添加PHP代码,用于提高程序运行效率:<?php flush(); ?>

总结

     好了,本次练习到此结束!现在总结一些今天讲到的比较重要的知识点:

  • <?php get_header(); ?> 从当前主题文件夹中包含header.php文件
  • is_home(),is_single(),is_category()等几个条件判断标签
  • <?php bloginfo('stylesheet_url'); ?> 输出主题文件夹中style.css文件的路径
  • <?php bloginfo('pingback_url'); ?> 输出博客pingback网址
  • <?php bloginfo('template_url'); ?> 输出博客主题目录URL
  • <?php echo get_option('home'); ?> 输出你的博客首页网址
  • <?php bloginfo('name'); ?> 输出你的博客名称
  • <?php bloginfo('description'); ?> 输出博客描述
  • <?php wp_head(); ?> 用于包含WordPress程序输出头部信息
  • <?php wp_list_categories(); ?> 用于列出博客分类页
  • <?php wp_list_pages(); ?> 用于列出博客页面

     到目前为止你的博客还只能看到主页,不要灰心,凡事一步一个脚印,以后教程会慢慢深入的。最后提供经过本次修改后的Aurelius主题文件,你可以用文本编辑器打开看看,跟你修改的文件比较比较(尤其是header.php),看看你改得怎么样?

下载此文件

WordPress主题制作全过程完整列表:

本文版权归露兜博客所有,转载引用请完整注明以下信息:
本文作者:Ludou
本文标题:WordPress主题制作全过程(五):制作header.php
本文地址:http://www.ludou.org/create-wordpress-themes-header.html

露兜博客博主,男生,业余Web程序员,儒家思想受益者。文采不佳,不喜欢聚光灯,不喜欢吹牛,不喜欢无序的做事方式。闲时喜欢写些代码自娱自乐,并在博客中分享一些个人技术经验。

标签: , ,

30 条评论

我来说两句
  1. 自由人

    做主题其实函数这些的其实并不难,难还是在设计这块

    • Ludou

      非常正确!一款好的主题,关键还是要有好的设计灵感,设计一个令人赏心悦目的界面,毕竟人们看到的还是你的界面,并不是你后面的程序代码是怎么执行的!
      现在我也想自己做个主题,但是我并不擅长设计,很遗憾。

  2. hiro

    其实一个index.php文件加style.css就可以实现一个完整的主题了

  3. hiro

    可以看看我的第三主题:delicious风格的,就很简单
    http://www.ihiro.org/my-third-theme-innernews

  4. 老衲

    <?php if (is_home()) { echo 'class="current"';} ?> 这个什么意思里?

    • Ludou

      如果是主页的话,输出 class="current" ,即高亮的CSS类,在该主题中是一个向下的箭头。

      <li <?php if (is_home()) { echo 'class="current"';} ?>><a title="<?php bloginfo('name'); ?>" href="<?php echo get_option('home'); ?>/">主页</a></li>

      如果主页,该PHP语句翻译成HTML为:

      <li class="current"><a title="博客名称" href="首页网址/">主页</a></li>

  5. 千里眼

    这个教程对我帮助很大,谢谢了!

  6. 皇家元林

    是不是你的流量太高了
    主机承受不了了
    老是连不上。。。

  7. 青刀刀

    教程真的很优秀,我目前在学着制作。
    有个问题求教博主:

    我试着自己做个导航,但是“首页”都是排在最后一个。其他的标题可以在后台order里设置顺序,首页怎么放到第一个位置呢?
    希望博主抽空指导。

    谢谢

    • Ludou

      如果你是直接用HTML来输出导航栏的话,你可以将“首页”所在的块移到其他栏目的前面或后面。如本文第8点,把代码改成:

      <ul id="navigation" class="grid_8">
      <li <?php if (is_home()) { echo 'class="current"';} ?>><a title="<?php bloginfo('name'); ?>" href="<?php echo get_option('home'); ?>/">主页</a></li>
      <?php wp_list_pages('depth=1&title_li=0&sort_column=menu_order'); ?>
      </ul>

  8. yesureadmin

    希望写一个文章,就是如果把主题里的动态调用语句改成纯静态的,我渴望速度

  9. mingwu

    我最近都在学php基础。基本上弄懂了php的工作方式。但看到这我就不懂了。
    <?php get_header(); ?> 这里的 get_header()是一个php内置函数,还是自定义的函数?
    可是我看的一本书《php与Mysql基础教程》美国人 Larry Ullman写的,都用
    include()函数导入文件。
    比如说我先弄好头部header.php。然后用
    include(header.php)导入也行呀。
    这和get_header()有什么呢?

    ps:明武

    • Ludou

      get_header()是WordPress内置的函数,实现的功能与include(header.php)类似,不同的是include()可以指定包含的文件名,而get_header()只能包含当前启用的主题目录下的header.php,或者header-xxx.php

      get_header()函数的定义在wordpress的wp-includes/general-template.php

      查找function get_header就可以看到了。另外关于get_header()的文档说明见:
      http://codex.wordpress.org/Function_Reference/get_header

  10. Sunday

    我折腾了好久,我的菜单还是搞不定~~~~~~~~~~~~~~~~就是不好看!

  11. zero

    并没有你说的效果,我新装的wp,只有2个页面,装上你说的主题之后,改完html,点击链接全是404,未找到,唉

    • Ludou

      本文是WordPress主题制作系列教程的一部分,并不提供的完整的主题。文中也并没有告诉你会有什么效果,但是末尾有一句话"到目前为止你的博客还只能看到主页,不要灰心,凡事一步一个脚印,以后教程会慢慢深入的。"不知道你有没有看到!

  12. zero

    ('template_url'); ?>这个分号和问号之间有没有空格?怎么替换了还是小红叉?

    • Ludou

      看来你是没有任何PHP基础的。
      src="<?php bloginfo('template_url'); ?>/images/xxx.gif"
      有空格的。

      请确保主题目录下的images文件夹下有对应的图片,以及图片的路径是否正确。还有问题,请在文末下载修改后的主题文件作为参考。

  13. uu

    问下博主,你用的那款代码高亮插件

  14. xysemies

    请问,如果我内页加了几个JS,我不想在内页调用怎么办?
    就是我想首页一个header,内页一个header。
    谢谢了

  15. xysemies

    受益匪浅,谢谢。比水煮鱼的讲得更详细。

发表评论

因博主长期在外地出差,您的留言可能暂时不会得到回复。

订阅评论