吵吵   2011-09-12  阅读:2,836

  原先我一直就不理解wordpress的加载过程,wordpress的整个程序是很简简单也很有条理,根目录下只有三个文件夹,分别是wp-admin,wp-content,wp-includes。这样就给予了我们一个矛盾,我们加载page时候page的文件夹在哪里呢?按照常规的说法,一个”/”是代表进入的是这个文件夹下的,可是我们在wordpress中却没有见到成群的文件夹。

  在里面最不解的就是我们的404页面了,本身的404即文件不存在的页面已经被wordpress取代了。当你输入的网址不存在的时候,你仍然可以看到你的博客头部和侧边栏,只是中间写着没有找到而已。所以我们就从这里开始去寻找一下看看是不是对404做了跳转之类的。找到.htaccess文件,下载下来一看你就都明白了:
# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress
所以说没有找到的页面试试上都被转到index.php中去了。
  那么现在我们有了一个基本的认识了,wordpress是将所有的页面都在index中执行了,那么是怎么根据url来区分不同日志的呢,如http://www.chaochaoblog.com/archives/738中包含的archives,怎么就确定应该是日志页面呢,我们来看wp-app.php中的一段代码:

global $wp_rewrite;

$this->query_vars = array();
$post_type_query_vars = array();

if ( is_array($extra_query_vars) )
$this->extra_query_vars = & $extra_query_vars;
else if (! empty($extra_query_vars))
parse_str($extra_query_vars, $this->extra_query_vars);

// Process PATH_INFO, REQUEST_URI, and 404 for permalinks.

// Fetch the rewrite rules.
$rewrite = $wp_rewrite->wp_rewrite_rules();

if ( ! empty($rewrite) ) {
// If we match a rewrite rule, this will be cleared.
$error = '404';
$this->did_permalink = true;

if ( isset($_SERVER['PATH_INFO']) )
$pathinfo = $_SERVER['PATH_INFO'];
else
$pathinfo = '';
$pathinfo_array = explode('?', $pathinfo);
$pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
$req_uri = $_SERVER['REQUEST_URI'];
$req_uri_array = explode('?', $req_uri);
$req_uri = $req_uri_array[0];
$self = $_SERVER['PHP_SELF'];
$home_path = parse_url(home_url());
if ( isset($home_path['path']) )
$home_path = $home_path['path'];
else
$home_path = '';
$home_path = trim($home_path, '/');

// Trim path info from the end and the leading home path from the
// front. For path info requests, this leaves us with the requesting
// filename, if any. For 404 requests, this leaves us with the
// requested permalink.
$req_uri = str_replace($pathinfo, '', $req_uri);
$req_uri = trim($req_uri, '/');
$req_uri = preg_replace("|^$home_path|", '', $req_uri);
$req_uri = trim($req_uri, '/');
$pathinfo = trim($pathinfo, '/');
$pathinfo = preg_replace("|^$home_path|", '', $pathinfo);
$pathinfo = trim($pathinfo, '/');
$self = trim($self, '/');
$self = preg_replace("|^$home_path|", '', $self);
$self = trim($self, '/');


这下你但是看明白了,上面的这段代码是class-wp.php中的函数function parse_request($extra_query_vars = ”)中的一小段。其实看这个函数的名称就知道是格式化请求的,再看代码它就是把“?”号前后的url分开,把“/”前后的url分开,这样子就得到了类似archieves、page等等的变量了,然后在根据这些而加载不同的内容就ok了。如首页,如分类,如日志。
后记
  其实wordpress这么做的话可能有速度变慢的之嫌(一般来说wordpress加载慢是因为标签分类导致的数据库多次读写),但是从另外一个角度讲这种做法更加具有统一性,架构逻辑或者层次比较好,还省去一堆文件夹的麻烦,这就是老外的高明之处了。也许每次都是从index进入确实有蛮浪费资源的,但是每次都会加载wp的核心库的话插件,主题神马的就轻易的都能实现了。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

12条回应:“wordpress根据url加载不同页面内容”

  1. 站长工具说道:

    节日快乐!!!!!!!!

  2. 洫之舞说道:

    你博客的文章页面也是动态的!

  3. 零度记忆说道:

    不错,这个我一直没有用过

  4. 笔记本说道:

    给WP玩懂了。还是舒服。

  5. 漫步者说道:

    写了这么长,累了吧 中秋快乐

  6. 海棠果说道:

    文章不错 支持一下博主

  7. 葉少说道:

    看不懂,o(︶︿︶)o 唉

  8. 迟到的祝福,中秋节快乐。

  9. 红涛SEO博客说道:

    呵呵,研究得挺细的

  10. 小优子说道:

    wp没用过,功能比zblog的强大吧

  11. 贺昌说道:

    分析分析WordPress也是好的,学习了

  12. 谢谢你的分享!

发表评论

电子邮件地址不会被公开。 必填项已用*标注