编辑“WordPress:Displaying Posts Using a Custom Select Query”
该编辑可以被撤销。 请检查下面的对比以核实您想要撤销的内容,然后发布下面的更改以完成撤销。
最后版本 | 您的文本 | ||
第4行: | 第4行: | ||
以下概述的实例展示了这样一个过程:选择有[[WordPress:Using Custom Fields | 定制区域]]存入值的所有文章并把它们在建立在[[WordPress:Pages#Creating_your_own_Page_Templates|页面模板]]基础上的[[WordPress:Pages|页面]]显示出来。这些编码最初用来执行文章标签[[WordPress:Plugins|插件]],它允许以比WordPress[[WordPress:Manage_Categories_SubPanel|分类]]稍无序的构架来组织文章。你的使用或许有所不同,但以下的例子仍会给你提供些有用的一般过程说明。 | 以下概述的实例展示了这样一个过程:选择有[[WordPress:Using Custom Fields | 定制区域]]存入值的所有文章并把它们在建立在[[WordPress:Pages#Creating_your_own_Page_Templates|页面模板]]基础上的[[WordPress:Pages|页面]]显示出来。这些编码最初用来执行文章标签[[WordPress:Plugins|插件]],它允许以比WordPress[[WordPress:Manage_Categories_SubPanel|分类]]稍无序的构架来组织文章。你的使用或许有所不同,但以下的例子仍会给你提供些有用的一般过程说明。 | ||
=== Assumptions made in this Article === | |||
=== 文章假设 === | === 文章假设 === | ||
Generally, this article assumes you have a working knowledge of [[WordPress:Glossary#PHP|PHP]], [[WordPress:Glossary#MySQL|MySQL]], and WordPress capabilities. | |||
本文通常假设你拥有[[WordPress:Glossary#PHP|PHP]], [[WordPress:Glossary#MySQL|MySQL]]知识和WordPress 使用能力。 | 本文通常假设你拥有[[WordPress:Glossary#PHP|PHP]], [[WordPress:Glossary#MySQL|MySQL]]知识和WordPress 使用能力。 | ||
Specific assumptions for the example, however, are: | |||
但此例的特定假设是: | 但此例的特定假设是: | ||
* | * You have at least one post with [[WordPress:Using Custom Fields | Custom Fields]] data. The Custom Fields should have a key of 'tag' and a value of 'email' | ||
*你至少拥有一篇[[WordPress:Using Custom Fields | Custom Fields]]数据文章。自定义字段有“标签”键和“电子邮件”键值。 | |||
* You have created a [[WordPress:Pages|Page]] and associated a [[WordPress:Pages#Page_Templates|Page Template]] with that page. For this example, assume the Template Name is 'Qbased' and was copied from the ''wp-content/themes/index.php'' template. If you are not familiar with this process, follow the instructions in [[WordPress:Pages#Creating_your_own_Page_Templates|Creating your own Page Templates]]. | |||
*你已创建一个[[WordPress:Pages|Page]]并有一个[[WordPress:Pages#Page_Templates|Page Template]]链接。在此例中,假定模板名称为'Qbased',它是从wp-content/themes/index.php模板复制的。如果你对此过程不熟悉,按照[[WordPress:Pages#Creating_your_own_Page_Templates|Creating your own Page Templates]]中的说明进行操作。 | |||
* As this is a somewhat advanced developer topic, familiarity with the core WordPress concept of [[WordPress:The Loop|循环]] is suggested. | |||
*由于这是稍先进的开发主题,推荐掌握[[WordPress:The Loop|循环]]的WordPress核心概念。 | *由于这是稍先进的开发主题,推荐掌握[[WordPress:The Loop|循环]]的WordPress核心概念。 | ||
== Code for the Page Template == | |||
== 网页模板编码 == | == 网页模板编码 == | ||
===The query=== | |||
===查询=== | ===查询=== | ||
To begin with, it is necessary to retrieve the [[WordPress:Glossary#Recordset|recordset]] containing the posts you want to display. To do this, create a result set using the WordPress [[WordPress:Function_Reference/wpdb_Class|$wpdb database class]]. Note that the [[WordPress:Glossary#MySQL|MySQL]] [[WordPress:Wikipedia:SELECT|SELECT]] statement illustrates a '''simple''' [[WordPress:Wikipedia:JOIN|JOIN]]. Here, <tt>$pageposts</tt> will contain an [[WordPress:Glossary#Array|array]] of objects. Each object will represent a '''published''' post that has custom field key-value pair - with the key being 'tag' and the value being 'email': | |||
首先,需要检索[[WordPress:Glossary#Recordset| | 首先,需要检索[[WordPress:Glossary#Recordset|recordset]](数据集),里面包含你要显示的文章。要做到这一点,需要使用WordPress[[WordPress:Function_Reference/wpdb_Class|$wpdb database class]]创建一个result set(结果集)。注意[[WordPress:Glossary#MySQL|MySQL]] [[WordPress:Wikipedia:SELECT|SELECT]]指令阐明了一个“简单的” [[WordPress:Wikipedia:JOIN|JOIN]]。<tt>$pageposts</tt>在此会包含[[WordPress:Glossary#Array|array]]对象。每个对象代表一篇有自定义字段key-value(键-键值)配对且键名为tag,值为email的“已发布”文章。 | ||
<pre> | |||
<?php | |||
$querystr = " | |||
SELECT wposts.* | |||
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta | |||
WHERE wposts.ID = wpostmeta.post_id | |||
AND wpostmeta.meta_key = 'tag' | |||
AND wpostmeta.meta_value = 'email' | |||
AND wposts.post_status = 'publish' | |||
AND wposts.post_type = 'post' | |||
ORDER BY wposts.post_date DESC | |||
"; | |||
$pageposts = $wpdb->get_results($querystr, OBJECT); | |||
?> | |||
</pre> | |||
<pre> | <pre> | ||
<?php | <?php | ||
第43行: | 第69行: | ||
===The Revised Loop=== | |||
===已修改的Loop(循环)=== | ===已修改的Loop(循环)=== | ||
现在,若要通过以前的[[WordPress:Wikipedia:SELECT|SELECT]] 标准来显示<tt>$pageposts</tt>中的文章,你需要用Qbased网页模板中你自己的循环编码来替代[[WordPress:The Loop]]。这需要创建一个已修改的循环(loop),使它能够循环<tt>$pageposts</tt>中的文章并显示它们。注意:下面loop(循环)中的结构/标记取自WordPress“默认”[[WordPress:Using Themes| | |||
Now, to display posts collected into <tt>$pageposts</tt> by the previous [[WordPress:Wikipedia:SELECT|SELECT]] criteria, you need to replace [[WordPress:The Loop]] with your own loop code in the ''Qbased'' Page Template. This requires creating a revised loop that cycles through the posts stored in <tt>$pageposts</tt> and displays them. Note: the structure / markup in the loop below is taken from the WordPress '''default''' [[WordPress:Using Themes|theme]]. | |||
现在,若要通过以前的[[WordPress:Wikipedia:SELECT|SELECT]] 标准来显示<tt>$pageposts</tt>中的文章,你需要用Qbased网页模板中你自己的循环编码来替代[[WordPress:The Loop]]。这需要创建一个已修改的循环(loop),使它能够循环<tt>$pageposts</tt>中的文章并显示它们。注意:下面loop(循环)中的结构/标记取自WordPress“默认”[[WordPress:Using Themes|theme]]. | |||
。 | 。 | ||
<pre> | <pre> | ||
<?php if ($pageposts): ?> | <?php if ($pageposts): ?> | ||
第68行: | 第99行: | ||
<?php endif; ?> | <?php endif; ?> | ||
</pre> | </pre> | ||
<pre> | |||
<?php if ($pageposts): ?> | |||
<?php foreach ($pageposts as $post): ?> | |||
<?php setup_postdata($post); ?> | |||
<div class="post" id="post-<?php the_ID(); ?>"> | |||
<h2><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 class="entry"> | |||
<?php the_content('Read the rest of this entry »'); ?> | |||
</div> | |||
<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> | |||
<?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p> | |||
</div> | |||
<?php endforeach; ?> | |||
<?php else : ?> | |||
<h2 class="center">Not Found</h2> | |||
<p class="center">Sorry, but you are looking for something that isn't here.</p> | |||
<?php include (TEMPLATEPATH . "/searchform.php"); ?> | |||
<?php endif; ?> | |||
</pre> | |||
And that's it! | |||
就是它! | 就是它! | ||
To go through the important parts of the code, line by line, you have: | |||
一行一行地审查编码的重要部分,你必须: | 一行一行地审查编码的重要部分,你必须: | ||
* A test to make sure that the query that populated <tt>$pageposts</tt> actually found some posts that matched the [[WordPress:Wikipedia:SELECT|SELECT]] criteria: | |||
*测试以确保<tt>$pageposts</tt>中的查询可以查到符合[[WordPress:Wikipedia:SELECT|SELECT]]标准的文章: | *测试以确保<tt>$pageposts</tt>中的查询可以查到符合[[WordPress:Wikipedia:SELECT|SELECT]]标准的文章: | ||
第78行: | 第136行: | ||
<?php if ($pageposts): ?> | <?php if ($pageposts): ?> | ||
</pre> | </pre> | ||
* A [[WordPress:Wikipedia:Foreach|foreach loop]] to go through the posts returned in <tt>$pageposts</tt> and display them: | |||
<pre> | |||
<?php foreach($pageposts as $post): ?> | |||
</pre> | |||
<pre> | |||
<?php if ($pageposts): ?> | |||
</pre> | |||
* A [[WordPress:Wikipedia:Foreach|foreach loop]] to go through the posts returned in <tt>$pageposts</tt> and display them: | |||
*[[WordPress:Wikipedia:Foreach|foreach loop]]审查已返回<tt>$pageposts</tt>的文章,并显示文章: | *[[WordPress:Wikipedia:Foreach|foreach loop]]审查已返回<tt>$pageposts</tt>的文章,并显示文章: | ||
<pre> | <pre> | ||
第83行: | 第149行: | ||
</pre> | </pre> | ||
* And, a call to the WordPress post formatting function, <tt>setup_postdata()</tt>, that automatically populates the required variables: | |||
<pre> | |||
<?php setup_postdata($post); ?> | |||
</pre> | |||
*调用WordPress文章格式化函数,<tt>setup_postdata()</tt>,自动填入所需变量: | *调用WordPress文章格式化函数,<tt>setup_postdata()</tt>,自动填入所需变量: | ||
<pre> | <pre> | ||
第89行: | 第160行: | ||
==== Within the Loop ==== | |||
==== Loop (循环)内部==== | ==== Loop (循环)内部==== | ||
Because <tt>setup_postdata($post);</tt> was called in our example, you can use the same [[WordPress:Template Tags | template tags]] that can be included in a normal WordPress post loop, like <tt>the_content()</tt> and <tt>the_permalink()</tt>. This means that you can create your own post display results using a Page Template with a minimum amount of fuss, automatically taking advantage of the various plugins you may have activated in your WordPress blog to provide extra formatting and functionality. | |||
由于例子中调用了<tt>setup_postdata($post);</tt>,你可以使用可包括在正常Wordpress循环(loop)中的相同[[WordPress:Template Tags | template tags]],如<tt>the_content()</tt> 和 <tt>the_permalink()</tt>。这意味着你能够较方便地用网页模板创建自己的文章显示结果,并自动利用你的Wordpress博客已激活的各种插件提供额外的格式和功能。 | |||
=== The Completed Page Template === | |||
===已完成的网页模板=== | ===已完成的网页模板=== | ||
Here is a complete example of the new template that works with the WordPress '''default''' theme. | |||
这是Wordpress“默认”主题运行的新模板的完整事例。 | 这是Wordpress“默认”主题运行的新模板的完整事例。 | ||
<pre> | |||
<?php | |||
/* | |||
Template Name: Qbased | |||
*/ | |||
?> | |||
<?php get_header(); ?> | |||
<div id="content" class="narrowcolumn"> | |||
<?php | |||
$querystr = " | |||
SELECT wposts.* | |||
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta | |||
WHERE wposts.ID = wpostmeta.post_id | |||
AND wpostmeta.meta_key = 'tag' | |||
AND wpostmeta.meta_value = 'email' | |||
AND wposts.post_status = 'publish' | |||
AND wposts.post_type = 'post' | |||
AND wposts.post_date < NOW() | |||
ORDER BY wposts.post_date DESC | |||
"; | |||
$pageposts = $wpdb->get_results($querystr, OBJECT); | |||
?> | |||
<?php if ($pageposts): ?> | |||
<?php foreach ($pageposts as $post): ?> | |||
<?php setup_postdata($post); ?> | |||
<div class="post" id="post-<?php the_ID(); ?>"> | |||
<h2><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 class="entry"> | |||
<?php the_content('Read the rest of this entry »'); ?> | |||
</div> | |||
<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> | |||
<?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p> | |||
</div> | |||
<?php endforeach; ?> | |||
<?php else : ?> | |||
<h2 class="center">Not Found</h2> | |||
<p class="center">Sorry, but you are looking for something that isn't here.</p> | |||
<?php include (TEMPLATEPATH . "/searchform.php"); ?> | |||
<?php endif; ?> | |||
</div> | |||
<?php get_sidebar(); ?> | |||
<?php get_footer(); ?> | |||
</pre> | |||
<pre> | <pre> | ||
<?php | <?php | ||
第152行: | 第290行: | ||
</pre> | </pre> | ||
It is important to note here that the above example will work '''only''' when OBJECT is passed as the "output_type" parameter for <code>$wpdb->get_results()</code>. setup_postdata() does not seem to work when ARRAY_A or ARRAY_N is passed in $wpdb->get_results(). | |||
这里值得注意的是,上述例子“只有”当<code>$wpdb->get_results()</code>是以"output_type"为参数,面向对象通过时才运行。当ARRAY_A 或ARRAY_N在$wpdb->get_results()通过时,setup_postdata()似乎不运行。 | 这里值得注意的是,上述例子“只有”当<code>$wpdb->get_results()</code>是以"output_type"为参数,面向对象通过时才运行。当ARRAY_A 或ARRAY_N在$wpdb->get_results()通过时,setup_postdata()似乎不运行。 | ||
== | |||
==Query based on Custom Field and Category== | |||
==自定义字段和类别基础上的查询== | |||
This next example sets the $querystr variable used in the above example, to get all posts in Categories 1,2, and 3, that have the meta_key 'paragraf', and then sorted ascending by the meta_values. This example gleaned from Otto42's response in [http://wordpress.org/support/topic/121011 Forum Topic 121011]. | |||
此事例设置了上个事例中使用的$querystr变量以获得类别1,2,和3中的有meta_key 'paragraf'的所有文章,并按meta_values升序排列。此例来源于Otto42在[http://wordpress.org/support/topic/121011 Forum Topic 121011]. | 此事例设置了上个事例中使用的$querystr变量以获得类别1,2,和3中的有meta_key 'paragraf'的所有文章,并按meta_values升序排列。此例来源于Otto42在[http://wordpress.org/support/topic/121011 Forum Topic 121011]. | ||
中的回复。 | 中的回复。 | ||
<pre> | |||
$querystr = " | |||
SELECT $wpdb->posts.* | |||
FROM $wpdb->posts | |||
LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) | |||
LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) | |||
WHERE $wpdb->postmeta.meta_key = 'paragraf' | |||
AND $wpdb->posts.post_status = 'publish' | |||
AND $wpdb->posts.post_type = 'post' | |||
AND $wpdb->post2cat.category_id IN (1,2,3) | |||
ORDER BY $wpdb->postmeta.meta_value ASC | |||
"; | |||
</pre> | |||
<pre> | <pre> | ||
$querystr = " | $querystr = " | ||
第171行: | 第332行: | ||
</pre> | </pre> | ||
'''with wordpress 2.3 you need to update the sql query shown above to this:''' | |||
This example gleaned from kernow's response in [http://wordpress.org/support/topic/121011 Forum Topic 121011] | |||
'''使用 wordpress2.3,你需要把以上显示的sql查询更新为:''' | '''使用 wordpress2.3,你需要把以上显示的sql查询更新为:''' | ||
此例来源于kernow在[http://wordpress.org/support/topic/121011 Forum Topic 121011] 中的回复 | 此例来源于kernow在[http://wordpress.org/support/topic/121011 Forum Topic 121011] 中的回复 | ||
<pre> | <pre> | ||
SELECT * FROM $wpdb->posts | SELECT * FROM $wpdb->posts | ||
第187行: | 第350行: | ||
ORDER BY $wpdb->postmeta.meta_value ASC | ORDER BY $wpdb->postmeta.meta_value ASC | ||
</pre> | </pre> | ||
<pre> | |||
SELECT * FROM $wpdb->posts | |||
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) | |||
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id) | |||
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) | |||
WHERE $wpdb->term_taxonomy.term_id = 1,2,3 | |||
AND $wpdb->term_taxonomy.taxonomy = 'category' | |||
AND $wpdb->posts.post_status = 'publish' | |||
AND $wpdb->postmeta.meta_key = 'paragraf' | |||
ORDER BY $wpdb->postmeta.meta_value ASC | |||
</pre> | |||
== Acknowledgements == | |||
==致谢 == | ==致谢 == | ||
Many thanks to [http://wordpress.org/support/profile/6445 Kafkaesquii] for pointing out a simpler method of populating the appropriate global variables, etc, using setup_postdata(). | |||
非常感谢[http://wordpress.org/support/profile/6445 Kafkaesquii]指出填写适当全局变量等的更简便方法:使用setup_postdata()。 | 非常感谢[http://wordpress.org/support/profile/6445 Kafkaesquii]指出填写适当全局变量等的更简便方法:使用setup_postdata()。 |