站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
▼
建站程序
开发
服务器
办公软件
开发教程
▼
服务器教程
软件使用教程
运营教程
热门电子书
▼
CSS教程
WordPress教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
热点词条
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
WordPress:The Loop
”(章节)
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
==多个 Loop== 这个部分处理的是Loop的高级使用。这有一定的技术性- 但不要因为这个而恐慌。我们会从简单的地方开始,并且逐步向难的方向发展。有一点的常识,耐心,和热情,你也可以使用多个loops。 首先,<b>"为什么要使用多个loops?"</b>一般来说,答案是你可能对一组文章想<i>这样</i>处理,对另一组文章想<i>那样</i>处理,<u>但要在同一个网页上显示这两篇文章</u>。那样,可能并不意味着什么,你只是受你的PHP技术和你的想象力的限制。 我们可能会进入上面的例子,但是首先你应该阅读基本知识。看看基本的Loop。它的组成是: <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <!-- do stuff ... --> <?php endwhile; ?> 上述的会在英文中阅读(PHP形式和人们熟悉代码表述的可以跳到下面):如果我们要显示文章,就一次一篇。对于列表中的每一篇文章,根据<tt><!-- do stuff ... --></tt>显示它。当你点击最后一篇文章时,就停止。<tt>do stuff</tt> line(s),是随模板而定的。 在旁边的<tt>Do stuff</tt>上:在这个例子中,它只是一些怎样规定网页上文章的形式和显示的代码的占位符。根据你希望你的WordPress站点是怎样显示的,这个代码会更改。如果你看了Kubrick主题的 index.php the <tt>do stuff</tt>部分,会有以下的东西: <?php while (have_posts()) : the_post(); ?> 上面的: <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?> 编码器在那儿的一个解释: <tt>have_posts()</tt>和<tt>the_post()</tt>是全局的<tt>$wp_query</tt>物体有用的包装材料,这是所有活动的地点。可以在博客页眉中访问<tt>$wp_query</tt>。你可以博客页眉中访问<tt>$wp_query</tt> 而且以来自<tt>GET</tt> and <tt>PATH_INFO</tt>的询问论据为支撑。<tt>$wp_query</tt>接受争论,并且建立和执行一个以一批文章为结果的DB询问。这个数组在一个对象中储存,而且也会返回到博客页眉中,在这里, 它塞满了全局<tt>$posts</tt>数组(关于旧的文章loops的向后兼容)。 一旦WordPress停止了载入博客页眉,并且下降到模板中,我们便到达了我们的文章Loop上。<tt>have_posts()</tt>只是访问到<tt>$wp_query->have_posts()</tt>,这个检查loop计数器,来看看在文字排列中有没有剩下任何文章。而且<tt>the_post()</tt>访问<tt>$wp_query->the_post()</tt>,会升级loop计数器,和设置全局的<tt>$post</tt>变数,以及所有的全球的文章数据。我们一旦耗尽了loop, <tt>have_posts()</tt>就会返回错误,我们完成了。 ==== Loop 例子==== 下面是使用多个loops的两个例子。使用多个loops的关键是<tt>$wp_query</tt>只能被访问一次。要传播这个,通过访问<tt>rewind_posts()</tt> 或者通过创建一个新的查询对象,有可能再次地使用查询。这个在例1中说明了。在例2中,包含用一个变数来储存一个查询的结果。例3说明了使用<tt>update_post_caches();</tt>功能来避免常见的插件问题。最后,‘多个运转的 loops’将许多的观点集中在一起,来一方面说明使用多个loop来提升你的博客主页上的某个类别中的文章。 =====多个 Loops 例子 1===== 为了第二次在同一个询问中loop,访问<tt>rewind_posts()</tt>。这样就会重新设置loop计算器,允许你做另一个loop。 <?php rewind_posts(); ?> <?php while (have_posts()) : the_post(); ?> <!-- Do stuff... --> <?php endwhile; ?> 如果你完成了最初的查询中的文章,你想要使用一个不同的查询,你可以通过访问<tt>query_posts()</tt>再次地使用<tt>$wp_query</tt>对象,然后''looping back''。<tt>query_posts()</tt>会执行一个新的查询,创建一个新的文章列,并且重新设置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; ?> 使用了查询对象<tt>my_query</tt>因为你不能使用全局的<tt>have_posts()</tt> 和 <tt>the_post()</tt>因为它们都使用<tt>$wp_query</tt>。 =====多个Loops 例2===== 使用多个Loops的另一个版本,对于不能使用<tt>have_posts()</tt> 和 <tt>the_post()</tt>采取了另一个方针。为了解决这个问题,你应该在一个变数中储存原始查询,当针对另一个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中运行,你需要使用以下的代码: <pre> // 自己离开来到这儿 <?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; ?> </pre> 然而,第二个例子不能在WordPress 2.1中运行。 =====多个 Loops 例 3 – 插件===== 经发现许多的插件并不能与多个loops合作。在这些情况下,经发现,许多的处理文章的关键词和标签的插件,只对文章第一个包含全部文章的子集的一个loop起作用。如果你发现这是一个问题,你可能想要尝试一下添加了<tt>update_post_caches($posts)</tt>功能的基本的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个标准的文章),另一个列表只会包含一个来自类别‘特色的’文章。属于‘特色的’类别里的文章应该首先显示,紧跟着,第二个文章的列表(标准的)。<b> 所获得的是没有一篇文章同时出现在两个类别中。</b> <b>第一步.</b> 从‘有特色的’类中,只拿出一篇文章。 <?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; ?> 在英文中,上述的代码会读作: 将<tt>$my_query</tt>设置为与类别是特色的里的所有文章的查询结果相同,顺便说一下,只给我一篇文章。也将变数<tt>$do_not_duplicate</tt>设置为与返回的单个文章的ID数字相等。记起,<tt>Do stuff</tt>行代表了所有的与重新得到的文章相关的格式的选项。 注意我们需要下一步中的<tt>$do_not_duplicate</tt>值,以确保相同的文章没有在两个类别中重复出现。 <b>第二步</b>. 第二个loop,得到了X篇最新的文章(除了一篇)。 下面的代码得到了最新的X篇文章(如WordPress参数选择中所定义的那样),保存了已经在第一个loop中显示的那一篇,并且根据<tt>Do stuff</tt>显示它们。 <?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; ?> 在英文中,以上的代码会读作: 得到所有的文章,在文章等于<tt>$do_not_duplicate</tt>的位置,什么措施也别采取,否则的话,根据<tt>Do stuff</tt>显示所有的其它的文章。而且,更新高速缓存,这样标签和关键词会运行的很好。记住,<tt>$do_not_duplicate</tt>参数包含了已经显示的文章的ID. <b>最后的结果</b> 以下是最后的代码是怎样显示的<u>without any formatting</u>: <?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参数中所定义的)<i>except</i>已经在第一个列表中显示的文章。因此,一旦特色文章被另一个代替了,前一个特色文章就会在下面的标准的文章列表中显示(这取决于你选择显示多少篇文章和文章的频率)。这种方法(或者相似的)由许多人使用,与[http://codex.WordPress.org/Template_Hierarchy 模板层级]的知识想结合,为home.php 和 index.php创建不同的外观。在这一个页面的底部看看相关的资源。 <h3>原始资料:</h3>这篇关于多个loops的文章是[http://boren.nu Ryan Boren]和 [http://www.alexking.org Alex King's] 的结合体。 http://comox.textdrive.com/pipermail/hackers/2005-January/003578.html 讨论]关于[[WordPress:Mailing Lists#Hackers|Hackers Mailing List]]上的loops以及在[http://www.maxpower.ca/wordPress-hack-sticky-adhesive-kubrick/2005/05/03/ MaxPower]上所写的指南。
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)