WordPress:运转的The Loop
介绍[ ]
"The Loop"是一个术语,指的是WordPress的主要程序。你在模板文件中使用Loop,来想你的访客显示文章。你可以不用Loop,来制作模板,但是你只能从一篇文章中显示数据。
WordPress首先要做的就是检查一下,它所需要的文件都已经呈现了。然后,WordPress收集一下,数据库中的博客 管理员所定义的默认设置。这些默认设置包括,每个网页应该显示多少篇文章,是否允许评论,等等。一旦这些默认设置建立了,WordPress便会查看用户需要什么。用户的需求信息会用来决定从数据库中提取那篇文章。
如果用户没有要求要一篇特别的文章,类别,网页,或者日期,WordPress使用先前收集的默认值来决定为用户呈现那篇文章。例如,如果博客管理员选择在管理 > 设置 > 阅读中的每个网页中显示五篇文章,那么WordPress就会在数据库中提取五篇最新的文章。如果用户的确要求要一篇特别的文章,类别,网页,或者日期,那么WordPress会使用这个信息来决定从数据库中提取哪一篇(哪些)文章。
一旦上述的任务完成了,WordPress就会连接到数据库,重新得到特别的信息,并且用一个变数来储存结果。这是Loop能够使用这个变数,并且使用这个值来显示在你的模板上。
默认情况下,如果访客没有选择一篇特别的文章,网页,类别,或者日期,WordPress使用index.php来显示所有的内容。对于探讨Loop的第一部分,我们只突出index.php,和你的博客的默认显示。然后,你一旦了解了这些内容是怎样运行的,我们就会研究Loop在其它的模板文件中的一些窍门。
世界上最简单的搜索页[ ]
下面是一个完全性的功能性的索引,这个索引根据用来准备Loop的条件,显示了每篇文章的内容(仅仅是内容)。向你显示这个索引的唯一目的就是,要证明Loop功能运转不怎么必要。你的index.php中内容的大部分是,CSS, HTML,和PHP声明来使得Loop看起来更漂亮。
<?php get_header(); if (have_posts()) : while (have_posts()) : the_post(); the_content(); endwhile; endif; get_sidebar(); get_footer(); ?>
现在,让我们来看看这些使得Loop看起来更好看的部分。
默认的Loop[ ]
下面内容是关于按部就班地查看Loop的使用,这个Loop伴随在WordPress1.5版本的标准安装的默认 和经典主题。
开始 Loop[ ]
在默认index.php模板文件的顶端是The Loop的开始代码。
<?php if (have_posts()) : ?><br /> <?php while (have_posts()) : the_post(); ?>
- 首先它检查了文章是不是用这个have_posts()函数收集了。
- 如果有文章,一个PHPwhile loop就会开始运转。只要括号中的条件在逻辑上是真的,那么一个while loop就会继续执行。只要函数have_posts()返回了一个真值,Loop就会继续运行。
- 函数have_posts()在文章收集的时候,只会检查下一篇文章:如果有下一篇文章,就会返回真;如果没有下一篇文章,就会返回假。
产生文章[ ]
函数the_post()在收集文章的时候,拿着当前的文章,并且使得当前的文章在Loop的反复中能够使用。没有了the_post(),你的主题中使用的许多的模板标签都不能运行。
标题,日期和作者[ ]
下面的模板标签得到了当前文章的标题,文章发表的时间,以及谁发表了这篇文章。
<h2 id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"> <?php the_title(); ?></a></h2> <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
文章内容[ ]
the_content()模板标签显示了文章的内容。这是通过Loop的每篇文章的最重要的部分。
<div class="entry"> <?php the_content('Read the rest of this entry »'); ?> </div>
如果你包含了称作更多的Quicktag按钮,而且这个按钮在你的文章主体显示为<!--more-->,只有那一行上面的部分才会显示给访客。因此,如果你只想首页显示每篇文章的第一句话,或者前两句话,只要在你所写的文章中的第一行后插入<!--more-->,就可以了。
当你阅读一篇单一的文章的时候,<!--more-->分隔符就被跳过了。因此在你所有的文章中放入<!--more-->分隔符,如果读者想阅读所有的内容的话,这个分隔符会迫使读者来点击每篇单个的文章。
额外的详细信息[ ]
在index.php模板文件中的每篇文章的内容下面,有一个位置可以显示文章的更多的信息,例如类别,数据,评论信息。称作文章 meta 数据 部分,如果你是一个注册过的用户,拥有足够的特权(或者文章的作者),你就会看见一个"编辑这个"链接,感谢edit_post_link() 模板标签函数。
<p class="postmetadata"> Posted in <?php the_category(', ') ?> <strong>|</strong> <?php edit_post_link('Edit','','<strong>|</strong>'); ?> <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
如果写评论得到了激活,或者如果文章拥有评论,comments_popup_link()模板标签就会显示一个连接到评论的链接。如果你正在使用评论弹出窗口,这个链接会打开评论窗口,否则的话,它就会跳到这篇关于这篇文章的评论。
如果访客正在访问文章的索引(例如: Loop中有几篇文章), comments_popup_link()链接会将读者带到这篇文章的单个的网页。
Trackback 自动查找[ ]
trackback_rdf模板标签的功能是要产出用于trackback自动查找的,机器能够识别的代码。
<!-- <?php trackback_rdf(); ?> -->
注: trackback_rdf()标签使用时,周围应该有评论。
编辑Loop[ ]
以下的函数结束了Loop。这个函数执行之后,不同的与文章相关的模板标签,就不会像期望地那样运行(或者如果这些模板运行的话,它们会使用Loop中的最后一篇文章)。这意味着,如果你要使用一个模板标签,这个标签在 Loop内部运行,你就要将这个标签放在这一点之前。
<?php endwhile; ?>
这个部分,就在结束Loop的后面,显示了通过每个网页而前进或者后退的导航控制。
<div class="navigation"> <div class="alignleft"><?php posts_nav_link('','','« Previous Entries') ?></div> <div class="alignright"><?php posts_nav_link('','Next Entries »','') ?></div> </div>
如果博客被设置为每个网页显示十篇文章,而且Loop使用的条件收集了25篇文章,那么会有三个网页需要导航:其中两个网页,每个网页有十篇文章,还有一个网页有五篇文章。导航链接能够使访客在收集的文章中,向前或者向后翻看。
The navigation controls are included outside The Loop, but inside the if condition, so that they only show up if there are any posts. The navigation functions themselves also check whether or not there is anything to which they will link, based on the current Loop, and only display links if there's something to link.
导航控制不包含在Loop中,但是包含在假设条件中,因此只有有文章的时候,导航控制才会出现。导航函数本身也会以当前的Loop为基础,查看有没有它们可以链接的内容,而且只有在有一些可以链接的内容的情况下,导航函数才会显示链接。
<?php else : ?> <h2 class="center">Not Found</h2> <p class="center"> <?php _e("Sorry, but you are looking for something that isn't here."); ?></p>
其它的 :字句决定了如果有_文章()(在顶端上方)是假的,应该执行什么。这就是说,只有Loop中没有文章的时候,其它的后面的内容才会得到执行/显示。例如,如果访客需要某天的文章,但是这一天没有文章,或者经过了搜索,但是没有产生结果,没有显示文章。
<?php endif; ?>
这个结束了条件测试"如果有文章,这样执行,如果没有文章,那样执行"。一旦条件测试结束了,默认的index.php模板然后包含工具条,最后包含页脚。
其它的模板中的Loop[ ]
WordPress可以使用不同的模板文件以不同的方式来显示你的博客。在WordPress默认主题中,有关于索引浏览,类别浏览和归档浏览的模板文件,也有一个浏览个人文章的模板。这些模板和模板文件都使用WordPress:The Loop,但是使用的格式有所不同,而且对模板标签的使用也有所不同。
对于没有一个单独的模板文件的浏览,WordPress会默认使用index.php。如果一位访客需要一篇单一的文章,WordPress会首先查看一个名称为single.php的文件。如果这个文件存在的话,这个文件就会被用来向访客呈现文章。如果这个文件不存在,WordPress会使用index.php来向访客呈现文章。这叫做模板层级。
如果你正制作你自己的主题,看看默认主题中作为参考的模板文件是很有用的。为你的其它模板文件使用你的主题的index.php作为一个模板,也很有用。执行了这些之后,你可能得到了一个已知的,并且正在运行的网页,当你创建更多的模板文件的时候,这个网页就会发生变化。
不同的归档样式[ ]
一个归档是对过去的文章的收集。在默认使用中,显示在你的主索引上的文章是最近按时间顺序的发表的文章。当访客点击你其中的一个归档链接的时候,或者如果访客手工操作要求一个特备的日期(http://www.example.com/blog/index.php?m=200504 or http://www.example.com/blog/2005/04 选择从2005年四月开始的所有的文章),WordPress会显示一个档案 浏览。默认情况下,档案会使用index.php,因此档案看起来和你的首页是相同的,只显示从2005年四月开始的文章。
当WordPress为一名访客准备一个档案浏览的时候,WordPress特别要查找你当前主题目录中一个名为archive.php的文件。如果你想真实地消除首页中的档案的歧义,你只要复制index.php到archive.php,并且需要的话,编辑archive.php!
例如,如果你只想在你的文章档案列表上显示文章标题,而不是文章内容,你可能要使用以下的内容:
<?php get_header(); ?> <div id="content" class="narrowcolumn"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div class="post"> <h2 id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2> <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small> </div> <?php endwhile; ?> <div class="navigation"> <div class="alignleft"> <?php posts_nav_link('','','« Previous Entries') ?> </div> <div class="alignright"> <?php posts_nav_link('','Next Entries »','') ?> </div> </div> <?php else : ?> <h2 class="center">Not Found</h2> <p class="center"><?php _e("Sorry, but you are looking for something that isn't here."); ?></p> <?php endif; ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
不同的类别样式[ ]
与档案浏览相似,WordPress为类别浏览查找一个单独的模板文件。如果一个访客点击你的博客上一个类别的一个链接,访客就会来到类别浏览。WordPress会给Loop准备来自那个类别的文章,并且根据博客的默认设置来限制文章的数目。
要使你的类别浏览与你的索引浏览有所区别,复制index.php并且将它重新命名为category.php。对于一个类别浏览,可能没有必要列出文章所在的类别,因此我们移除这个部分。反之,让我们在网页的顶上方公布类别:
<?php get_header(); ?> <div id="content" class="narrowcolumn"> <p> <strong> <?php single_cat_title('Currently browsing '); ?> </strong><br /> <?php echo category_description(); ?> </p> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div class="post"> <h2 id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"> <?php the_title(); ?></a></h2> <small> <?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --> </small> </div> <?php endwhile; ?> <div class="navigation"> <div class="alignleft"> <?php posts_nav_link('','','« Previous Entries') ?> </div> <div class="alignright"> <?php posts_nav_link('','Next Entries »','') ?> </div> </div> <?php else : ?> <h2 class="center">Not Found</h2> <p class="center"><?php _e("对不起, 但是你找的东西,不在这儿。"); ?></p> <?php endif; ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
不同类别的不同样式[ ]
就如模板层级里所解释的那样, 为每个类别创建单独的模板文件是可能的。只要命名文件category-X.php,其中X是类别的数字ID。认真考虑你是否需要为一个特别的类别准备一个全新的模板。
让我们来看看两个类别,"植物"和 "花",各自的类别ID是3和4。在每个文章标题旁边的输出中,取决于你正在显示的类别,你可能想要一颗植物或者一朵花的图片。你可以:
- 使用两个单独的文件,类别-3.php 和 类别-4.php,每个类别中每篇文章的标题都有一个不同的img标签。
- 在你的默认的category.php文件中使用一个条件测试来看看当前的类别是"植物" 还是 "花朵"(或者都不是),并且显示适当的图像:
<?php if (is_category('3') ): // 我们在植物类别,因此显示一颗植物 ?> <img src='/images/plant.png' alt='a plant' /> <?php } elseif (is_category('4') ): // 我们在花朵类别,因此显示一朵花?> <img src='/images/flower.png' alt='a pretty flower' /> <?php endif; // end the if, no images for other other categories ?>
如果你添加了另一个类别,"汽车",你想要以非常不同的方式来显示这个类别,那么一个分开的类别-X.php会更加地合适。
不同类别的不同的CSS[ ]
许多用户想要为一个特别的类别创建单独的CSS文件。这一点也很容易实现。记住样式表是在HTML文件的<head>中定义和载入的,这一点很重要。WordPress可以为这个使用header.php文件。在默认header.php,找到这一行:
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
将这个改为:
<?php if ( is_category('5') ) { // Load special CSS for "Cars" category ?> <link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/category-5.css" type="text/css" media="screen" />; <?php } else { ?> <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" /> <?php } ?>
注:汽车模板使用类别-5.css文件来覆盖默认设置。在这个例子中,CSS文件命名在类别模板文件之后,而不是正真的类别名,CSS文件将会用在类别模板文件中。因此,你知道category-5.css和category-5.php在一起。
不同的单个文章格式[ ]
当访问任何单一的文章(或者permalink),WordPress会使用single.php。
来自WordPress默认single.php的这个部分,提供了关于当前文章的文章 meta 数据 信息:
<p class="postmetadata alt"> <small> This entry was posted on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?> and is filed under <?php the_category(', ') ?>. You can follow any responses to this entry through the <?php comments_rss_link('RSS 2.0'); ?> feed. <?php if (('open' == $post->comment_status) && ('open' == $post->ping_status)) { // 评论和 Pings都打开了 ?> You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(display); ?>">trackback</a> from your own site. <?php } elseif (!('open' == $post->comment_status) && ('open' == $post->ping_status)) { // 只有 Pings 是打开的。 ?> Responses are currently closed, but you can <a href="<?php trackback_url(display); ?> ">trackback</a> from your own site. <?php } elseif (('open' == $post->comment_status) && !('open' == $post->ping_status)) { // 评论是打开的,但是Ping没有。 ?> You can skip to the end and leave a response. Pinging is currently not allowed. <?php } elseif (!('open' == $post->comment_status) && !('open' == $post->ping_status)) { // 评论和Ping都没有打开 ?> Both comments and pings are currently closed. <?php } edit_post_link('Edit this entry.','',''); ?> </small> </p>
这种形式的信息—不管评论是打开的还是关闭的—对于一个索引,归档,或者类别浏览是不合适的;这就是这种信息只包含在single.php模板文件中的原因。
其它的 Loop Tricks[ ]
既然对于WordPress Loop的基本用户,你有一个好的介绍说明。让我们给你引入更多的Loop effects和tricks。
静态的首页[ ]
你怎样显示一些特别的内容,只出现在你的博客的首页上?对,只出现在首页或者主页上,在你的站点的其它位置上看不到这些内容。简单!我们称这个为静态首页。你的站点的首页或者第一个网页并不是真的是静态的。只是使用Loop使首页看起来是那样的。
要使得这个Loop trick运行,使用is_home()条件模板标签函数。
在你的index.php,使用一个if ()测试来有条件地输出额外的内容:
<?php get_header(); ?> <?php if (is_home()) { // 我们在主页上,因此让我们来秀秀我们新的小猫的图片! echo "<img src='/images/new_kitty.jpg' alt='Our new cat, Rufus!' />"; //现在返回到我们正常组织的主页 } ?>
如果访客没有要求一个特别的文章,网页,类别,或者日期,函数is_home()只会产生一个真值,因此它只会显示在"主页" 上。
更多的信息,请看创建一个静态首页。
只有摘录[ ]
显示摘录而不是文章所有内容的最简单的方法是,用the_excerpt()来取代所有的the_content()的例子。如果你没有为你的文章创建摘录,这个函数会自动地显示文章的前120个词。
<div class="entry"> <?php the_excerpt(); ?> </div>
根据文章的数目来显示文章摘录或者全部的文章内容[ ]
在有的情况下,例如,在文章档案网页中,如果只有一篇文章,你可能想要显示全部的文章内容,如果有几篇文章,你可能只想显示摘录部分。你可以自定义loop来显示全部内容或者摘录。
<?php if (have_posts()) : ?> <?php if (($wp_query->post_count) > 1) : ?> <?php while (have_posts()) : the_post(); ?> <!—在这儿为摘录粘贴页眉吗?--> <?php the_excerpt() ?> <!—在这儿为摘录粘贴页脚吗?--> <?php endwhile; ?> <?php else : ?> <?php while (have_posts()) : the_post(); ?> <!-- Do your post header stuff here for single post--> <?php the_content() ?> <!-- Do your post footer stuff here for single post--> <?php endwhile; ?> <?php endif; ?> <?php else : ?> <!-- Stuff to do if there are no posts--> <?php endif; ?>
不同的页眉/工具条/页脚[ ]
WordPress在你的模板文件中提供使用get_header(), get_sidebar(), 和 get_footer() 包括标签。这些函数使得定义一个标准的页眉/工具条/页脚变得简单,一个标准的页眉/工具条/页脚编辑简单。访客能够立马地看到这些文件中发生的任何变化,不包括你所执行的内容。
但是有时候,你可能不想要/em>一个工具条。如果你不想要一个工具条,只要移除调用到你的模板的get_sidebar()函数。例如,WordPress默认主题的single.php模板不包括一个工具条。
要创建你自己的不同的工具条,你拥有两个选择。
- 将工具条内容直接包含到你正在处理的模板文件中。如果你想要类别-3拥有一个不同的工具条,编辑类别-3.php并且包含必须的HTML和PHP来产生你的独特的工具条。
- 使用PHP包括函数来包括另一个文件。WordPressget_sidebar() 函数only 载入sidebar.php。如果你制作了一个文件,命名为sideleft.php,你可以像这样将它包含:
<?php include(TEMPLATEPATH . '/sideleft.php'); ?>
使用WordPress默认的模板层级,如果你想在多个或者不同的模板中使用相同的元素,最好将这些元素放进分开的模板文件中并且使用PHP include()函数。如果你添加的元素是专门为一个模板文件准备的,那么你最好直接将这个元素包含在那个模板文件中。
总结[ ]
我们刚刚初步了解了Loop的用法。作为一个提醒,下面的资源会帮助你自定义你自己的WordPress Loop。
资源[ ]