2017-09-20

猎数博客

数据挖掘,机器学习

WordPress Query概论

作者:江航 / 2011-05-28 / (阅读 1,695 次) /



这里是原文

这篇文章是对Wordpress的整个处理过程的一个概论,还包括了插件可以做些什么,插件可以在哪些点修改缺省的处理流程。在对wordpress的概念有了基本的了解以后,这篇文章算是一个小的总结了。比较值得一读,因此打算把这篇文章全文翻译出来:

对Wrodpress开发者而言,这篇文章提供了一个关于如何建立博客页面以及插件如何修改wordpress处理过程的概论。本文的目标读者是那些插件开发者和那些希望添加新的功能到wordpress中或者修改wordpress bug的开发者。

对于更多的细节,你需要去读文中提到的wordpress的核心php代码和函数。

下面是wordpress决定哪些文章或者页面需要显示并且显示他们的步骤:

当访客第一次点击或者输入URL来访问你的博客时,WP开始运行一些核心的代码(比如说wp-config.php, wp-setting.php 等等)。如果你对这些文件的调用顺序感兴趣的话,你可以从index.php开始,顺着每个php的include文件找下去。

WP装载和初始化你启用的插件(同事调用插件的初始化函数)

WP装载启用主题的text domain?和functios.php。

WP运行wp()函数(在wp-includes/functions.phz中),而这个函数会调用$wp->main() ($wp是类WP的一个实例,它在wp-includes/classes.php中定义),这个告诉WP去做下面的事情:

  1. 调用WP->parse_request()来解析URL,详细如下
  2. 调用$wp_query->parse_query()来设置所有的is_ 变量,这些is_ 变量将在条件标签中使用。虽然这个函数名字叫WP_Query->parse_query,但实际上他并没有做真正的解析动作,因为这个解析动作已经在WP->parse_request()中已经做完了。
  3. 把这些查询变量转化成Mysql查询语句,并且运行mysql查询,得到文章的列表,在函数WP_Query->get_posts()中,把这些选出来的文章存在$wp_query中,这个变量将在WP循环中使用。
  4. 处理404错误。
  5. 送出博客的HTTP头。
  6. 为WP循环建立一些变量

WP通过模版结构来识别并加载你的模版,并且运行模版PHP。否则运行FEED文件。

通常,模版或者FEED运行WP循环来打印文章或者静态页面。

模版和FEED也会通过WP自定义的一些函数打印一些到存档,分类或者文章的一些静态链接

关于WP->parse_request 更多的内容

就像上面提到的,WP->parse_request()将URL解析成一些查询变量。下面是这些步骤的一个小结:

  1. 从URL中分离出变量(根据URL中的“?”)。同时也解析出博客的首页地址。
  2. 通过调用$wp_rewrite->wp_rewrite_rules()获取当前有效的重写规则($wp_rewrite是WP_Rewrite的一个实例,而WP_Rewrite定义在wp-include/rewrite.php中)。这些重写规则实际上是一系列静态链接的模式匹配规则,也就是如果什么模式对应到什么查询变量。比如说,缺省有一个规则是如果在链接中找到category/abc,那么就是说分类abc被请求。那里也有一些相对于首页的重写规则。
  3. 通过逐条处理重写规则,直到找到跟当前链接匹配的重写规则,如果一个都没找到就报一个404错误。如果规则找到了,WP将根据规则从链接中抽取信息
  4. 获取当前有效的一系列查询变量,对于每个查询变量,WP检查它是否在链接解析/文章提交/获取提交的过程中被设置,如果被设置了,WP就把这些变量保存在一个查询数组中($wp->query_vars,是WP类的一部分,定义在wp-include/classes.php中)。

插件可以修改什么

下面关于插件的简介,介绍了插件怎样修改上面提到的缺省查询和链接,有很多这样的修改在文章自定义查询中有描述(还有一些实例)。

  • 添加,修改,删除重写规则来影响链接如何被解析。这一般通过调用wp-include/rewrite.php中的函数来是想,而不是在过滤器和动作中执行,这些调用的函数包括add_rewrite_rule,add_rewrite_endpoint等等。这里有一些小的技巧,因为WP_Rewrite->wp_rewrite_rules()通常只是获取以前保存下来的重写规则(这些规则以参数“rewrite_rules”的形式保存在WP数据库中)。因此,如果你想修改重写规则,你需要调用$wp_rewrite->flush_rules() 来强制更新。你需要在你的插件初始化的时候做这些事情,以保证这些重写规则在足够早的时候被更新。
  • 添加或者删除查询变量,一次来影响哪些变量在POST,GET以及链接解析中被保存在查询规则中
  • 修改查询规则,在查询变来那个被保存以后。(request过滤器或者parse_request动作;如果你想使用条件标签,请使用parse_query或者pre_get_posts动作,因为这些动作都是在 is_ 变量设置以后执行)
  • 在mysql查询从查询规则建立以后修改mysql数据库查询,(有这些过滤器posts_where, posts_join, posts_groupby, posts_orderby, posts_distinct, posts_fields, post_limits, posts_where_pages, posts_join_paged和posts_request过滤器)
  • 修改数据库查询结果(过滤器the_posts)
  • 修改缺省的模版加载规则(template_redirect动作)


Wordpress一览无余,源码面前没有秘密,wordpress的函数调用库,展示wordpress页面打开过程中十几万个函数调用,学习WP开发的绝佳资源。点击这里进入

本文地址: http://www.bagualu.net/wordpress/archives/660 转载请注明






相关文章

  • 再说Wordpress中添加小挂件widget( 5,869 )
  • Wordpress中添加自定义参数( 3,411 )
  • WordPress代码之apply_filters( 3,272 )
  • 微博分享按钮( 3,226 )
  • WordPress版权声明插件( 3,199 )
  • wordpress函数调用库( 2,634 )
  • 通过wpdb访问WordPress数据库( 2,443 )
  • 通过wordpress debug插件,显示filter调用过程( 2,404 )
  • 用Wordpress做相册( 2,398 )
  • WordPress 代码之 add_filter( 2,337 )
  • Leave a Reply

    您必须登录以发表评论,

    沪ICP备11036560号
    联系我: jianghang at bagualu.net