个人工具
名字空间
变换
操作

WordPress:The Loop

来自站长百科
跳转到: 导航, 搜索

导航: 上一级 | WordPress | 首页 | WordPress中文论坛 | WordPress主机 | CMS程序 | 论坛程序 | ECShop | ShopNC | PowerEasy

目录

WordPress使用Loop来显示你的每一篇文章。使用Loop,WordPress将每篇文章显示在当前的网页上,并且根据它们怎样匹配Loop标签内部规定的标准来规定它们的形式。Loop中放置的任何的HTML或者PHP代码会在每篇文章中重现。当WordPress文件申明"这个标签必须在 Loop中",例如特别的模板标签或者插件,标签对于每篇文章都会重复。

例如,在信息中,Loop对于每篇文章的在WordPress1.5中的显示是:标题 (标题()), 时间 (时间()), 和类别 (类别()) 关于每篇文章的其他信息能用适当的标签或者通过$post的变量(为高级使用者的)来展示,当Loop正在运行的时候, $post 变数是由当前文章的信息设置的


对于一个新手,看看Loop,请看活动的Loop

使用 Loop

Loop应该被放在index.php和其它的任何惯于显示文章信息的模板中,但是根据你使用WordPress版本的不同,Loop看起来可能还会有所不同。你应该首先看看"你拥有的WordPress是哪一个版本"。

WordPress 2.0

这(可能)与WordPress 1.5是相同的

WordPress 1.5

要确定包含了对于你的主题的模板的顶上方的页眉模板的访问。如果你在自己的设计内部使用了Loop(而且你自己的设计不是一个模板),将WP_USE_THEMES设置为false

<?php define('WP_USE_THEMES', false); get_header(); ?>

Loop从这儿开始::

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

而且从这儿结束:

<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

WordPress 1.2

要确定在你的索引页的上方包含了对于wp-blog-header.php的访问。记住,wp-blog-header.php的路径必须设置到你的wp-blog-header.php文件的位置:

<?php /* 不要移除这一行。 */ require('./wp-blog-header.php'); ?>

Loop从这儿开始:

<?php if ( $posts ) : foreach ( $posts as $post ) : start_wp(); ?> 从这儿结束:

<?php endforeach; else: ?>

<p><?php _e('对不起,没有文章匹配你的标准。'); ?></p> 
<?php endif; ?>

Loop例子

从一些类别中不同地设计文章

只针对 WordPress v1.5 这个例子,使用#WordPress:WordPress1.5 针对1.5版本的语法,显示了每篇文章和文章标题(用作对于文章的Permalink的一个链接),类别和内容。这是一个简单的,梗概的例子;或许你的模板会稍微地显示更多的信息,使设计CSS变得更加地简单。

虽然为了更具有一些教育性,但是这个例子允许类别中类别ID'3'的文章,设计得不同。要实现这一点,可以使用在类别中() 模板标签

<!-- -->标签是HTML评论标签;如果你使用这个例子,这些标签就不会在网络浏览器中显示。它们除了注释下面的代码以外,什么作用也不起。 <!-- Start the Loop. --> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!—下面的内容测试了当前的文章是否在类别3中。--> <!—如果是的话, div 框被赋予了 CSS级别 "post-cat-three". --> <!—否则的话, div 框 就会被赋予 CSS 级别 "post". --> <?php if ( in_category('3') ) { ?> <div class="post-cat-three"> <?php } else { ?> <div class="post"> <?php } ?> <!—显示标题为一个对于文章的permalink的链接。--> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <!—显示时间。 --> <small><?php the_time('F jS, Y'); ?></small> <!—在一个div框中显示文章的内容。--> <div class="entry"> <?php the_content(); ?> </div> <!—显示文章类别的一个以逗号分开的列表。--> <p class="postmetadata">Posted in <?php the_category(', '); ?></p> </div> <!-- closes the first div box --> <!—停止 Loop (但是注意 "else:" – 看下一行). --> <?php endwhile; else: ?> <!—第一个"如果" 测试看看有没有文章到 --> <!—显示。这个 "其它的"部分说明了,如果没有文章的话,要做什么。 --> <p>对不起,没有文章能够符合你的标准。</p> <!—真的吗 停止 Loop. --> <?php endif; ?>

