WordPress 主题教程 #5:主循环
2007年06月05日
调用博客日志的主循环(The Loop)是 WordPress 中最重要的 PHP 代码集,几乎所有的页面都会用到它。这也是从零开始创建 WordPress 主题系列教程的第五篇。
在开始继续学习之前,我们先复习下到目前为止学到了什么?
到目前为止,我们已经学到::
现在让我们开始第五篇:主循环(The Loop)
打开 Xampp,“tutorial”主题文件夹,浏览器,并且在浏览器中转到 http://localhost/wordpress,最后打开 index.php 文件。
下面应该是这时候 index.php 文件中的内容:

记住,为了学习这些代码,请尽量手工输入而不是拷贝和粘贴。
第1步:创建 container Div
在 header DIV 标签下添加一个 DIV 标签,并给它的 ID 赋值为 “container”,如下:
<div id=”container”>
</div>
“container” 这个 DIV 标签是用把博客的主要内容和其他东西都区分开,比如 sidebar 和 footer 等。
第2步:输入主循环代码
在 Container 的 DIV 标签中添加如下代码:
<?php if(have_posts()) : ?><?php while(have_posts()) : the_post(); ?>
<?php endwhile; ?>
<?php endif; ?>
这段代码就是 WordPress 中的主循环(The Loop)。在详细解释这些代码作用之前,我们来看下现在 index.php 所包含的代码:

你可能已经注意到Container DIV 中的每一行都被缩进了,这是为了更好的组织代码,更加利于阅读(使用 tab 健而不是空格键进行代码缩进,)。
刚才发生了什么?
- if(have_posts()) - 检查博客是否有日志。
- while(have_posts()) - 如果有日志,那么当博客有日志的时候,执行下面 the_post() 这个函数。
- the_post() - 调用具体的日志来显示。
- endwhile; - 遵照规则 #1,这里用于关闭 while()
- endif; - 关闭 if()
- 注释:并不是所有的代码都需要两部分用来打开和关闭。有些代码能够自我关闭,这就解释了 have_posts() 和 the_post(); 这两个函数。因为 the_post(); 在 if() 和 while() 的外面,只需要分号去结束或者关闭。
第3步:调用日志标题
在前面的课程中,我们学习了使用 bloginfo('name') 去调用博客的标题。现在我们将学习在主循环(The Loop)中如何调用日志标题。
在 the_post(); ?> 的后面和 <?php endwhile; ?> 的前面输入 <?php the_title(); ?>

保存 index.php 文件并刷新浏览器,这时候应该看到在博客描述的下方出现 Hello World ,默认安装 WordPress 之后,博客只有一篇日志。而我的测试的博客有多篇日志,所以这里有多个日志标题,而且因为我所用的日志标题是一样的,我也没有进行组织整理他们,所以它们看起来像很长的一行 Hello World。

第4步:给日志标题加上链接
把日志标题转变成日志标题链接。还记得怎样吧博客的标题转变成一个链接的?
在<?php the_title(); ?> 两边增加 <a href=”#”> 和 </a>。
保存并刷新你的浏览器。现在日志的标题都变成了链接了,但是它们并没有指向哪里。为了使得每个标题都能指向正确的日志,我们需要把 # 替换为 the_permalink()。
<a href=”<?php the_permalink(); ?>“><?php the_title(); ?></a>
the_permalink() 是用来调用每篇日志地址的 PHP 函数。保存并刷新浏览器。
如果只有一个 Hello World 标题,把鼠标移到链接上面,观察你的浏览器底部的状态栏,他不再是 http://localhost/wordpress/#。
如果有不止一个的标题链接,我们将看到每个链接会链到不同的日志或者网页。但是我们的日志标题依然在同一行上面。为了分开它们,在日志标题链接代码的两边添加 <h2> 和 </h2> 标签。
<h2><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h2>
记住 H1 用作你的博客的标题,那是网页的标题。H2 被用作子标题。现在你的日志标题链接是子标题了,每一个都是一行。保存 index.php 文件并刷新浏览器,结果如下:

