站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
建站程序
开发
服务器
办公软件
开发教程
服务器教程
软件使用教程
运营教程
热门电子书
WordPress教程
宝塔面板教程
CSS教程
Shopify教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
WordPress:Displaying Posts Using a Custom Select Query
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
== 描述 == 在你的WordPress发展历程的某个时刻,或许你需要通过非WordPress的[[WordPress:Template Tags/query posts | query_posts]] 架构提供的[[WordPress:Wikipedia:SELECT|选择]]标准来显示一篇或更多的文章。例如,你有时或许必须[[WordPress:Wikipedia:JOIN|加入]] WordPress表格以确定要显示的文章或使用自己表格中的储存数据来确定要显示[[WordPress:Writing Posts|正在写的文章]]。 以下概述的实例展示了这样一个过程:选择有[[WordPress:Using Custom Fields | 定制区域]]存入值的所有文章并把它们在建立在[[WordPress:Pages#Creating_your_own_Page_Templates|页面模板]]基础上的[[WordPress:Pages|页面]]显示出来。这些编码最初用来执行文章标签[[WordPress:Plugins|插件]],它允许以比WordPress[[WordPress:Manage_Categories_SubPanel|分类]]稍无序的构架来组织文章。你的使用或许有所不同,但以下的例子仍会给你提供些有用的一般过程说明。 === 文章假设 === 本文通常假设你拥有[[WordPress:Glossary#PHP|PHP]], [[WordPress:Glossary#MySQL|MySQL]]知识和WordPress 使用能力。 但此例的特定假设是: *你至少拥有一篇[[WordPress:Using Custom Fields |定制区域]]数据文章。自定义区域有“标签”键和“电子邮件”键值。 *你已创建一个[[WordPress:Pages|页面]]并有一个[[WordPress:Pages#Page_Templates|页面模板]]链接。在此例中,假定模板名称为'Qbased',它是从wp-content/themes/index.php模板复制的。如果你对此过程不熟悉,按照[[WordPress:Pages#Creating_your_own_Page_Templates|创建你自己的页面模板]]中的说明进行操作。 *由于这是稍先进的开发主题,推荐掌握[[WordPress:The Loop|循环]]的WordPress核心概念。 == 网页模板编码 == ===查询=== 首先,需要检索[[WordPress:Glossary#Recordset|数据集],里面包含你要显示的文章。要做到这一点,需要使用WordPress[[WordPress:Function_Reference/wpdb_Class|$wpdb 数据库 类]]创建一个(结果集)。注意[[WordPress:Glossary#MySQL|MySQL]] [[WordPress:Wikipedia:SELECT|SELECT]]指令阐明了一个“简单的” [[WordPress:Wikipedia:JOIN|JOIN]]。<tt>$pageposts</tt>在此会包含[[WordPress:Glossary#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> ===已修改的Loop(循环)=== 现在,若要通过以前的[[WordPress:Wikipedia:SELECT|SELECT]] 标准来显示<tt>$pageposts</tt>中的文章,你需要用Qbased网页模板中你自己的循环编码来替代[[WordPress:The Loop]]。这需要创建一个已修改的循环(loop),使它能够循环<tt>$pageposts</tt>中的文章并显示它们。注意:下面loop(循环)中的结构/标记取自WordPress“默认”[[WordPress:Using Themes|主题]]. 。 <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> 就是它! 一行一行地审查编码的重要部分,你必须: *测试以确保<tt>$pageposts</tt>中的查询可以查到符合[[WordPress:Wikipedia:SELECT|SELECT]]标准的文章: <pre> <?php if ($pageposts): ?> </pre> *[[WordPress:Wikipedia:Foreach|foreach loop]]审查已返回<tt>$pageposts</tt>的文章,并显示文章: <pre> <?php foreach($pageposts as $post): ?> </pre> *调用WordPress文章格式化函数,<tt>setup_postdata()</tt>,自动填入所需变量: <pre> <?php setup_postdata($post); ?> </pre> ==== Loop (循环)内部==== 由于例子中调用了<tt>setup_postdata($post);</tt>,你可以使用可包括在正常Wordpress循环(loop)中的相同[[WordPress:Template Tags |模板标签]],如<tt>the_content()</tt> 和 <tt>the_permalink()</tt>。这意味着你能够较方便地用网页模板创建自己的文章显示结果,并自动利用你的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> 这里值得注意的是,上述例子“只有”当<code>$wpdb->get_results()</code>是以"output_type"为参数,面向对象通过时才运行。当ARRAY_A 或ARRAY_N在$wpdb->get_results()通过时,setup_postdata()似乎不运行。 ==定制区域和类别基础上的查询== 此事例设置了上个事例中使用的$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> '''使用 wordpress2.3,你需要把以上显示的sql查询更新为:''' 此例来源于kernow在[http://wordpress.org/support/topic/121011 Forum Topic 121011] 中的回复 <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> ==致谢 == 非常感谢[http://wordpress.org/support/profile/6445 Kafkaesquii]指出填写适当全局变量等的更简便方法:使用setup_postdata()。
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)