注:任何你想使用HTML代码的时候,你必须<?php  ?>标签的外面。PHP代码(甚至向花括号这样简单的东西:}必须<?php  ?>标签内部。就如以上的例子所显示的那样,你可以开始并结束PHP代码,甚至在ifelse声明中散布HTML代码。

从某个类别中清除文章

从WordPress v1.5 和更高的版本

这个例子可以用来,清除某个显示的类别。这个以例子以上的为基础。

 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<!—如果文章在我们想要删除的类别中,我们只要转向下一篇文章。-->
 <?php if (in_category('3')) continue; ?>

<div class="post">

<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
 
  <small><?php the_time('F jS, Y'); ?></small>
 
  <div class="entry">
    <?php the_content(); ?>
  </div>

  <p class="postmetadata">Posted in <?php the_category(', '); ?></p>
 </div> <!-- closes the first div box -->

 <?php endwhile; else: ?>
 <p>对不起,没有文章符合你的标准。</p>
 <?php endif; ?>

: 如果你对主页使用这个例子,你应该为你的类别归档使用一个不同的模板。否则的话,甚至在浏览类别归档时,WordPress会删除类别3中的所有文章,

然而,如果你想要使用同一个模板文件的话,你可以使用is_home()标签来避免这个:

...

<?php if (in_category('3') && is_home() ) continue; ?>
...

这个会确保类别3中的文章,只会在主页中清除。也有其它的条件式标签可以用来控制输出,取决于关于一个访问的网页,一个特别的条件是不是真的。

请注意即使文章并没有显示,它仍然会被WordPress计算为正在显示的—这意味着,如果你将WordPress设置为显示最多七篇文章,而且七篇中最后的两篇是属于类别3中的,那么你在主页上只会显示五篇文章。如果对于你来说,这是个麻烦事,你可以使用布局和设计 常见问题解答上更加复杂的插件,如果你只需要在loop上删除一个类别的话,你可以使用 查询 文章

多个 Loop

这个部分处理的是Loop的高级使用。这有一定的技术性- 但不要因为这个而恐慌。我们会从简单的地方开始,并且逐步向难的方向发展。有一点的常识,耐心,和热情,你也可以使用多个loops。

首先,"为什么要使用多个loops?"一般来说,答案是你可能对一组文章想这样处理,对另一组文章想那样处理,但要在同一个网页上显示这两篇文章。那样,可能并不意味着什么,你只是受你的PHP技术和你的想象力的限制。

我们可能会进入上面的例子,但是首先你应该阅读基本知识。看看基本的Loop。它的组成是:

     <?php if (have_posts()) : ?>
               <?php while (have_posts()) : the_post(); ?>    
     <!-- do stuff ... -->
     <?php endwhile; ?>  

上述的会在英文中阅读(PHP形式和人们熟悉代码表述的可以跳到下面):如果我们要显示文章,就一次一篇。对于列表中的每一篇文章,根据<!-- do stuff ... -->显示它。当你点击最后一篇文章时,就停止。do stuff line(s),是随模板而定的。

在旁边的Do stuff上:在这个例子中,它只是一些怎样规定网页上文章的形式和显示的代码的占位符。根据你希望你的WordPress站点是怎样显示的,这个代码会更改。如果你看了Kubrick主题的 index.php the do stuff部分,会有以下的东西: <?php while (have_posts()) : the_post(); ?> 上面的:

     <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?>

编码器在那儿的一个解释:

have_posts()the_post()是全局的$wp_query物体有用的包装材料,这是所有活动的地点。可以在博客页眉中访问$wp_query。你可以博客页眉中访问$wp_query 而且以来自GET and PATH_INFO的询问论据为支撑。$wp_query接受争论,并且建立和执行一个以一批文章为结果的DB询问。这个数组在一个对象中储存,而且也会返回到博客页眉中,在这里, 它塞满了全局$posts数组(关于旧的文章loops的向后兼容)。