WordPress 主循环就介绍到这里,现在 index.php 文件内容应该是:
WordPress 主题教程
- WordPress 主题教程:从零开始制作 WordPress 主题
- WordPress 主题教程 #1:介绍
- WordPress 主题教程 #2:模板文件和模板
- WordPress 主题教程 #3:开始 Index.php
- WordPress 主题教程 #4a:Header 模板
- WordPress 主题教程 #4b:Header 模板 2
- WordPress 主题教程 #5:主循环
- WordPress 主题教程 #5b:日志内容
- WordPress 主题教程 #5c:日志元数据
- WordPress 主题教程 #5d:Else,日志 ID,链接标题
- WordPress 主题教程 #5e:日志导航链接
- WordPress 主题教程 #6:侧边栏
- WordPress 主题教程 #6b:页面链接列表
- WordPress 主题教程 #6c:存档和链接列表
- WordPress 主题教程 #6d:搜索框和日历
- WordPress 主题教程 #6e:窗体化侧边栏
- WordPress 主题教程 #7:尾部
- WordPress 主题教程 #8:验证 XHTML
- WordPress 主题教程 #9:Style.css 和 CSS 介绍
- WordPress 主题教程 #10:十六进制颜色代码和样式化链接
- WordPress 主题教程 #11:宽度和布局
- WordPress 主题教程 #12:日志样式化和其他杂项
- WordPress 主题教程 #13:样式化侧边栏
- WordPress 主题教程 #14:底部和拆分 Index
- WordPress 主题教程 #15:子模板文件
- WordPress 主题教程 #16:留言模板
- erdaoo 的 WP Theme 教程学习笔记
- WordPress 主题教程电子书下载
翻译自:http://www.wpdesigner.com/2007/02/25/wp-theme-lesson-5-the-loop/,并根据中文习惯和个人理解做了修改!
27 条评论 添加你的评论 →


