全局变量和 WordPress 主循环
July 7th, 2007 Denis
当制作 WordPress 的插件,有一点必须快速掌握的东西就是 WordPress 的主循环和全局变量。一旦掌握之后,插件作者就能知道哪个变量是可以访问的,而哪个不能。
使用某些 WordPress Action 和 Filters,可以很容易知道在主循环中哪里执行了哪些代码。然而有时你不想使用 action 或者 filter 而只想在主循环中调用模板标签。当这么做的时候,你需要确信对你尝试去访问的全局变量和想实现的结果都要非常了解。
在这篇日志,我将剖析 WordPress 主循环以便你能对哪些变量可以被模板标签(在 WordPress 主循环中函数调用)调用有个更好的理解。
WordPress 主循环 — The WordPress Loop

WordPress 主循环是用来在特定的页面上显示日志和在单篇日志页面页显示评论留言的循环。
在默认主题的 index.php 中,主循环在当以下这些代码之后开始:
<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?>
have_posts() 和 the_post() 这两个函数都是属性函数,类 WP_Query class 中的访问方法。
have_posts 这个函数去查看是否当前日志的数目少于你在后台界面选择要显示的日志数目。这个主循环将会继续知道当前日志数目达到你已决定显示的日志的最大数目。
如果你剖析过 the_post 函数,你会发现它搜索 $post 这个全局变量。 the_post 函数获取第一篇日志(随后的日志通过每次循环迭代),并设置日志数据(作者,多重-页面,等等),这些数据是全局地赋给 $post 这个变量,所以你也可以访问它。
在 the_post() 函数被调用之后,你就可以访问许多模板标签和全局变量。下面就是现在可用的模板标签的一些例子:
- the_author:获取作者的名字。
- the_title:显示当前日志的标题。
- the_content:显示日志的内容。
- the_permalink:显示日志的永久链接的 URL。
- the_ID:显示日志的 ID。
下面列出的全局变量等同上面的每个模板标签:
-
全局变量 authordata 可以被使用,你可以通过在一个函数中使用以下代码调用它:
global $authordata; echo $authordata->display_name;
通过 authordata 这个全局变量你还可以访问:last_name,first_name,ID,user_email,user_url,user_login,description 和其他。
-
全局变量 post 可以被使用,你可以通过在一个函数中使用以下代码调用它:
global
$post; echo$post->post_title;通过 post 这个全局变量你还可以访问:ID,post_author,post_date,post_excerpt,comment_count 和其他。
-
全局变量 post 可以被使用,你可以通过在一个函数中使用以下代码调用它:
global
$post; echo$post->post_content;记住,通过这种方法访问日志内容是没有经过过虑的(unfiltered )和没有被触动过的日志内容。这是非常有用,如果你想按照你自己喜好去操纵日志的内容,取代 WordPress 在日志内容外观方面拥有的发言权。
- 没有快速的全局访问,但是所有 the_permalink 这个函数所作的是输出函数 get_permalink 在假定 $id 这个变量已经被设定情况下的结果。
-
全局变量 id 可以被使用,你可以通过在一个函数中使用以下代码调用它:
global
$id; echo$id;
一个模板标签的例子
假设你写了一个自定义的模板标签叫做 get_my_trackback,它能够做些事情在每次一个 trackback 在留言循环中被侦测到。我们将把这个函数放入 comment.php 模板文件的 foreach 留言循环中。这个例子假定你在单一日志中并使用 single.php 文件。
<?php foreach ($comments as $comment) : ?> get_my_trackback(); <?php endforeach; /* end for each comment */ ?>
在 get_my_trackback 函数中,你将干些:
function get_my_trackback() { global $comment; if (empty($comment)) { return; } if ($comment->comment_type != 'comment') { //do trackback stuff } }

comments 让你能够全局访问留言的数据库条目,所你能做任何关于留言的事情,请注意全局变量是没有假定被赋值的。你需要在操作之前确认变量是否已被赋值,那样错误就会最小的。
结论
在这篇文章中,WordPress 主循环已被剖析了而且解释了全局变量以便你你能从一个包含的一个文件的模板标签中或者一个 WordPress 插件中访问他们。如果你有任何问题,评论,或者有什么补充,请不要犹豫,立刻给我们留言。
翻译自:Global Variables and the WordPress Loop,本文的原作者是Ronald Huereca 是 Ajax Edit Comments 和 Feed Styler 这个插件的住者。本文翻译的有些草率,如果有什么错误,请指出。谢谢
作者:Denis
原文链接:全局变量和 WordPress 主循环





1. FanZy | May 21, 2008 at 10:44 pm | #
为什么我自己写page和single模板时主循环会把所有日志调出来?
<?php edit_post_link(__(’编辑此页面’), ”, ”); ?>
2. ff13dfly | August 21, 2008 at 12:38 pm | #
请问您一个问题,就是您上文提到的
“have_posts 这个函数去查看是否当前日志的数目少于你在后台界面选择要显示的日志数目。这个主循环将会继续知道当前日志数目达到你已决定显示的日志的最大数目。”
这个后台日志数在哪里设置?一直未找到,不甚感激。
3. ff13dfly | September 3, 2008 at 1:10 pm | #
找到设置了,问题解决了,还是谢谢。