一旦WordPress停止了载入博客页眉,并且下降到模板中,我们便到达了我们的文章Loop上。have_posts()只是访问到$wp_query->have_posts(),这个检查loop计数器,来看看在文字排列中有没有剩下任何文章。而且the_post()访问$wp_query->the_post(),会升级loop计数器,和设置全局的$post变数,以及所有的全球的文章数据。我们一旦耗尽了loop, have_posts()就会返回错误,我们完成了。

Loop 例子

下面是使用多个loops的两个例子。使用多个loops的关键是$wp_query只能被访问一次。要传播这个,通过访问rewind_posts() 或者通过创建一个新的查询对象,有可能再次地使用查询。这个在例1中说明了。在例2中,包含用一个变数来储存一个查询的结果。例3说明了使用update_post_caches();功能来避免常见的插件问题。最后,‘多个运转的 loops’将许多的观点集中在一起,来一方面说明使用多个loop来提升你的博客主页上的某个类别中的文章。

多个 Loops 例子 1

为了第二次在同一个询问中loop,访问rewind_posts()。这样就会重新设置loop计算器,允许你做另一个loop。 <?php rewind_posts(); ?>

  <?php while (have_posts()) : the_post(); ?>
    <!-- Do stuff... -->
  <?php endwhile; ?>

如果你完成了最初的查询中的文章,你想要使用一个不同的查询,你可以通过访问query_posts()再次地使用$wp_query对象,然后looping backquery_posts()会执行一个新的查询,创建一个新的文章列,并且重新设置loop计算器。

 // 在一个特别的_cat 类别中得到最后的十篇文章。
  <?php query_posts('category_name=special_cat&showposts=10'); ?>

  <?php while (have_posts()) : the_post(); ?>
    <!-- Do special_cat stuff... -->
  <?php endwhile;?>

如果你需要保存原来的查询,你可以创建一个新的查询对象。 <?php $my_query = new WP_Query('category_name=special_cat&showposts=10'); ?>

<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
  <!-- Do special_cat stuff... -->
<?php endwhile; ?>

使用了查询对象my_query因为你不能使用全局的have_posts()the_post()因为它们都使用$wp_query

多个Loops 例2

使用多个Loops的另一个版本,对于不能使用have_posts()the_post()采取了另一个方针。为了解决这个问题,你应该在一个变数中储存原始查询,当针对另一个Loop时,需要重新地提交查询。这样做,你可以使用所有依赖于全球性的标准功能。

例如: // 独自从这儿离开

<?php $temp_query = $wp_query; ?>
<!-- Do stuff... -->

<?php query_posts('category_name=special_cat&showposts=10'); ?>

<?php while (have_posts()) : the_post(); ?>
  <!-- Do special_cat stuff... -->
<?php endwhile; ?>

// 现在返回到我们有规律的规划<?php $wp_query = $temp_query; ?>

注: 在 PHP 5中,对象以操作员为参考,而不是向在php4中那样的复制的。使例2能在PHP5中运行,你需要使用以下的代码:


 // 自己离开来到这儿
 <?php $temp_query = clone $wp_query; ?>
 <!-- Do stuff... -->
 
 <?php query_posts('category_name=special_cat&showposts=10'); ?>
 
 <?php while (have_posts()) : the_post(); ?>
   <!-- Do special_cat stuff... -->
 <?php endwhile; ?>
 
 // 现在返回到我们正常规定的项目
 <?php $wp_query = clone $temp_query; ?>

然而,第二个例子不能在WordPress 2.1中运行。

多个 Loops 例 3 – 插件

经发现许多的插件并不能与多个loops合作。在这些情况下,经发现,许多的处理文章的关键词和标签的插件,只对文章第一个包含全部文章的子集的一个loop起作用。如果你发现这是一个问题,你可能想要尝试一下添加了update_post_caches($posts)功能的基本的loop在以下的执行情况。这个功能重新设置了文章高速缓存,而且至今没有被证明。只有第一个loop重新得到一个文章的子集,才会执行第二个loop。