1. Denis | 2007:06:05 - 23:53:59 | #
I don’t know what is your meaning, the post is translated by myself. Why you think I copied it from you?
2. Denis | 2007:06:05 - 23:56:54 | #
And I don’t think I need to copy it from you! Please take care your words!!
3. 紫天 | 2007:06:06 - 02:01:53 | #
没来得岌细看。刚外出回来有点困,先转了一下:-)
大概看了下留言…英文的还真不好理解。难道Leon就是你说那个认为你抄他的人?
用翻译引擎说的一段E文,看到偶自己都汗死,中国英语…哈哈
Do HI , Leon , the technology document asking your translation please mind dodging to watch the once , linking address occasionally? Excuse me ,you whether or not Chinese? I think of ought to yes. I work out Chinese you are not bad watch know or not? Hope that you can use Chinese MSG|WTG next time, English watches such that I am very tired oh.
4. Remex | 2007:06:06 - 08:05:22 | #
不知道具体什么情况,不过既然是中国人和中国人说话难道必须要用英文吗?如果不是特殊情况,有人这么和我说话我肯定直接不理睬的。
这篇原文本来也不难,我对比了下,也找不出抄袭的迹象,不过这种已经有人翻译了的文章如果是我搜索到了的话一般都略过了,一个是避免重复劳动,二个就是避免出现这种问题。水煮鱼们翻译的文章都非常实用,希望以后继续加油,毕竟没有翻译的好文章太多太多了。
5. yogoslavia | 2007:06:06 - 13:49:32 | #
不喜,莱昂,技术文件要求你的翻译,请记逃废观看一次, 连接地址偶然? 对不起,你是否中国人? 我想应该不错. 我的工作中出你是不是坏手表知道与否? 希望你们可以用中文味精|风力发电机组下一次英语手表等,我感到很疲倦啊.
lol
6. Denis | 2007:06:06 - 16:19:34 | #
第7位和第9位,你们俩再说什么,哈哈!
这件事情就到此为止了,我也不想多说了。也希望大家能够尊重版权,也尊重翻译者的工作,不管翻译的是好还是坏。毕竟是辛苦的差事!
另外本翻译,可以任意转载,但是希望转载的时候在页头能够留下源地址。
7. 紫天 | 2007:06:06 - 19:13:25 | #
你看这个就知道偶说什么了
http://www.huavi.cn/bolg/?p=216
简直恶搞~~^_^
8. Denis | 2007:06:10 - 04:36:25 | #
Leon,你的留言已经删除!
9. keke | 2007:06:14 - 22:16:31 | #
支持!
10. ideaonly | 2007:07:01 - 01:28:59 | #
请教水煮鱼大哥;
我照着你的教程,认真的边学边做,但是到了你的“第3步(你写的是”第2步“),你的是把标题全部调用出来,而我的只调用了最新的一个文章标题(我添加了3篇相同标题的文章。)。
我也反复检查了我的代码:
“>
“>
和你的也相同,
为什么我的只显示一个最新的文章标题?
期待你的回复,谢谢
11. Denis | 2007:07:01 - 09:47:20 | #
你是不是在 Options ==》 Reading 下,设置为只显示一篇文章
12. ideaonly | 2007:07:01 - 19:26:44 | #
谢谢!现在可以了。你的教程很适合我这样的初学者。学起来一点压力都没有,循序渐进。真的很好。
13. glen | 2007:08:28 - 16:16:25 | #
操作到第2步第一张图片的时候,主页就打不开了。显示提示第8行有错误,第8行是,怎么可能有错误呢?
14. Denis | 2010:01:17 - 01:47:24 | #
什么错误?
15. howkey | 2007:11:06 - 11:35:14 | #
太有用了,我得好好学习了
16. 黑色饼干 | 2007:12:07 - 13:57:32 | #
呵呵,好东西真不少,学习完这个教程我也想做一个主题,继续阅读去了…
17. ts | 2008:05:15 - 00:37:27 | #
输入
之后并没有显示出日志,请问怎么回事?
18. ts | 2008:05:15 - 00:38:15 | #
输入 主循环(The Loop) 之后首页还是看不到日志。。。。。请问怎么回事啊
19. Denis | 2010:01:17 - 01:47:49 | #
说的太不明白了!
20. H.x | 2008:08:14 - 16:57:27 | #
我做完第三步后,保存–刷新—-但是显示的跟你不一样,我不知道错在哪,我反复重新输入,但还是不行,页面显示了这行英文:Parse error: parse error in c:\program files\easyphp1-8\www\wordpress\wp-content\themes\tutorial\index.php on line 34
21. H.x | 2008:08:14 - 17:21:51 | #
我的34行是
跟上面的好像没什么分别.为什么不行呢,我有缩进的
22. Denis | 2008:08:14 - 17:46:26 | #
很年久了,我也不知道为什么错误,你看看会不会引号的问题。
23. kesor | 2008:08:24 - 08:10:30 | #
在学习。
@H.x:
两个(have_posts())后面都是冒号:而不是分号;
24. riant | 2009:12:27 - 22:47:21 | #
想请教一个关于wordpress 置顶文章的问题,我想使用wordpress内置的置顶文章功能;当然,这个循环体本身就能将置顶文章显示在其他文章前面了,只是,光靠一个class=”sticky”还是不能满足我的需要,我想将置顶文章用幻灯播放的形式组织起来。
也就是需要将置顶文章单独输出,比如,需要使用一个div 将其包起来(其中可能还有更复杂的,比如不显示时间啊分类之类信息等,最主要是想实现《div id=”sticky”>循环出置顶文章</div》这种运用,谢谢)。
网上关于is_sticky() 的文章好像挺少的,博主能说说怎么做吗?谢谢。
25. Denis | 2009:12:27 - 23:02:07 | #
用 get_posts 获取所有 sticky 的 posts!
26. grass | 2010:01:17 - 10:33:30 | #
大家好呀!问下那些链接,例如a href=”<?php bloginfo(’url’)那些地址是在那?怎知的?greenhand,谢谢了!
27. Denis | 2010:01:17 - 15:57:43 | #
函数调用!