查询语句概览

0条评论

WordPress如何创建博客页面?插件又如何修改这一创建过程?本文对这两个问题进行了简要分析。文章针对即将进行高级查询和永久链接的插件开发人员以及希望进一步了解WordPress的开发人员,希望大家能通过本文的介绍进一步扩展WordPress的功能或修复WordPress中的BUG。

大家可以通过本文中提到的WordPress核心PHP文件和函数了解更多相关信息。

下面是WordPress决定网页显示内容(日志或是页面)的过程以及相关显示步骤:

1. 访问者首次点击或输入我们某个博客页面的URL时,WordPress会执行一些核心文件(如(wp-config.php, wp-settings.php等)。执行任何一个PHP文件都会引发/包含其它PHP文件,因此对文件加载顺序的细节有兴趣的读者可以以index.php为起点,跟踪文件的反应链。

2. WordPress加载我们所激活的插件并将插件初始化(调用插件的init动作函数)。

3. 出于对插件国际化的考虑,WordPress加载“文本域”,并从当前主题中加载functions.php文件。

4. WordPress运行wp-includes/functions.php中的wp()函数。该函数将调用$wp->main()($wp是WP类的一个对象,$wp在wp-includes/classes.php中有定义)。根据这一步,WordPress会:

1. 用WP->parse_request()将URL解析成一个查询说明

2. 通过$wp_query->parse_query()($wp_query是类WP_Query的一个对象,在wp-includes/query.php中定义)设置条件标签使用的所有is_ 变量。注意,由于WP->parse_request()已经事先完成了解析任务,因此WP_Query->parse_query()在这里不会再执行任何解析工作。

3. 在WP_Query->get_posts()函数中将查询说明转换为MySQL数据库查询,执行该数据库查询,获取日志列表。将日志保存在 $wp_query对象中,以便日后用于WordPress主循环中。

4. 处理404错误。

5. 发送博客的HTTP信息头。

6. 为WordPress主循环设置变量。

5. WordPress加载我们的模板,根据模板层级决定应使用的模板文件,然后执行该模板文件(执行时基本上会依照模板文件的操作说明)。WordPress也可以执行某个feed文件来代替指定模板文件(比如wp-rss2.php)。

6. 一般情况下,模板文件或feed文件会执行WordPress主循环以显示博客日志或是某个静态页面。

7. 模板文件和feed文件还会显示一些存档、类别的永久链接或是使用内置WordPress函数的日志的永久链接。

WP->parse_request() 详细信息

上文中提到, WP->parse_request()(wp-includes/classes.php文件中,WP类的一部分)将URL解析成一个查询说明。下面是对解析步骤的概括:

1. 从URL中删去GET变量(例如,URL中“?”后的所有内容),网站主页URL中的GET变量也应删除。

2. 调用 $wp_rewrite->wp_rewrite_rules()($wp_rewrite是类WP_Rewrite的一个对象,在wp-includes/rewrite.php中定义)以获取当前有效的重写规则。重写规则是一系列关于WordPress永久链接格式的规定以及格式与规定相匹配时的操作说明。例如,假设现在有一个规则,该规则能够与删除变量后的永久链接(如category/abc)相匹配,且该规则说明表示,category/abc意味着请求“abc”类别。那么这也算是主页的一个重写规则(网站URL后没有其它内容)。

3. 按顺序检查重写规则,直到找到某个重写规则与永久链接能相匹配。没有条件符合要求时返回404错误。如果有条件符合要求,WordPress会根据规则的说明摘取信息。

4. 获取当前有效的查询变量列表。WordPress会检查所有查询变量,判断链接解析、日志提交或GET提交过程是否已经设定了这些变量。如果变量被设定,WordPress将变量值存入查询说明数组($wp->query_vars,wp-includes/classes.php中WP类的一部分)。

插件能够修改的内容

下面列出插件对以上默认查询和永久链接动作所具备的修改范围。

  • 添加、修改或删除重写规则,从而影响永久链接的解析方式。一般情况下插件会调用wp-includes/rewrite.php中的函数(如add_rewrite_rule, add_rewrite_endpoint等)而不是用过滤器函数或动作函数来完成以上添加、修改或删除过程。因为WP_Rewrite->wp_rewrite_rules()通常只获取之前保存的重写规则(这些重写规则作为“rewrite_rules”选项被保存在WordPress数据库里)。因此如果我们要修改重写规则,首先要调用$wp_rewrite->flush_rules()强制进行重新计算。这一动作要在插件的init动作中完成。
  • 添加或删除查询变量,从而影响日志、GET变量和永久链接请求(query_vars过滤器)中查询说明所保存的变量。
  • 保存变量值后,修改查询说明(request过滤器或parse_request动作函数;若希望使用条件标签检验,可使用parse_query或pre_get_posts动作函数。is_变量设置完毕后WordPress才运行这两个函数)。
  • MySQL数据库查询从查询说明中生成后,插件可修改MySQL数据库查询(posts_where, posts_join, posts_groupby, posts_orderby, posts_distinct, posts_fields, post_limits, posts_where_paged, posts_join_paged, and posts_request 过滤器函数)。
  • 修改数据库查询的结果(the_posts过滤器)。
  • 改写默认模板文件的选择(template_redirect动作)。