仅仅修改:

   <?php if (have_posts()) : ?>
               <?php while (have_posts()) : the_post(); ?>    
     <!-- Do stuff... -->
   <?php endwhile; ?>

变成:

   <?php if (have_posts()) : ?>
               <?php while (have_posts()) : the_post(); update_post_caches($posts); ?>
     <!-- Do stuff... -->
   <?php endwhile; ?>

运转的多个Loops

了解怎样使用多个loops的最好的方法,就是显示一个多个loops的使用的一个例子。也许多个loops最常用的就是在一个网页上显示两个(或者更多的)文章列表。当一个WEB站点管理员不仅想要显示最近所写的文章,还想要显示属于某一类别的文章的时候,便要用到这个。

将所有的形式和CSS问题放到一边,假如我们只想要文章的两个列表。一个会列出最近的文章(最近添加的10个标准的文章),另一个列表只会包含一个来自类别‘特色的’文章。属于‘特色的’类别里的文章应该首先显示,紧跟着,第二个文章的列表(标准的)。 所获得的是没有一篇文章同时出现在两个类别中。

第一步. 从‘有特色的’类中,只拿出一篇文章。

  <?php $my_query = new WP_Query('category_name=featured&showposts=1');
  while ($my_query->have_posts()) : $my_query->the_post();
  $do_not_duplicate = $post->ID; ?>
    <!-- Do stuff... -->
  <?php endwhile; ?>

在英文中,上述的代码会读作:

$my_query设置为与类别是特色的里的所有文章的查询结果相同,顺便说一下,只给我一篇文章。也将变数$do_not_duplicate设置为与返回的单个文章的ID数字相等。记起,Do stuff行代表了所有的与重新得到的文章相关的格式的选项。

注意我们需要下一步中的$do_not_duplicate值,以确保相同的文章没有在两个类别中重复出现。

第二步. 第二个loop,得到了X篇最新的文章(除了一篇)。

下面的代码得到了最新的X篇文章(如WordPress参数选择中所定义的那样),保存了已经在第一个loop中显示的那一篇,并且根据Do stuff显示它们。


<?php if (have_posts()) : while (have_posts()) : the_post();

  if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
   <!-- Do stuff... -->
  <?php endwhile; endif; ?>

在英文中,以上的代码会读作:

得到所有的文章,在文章等于$do_not_duplicate的位置,什么措施也别采取,否则的话,根据Do stuff显示所有的其它的文章。而且,更新高速缓存,这样标签和关键词会运行的很好。记住,$do_not_duplicate参数包含了已经显示的文章的ID.

最后的结果

以下是最后的代码是怎样显示的without any formatting:

  <?php $my_query = new WP_Query('category_name=featured&showposts=1');
  while ($my_query->have_posts()) : $my_query->the_post();
  $do_not_duplicate = $post->ID;?>
    <!-- Do stuff... -->
  <?php endwhile; ?>
    <!-- Do other stuff... -->
  <?php if (have_posts()) : while (have_posts()) : the_post(); 
  if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
   <!-- Do stuff... -->
  <?php endwhile; endif; ?>

最后的结果是一篇文章有两个列表。第一个列表只包含了一篇文章—来自'特色'的最近的文章。第二个列表会包含X篇最近的文章(如WordPress参数中所定义的)except已经在第一个列表中显示的文章。因此,一旦特色文章被另一个代替了,前一个特色文章就会在下面的标准的文章列表中显示(这取决于你选择显示多少篇文章和文章的频率)。这种方法(或者相似的)由许多人使用,与模板层级的知识想结合,为home.php 和 index.php创建不同的外观。在这一个页面的底部看看相关的资源。

原始资料:

这篇关于多个loops的文章是Ryan BorenAlex King's 的结合体。

http://comox.textdrive.com/pipermail/hackers/2005-January/003578.html 讨论]关于Hackers Mailing List上的loops以及在MaxPower上所写的指南。


更多的 Loop 资源

学习更多的WordPress Loop, 以及只在Loop内部运行的不同的模板,这儿有一些资源。

资源


This article is [[WordPress::Category:Copyedits|marked]] as in need of editing. You can help Codex by editing it.

留言