wordpress源码建站下载

WordPress 源码分析-主流程分析

背景

作为一个优秀的开源项目,wordpress 在全球有着极其广泛的应用。但是由于wordpress框架中,经常使用global进行赋值,导致初次使用它的程序员不能很快对它的整体架构有一个直观的认识。在一位特殊朋友进入一家使用wordpress的公司后,熟悉wordpress比较慢,帮忙做了一次整理;在此,我将整理的过程记录下来。

三个阶段

首先,我们先整体了解下wordpress的三个主要流程:初始化(资源加载)、准备数据和渲染。

我们都知道,wordpress的主入口文件是index.php。在 index.php 中 引入了文件 wp-blog-header.php 。

// wp-blog-header.phpif ( ! isset( $wp_did_header ) ) { $wp_did_header = true; // Load the WordPress library. require_once __DIR__ . '/wp-load.php'; // Set up the WordPress query. wp(); // Load the theme template. require_once ABSPATH . WPINC . '/template-loader.php';}

此文件中,即包含了wordpress加载的三个阶段:

资源加载阶段:

require_once __DIR__ . '/wp-load.php';

数据准备阶段:

// Set up the WordPress query.wp();

渲染阶段:

// Load the theme template. require_once ABSPATH . WPINC . '/template-loader.php';

三个阶段的加载流程图:

wordpress 加载流程

接下来,我们看看每个阶段所做的事情。

资源加载阶段

资源加载

资源加载的引用关系如上图,wp-load.php 引入wp-config.php, wp-config.php 引入 wp-settings.php,核心的加载逻辑在 wp-settings.php中。

资源加载阶段,主要是加载所有依赖的PHP库和文件,包括各种核心类,functions,插件 等等。

需要注意的一点是,在wordpress 未安装成功时,是没有wp-config.php这个文件的。

数据准备阶段

数据准备阶段的入口是 wp-blog-header.php 中的 wp() 函数;wp函数的定义是在functions.php中;最终会调用到 class-wp.php 中的 main() 方法。

main() 方法主要做三件事情:

parse_request(): 解析请求的参数query_posts(): 通过请求的参数查询文章register_globals(): 注册全局数据,以便渲染阶段可以获取数据

我们重点关注第2和第3这两个事情。

查询文章

query_posts() 会调用 class-wp-query.php 中的 query() 方法,query() 方法做两件事情:

init(): 重置所有数据get_posts(): 查询文章

get_posts() 方法会调用当前类的 parse_query() 方法,此方法接近1000行,是整个wordpress中最核心的逻辑。

parse_query() 逻辑复杂,我们只关注两件事情:

解析请求的数据(get/post),构造读取/写入的数据和条件,包括日期数据文章标题附件。。。。其他条件根据url请求参数判断当前请求是哪个页面,例如设置is_home = true,就表示为首页,is_page = true 表示是文章页面;设置当前页面,在数据渲染阶段会用到。

parse_query() 方法查询到的文章,会放到当前类的posts属性和post属性中。如果我们需要debug,可以在此方法的尾部dump查询的sql

var_dump($where . $groupby . $orderby . $limits . $join);

帖子查询

get_posts()执行完毕后,我们也就获取到了想要的文章(根据url参数查询出来的),然后进入注册全局数据阶段,即 register_globals();

register_globals() 方法的代码相对简单,如下:

public function register_globals() { global $wp_query; // Extract updated query vars back into global namespace. foreach ( (array) $wp_query->query_vars as $key => $value ) { $GLOBALS[ $key ] = $value; } $GLOBALS['query_string'] = $this->query_string; $GLOBALS['posts'] = & $wp_query->posts; $GLOBALS['post'] = isset( $wp_query->post ) ? $wp_query->post : null; $GLOBALS['request'] = $wp_query->request; if ( $wp_query->is_single() || $wp_query->is_page() ) { $GLOBALS['more'] = 1; $GLOBALS['single'] = 1; } if ( $wp_query->is_author() && isset( $wp_query->post ) ) { $GLOBALS['authordata'] = get_userdata( $wp_query->post->post_author ); } }

其中主要的为:

$GLOBALS['posts'] = & $wp_query->posts;$GLOBALS['post'] = isset( $wp_query->post ) ? $wp_query->post : null;

这两行代码将上一步查询到的文章和文章的列表,放入了$GLOBALS中,在渲染阶段,会从 $GLOBALS 读取文章内容。

渲染阶段

入口为 template-loader.php 文件,会先判断当前请求的是哪个页面,在数据准备阶段中的 parse_query() 已经计算出来了。核心代码如下:

$tag_templates = array( 'is_embed' => 'get_embed_template', 'is_404' => 'get_404_template', 'is_search' => 'get_search_template', 'is_front_page' => 'get_front_page_template', 'is_home' => 'get_home_template', 'is_privacy_policy' => 'get_privacy_policy_template', 'is_post_type_archive' => 'get_post_type_archive_template', 'is_tax' => 'get_taxonomy_template', 'is_attachment' => 'get_attachment_template', 'is_single' => 'get_single_template', 'is_page' => 'get_page_template', 'is_singular' => 'get_singular_template', 'is_category' => 'get_category_template', 'is_tag' => 'get_tag_template', 'is_author' => 'get_author_template', 'is_date' => 'get_date_template', 'is_archive' => 'get_archive_template', ); $template = false; // Loop through each of the template conditionals, and find the appropriate template file. foreach ( $tag_templates as $tag => $template_getter ) { if ( call_user_func( $tag ) ) { $template = call_user_func( $template_getter ); } if ( $template ) { if ( 'is_attachment' === $tag ) { remove_filter( 'the_content', 'prepend_attachment' ); } break; } } if ( ! $template ) { $template = get_index_template(); }

$tag_templates 数组中的 key, 其实是一个回调函数,全部定义在 wp-includes/query.php中,实际调用的方法是 class-wp-query.php 中对应的方法名。

在计算出当前页面后,就根据当前配置的主题,去加载主题下的模板文件。

在模板文件中,我们就可以获取到之前准备好的数据($GLOBALS中的数据)。以文章内容为例,

在模板中,调用the_content()方法,the_content()方法定义在post-template.php中,the_content() 再调用 get_the_content(), get_the_content() 调用 post.php 中的 get_post(), get_post()定义如下:

function get_post( $post = null, $output = OBJECT, $filter = 'raw' ) { if ( empty( $post ) && isset( $GLOBALS['post'] ) ) { $post = $GLOBALS['post']; } if ( $post instanceof WP_Post ) { $_post = $post; } // 其他代码 ..... return $_post;}

方法的第一行就用 $GLOBALS 中取到了之前准备好的文章数据。

拿到文章数据后,get_the_content() 方法会对文章数据进行组装,返回给 the_content() , 由the_content() 方法进行输出。

总结

到此,我们将这个wordpress的加载流程梳理一下,希望对大家在看源码时有所帮助。源码中还有很多细节需要自行梳理,在梳理时,需要注意的就是global的使用。

WP菜鸟建站23:wordpress网站的robots文件代码怎样写比较好?

为什么要给wordpress网站创建一个robots.txt文件?问到这个问题,我们就不得不说一下搜索引擎蜘蛛爬取我们的wordpress网站时的原理了。搜索引擎蜘蛛从某个网站入口(如:其它网站给我们wordpress网站做的友情链接 或 通过我们的wordpress网站的某个页面)进入到我们的wordpress网站,然后,在我们网站没有针对搜索引擎的爬取设置相应的规则时,蜘蛛就会毫无顾虑地爬向我们网站的任何地方,包括我们网站的核心代码——wordpress程序的所有php代码。还有我们wordpress网站的其它隐私。

而对于我们这些认真做站的wordpress站长们,只希望搜索引擎们快速地抓取我们的web前端页面,以利于我们wordpress网站的自然排名,而不是让蜘蛛们把时间浪费在我们的那些后端代码文件上。所以,我们就要为我们的wordpress网站添加一个限制蜘蛛爬取的文件(robots.txt),规定蜘蛛可以爬取哪些地方,哪些地方不让它们进去,等于给我们的wordpress网站请了一个门卫。那么,怎样写这个robots.txt文件内容呢?

一、wordpress自动创建的robots.txt。

一般情况下,在我们为网站安装好wordpress程序后,wordpress会网站根目录自动为我们的网站创建一个robots.txt文件(如下图)。

我们可以看到,wordpress程序只是为网站的robots.txt文件添加了3句简单的代码:

User-agent: *

Disallow: /wp-admin/

Allow: /wp-admin/admin-ajax.php

从上面的代码中,wordpress不允许搜索引擎蜘蛛爬取/wp-admin/目录,但允许蜘蛛爬取/wp-admin/admin-ajax.php文件。

二、手动修改worddpress网站的robots.txt文件内容。

在wordpress程序自动创建的robots.txt文件代码,显然不能满足我们网站的要求。作为资深的wordpress站长,我们当然了解,我们的wordpress网站哪些地方是不能让搜索引擎蜘蛛爬取的,如: wordpress程序的核心文件目录/wp-admin/和/wp-includes/、我们给网站安装的插件目录/wp-content/plugins/和wordpress主题模板目录/wp-content/themes/。当然,每一个wordpress站长,可能都有这样那样的不想让搜索引擎爬取的地方。

?下面是锐锋 堂 网站的robots.txt内容:

User-Agent: * (*星号,表示允许所以的搜索引擎蜘蛛)

Disallow: /wp-admin/ (disallow 表示不允许,不允许爬取/wp-admin/核心文件目录)

Disallow: /wp-includes/ (不允许爬取/wp-includes/核心文件目录)

Disallow: /wp-content/plugins (不允许爬取wordpress插件目录)

Disallow: /wp-content/themes (不允许爬取wordpress主题目录)

Disallow: /plus/ad_js.php (不允许爬取这个PHP文件)

Disallow: /plus/posttocar.php

Disallow: /anli/weixin (其它目录)

Disallow: /themes

Disallow: /get_activation

Disallow: /*?* (不允许蜘蛛爬取URL中带问号的链接)

Disallow: /*&* (不允许蜘蛛爬取URL中带&的链接)

Disallow: /*.rar (不允许蜘蛛爬取rar后缀的文件)

Disallow: /*.zip (不允许蜘蛛爬取zip后缀的压缩文件)

Sitemap: http : //wanlimm . com/sitemap.html (允许蜘蛛爬取网站静态地图)

Sitemap: http : //wanlimm . com/sitemap.xml (允许蜘蛛爬取sitemap网站地图)

三、robots.txt关键词的简单解说。

上面,只是对锐锋堂的robots.txt文件代码进行一次解说。作为wordpress站长的你,应该根据自己网站的不同情况,在自己网站的robots.txt文件中添加对应的代码。其实,robots.txt代码的规则还是非常简单的,就那么几个关键词:User-Agent(搜索引擎蜘蛛名)、Disallow(不允许)、Allow(允许)、Sitemap(指定网站的地图文件)。

如果我们只想让百度蜘蛛爬取我们的wordpress网站,而不让其它的搜索引擎蜘蛛进我的网站爬取,我们可以把上面代码中的User-Agent:* 修改成 User-Agent:baiduspider 。

另外,“Disallow: /wp-admin/” 与 “Disallow: /wp-admin”也表示不同的意思,虽然后面的只少了一个斜杠。“Disallow: /wp-admin/”表示禁止搜索引擎蜘蛛爬取网站wp-admin目录下的目录,但include目录中的文件仍然可以爬取;而“Disallow: /wp-admin”表示禁止搜索引擎蜘蛛爬取网站wp-admin整个目录,包括其下的所有文件。

如果想禁止搜索引擎蜘蛛爬取全站,可以用 Disallow: / ;

如果想允许搜索引擎蜘蛛可以爬取全站,可以用Allow:/;

如果想禁止搜索引擎蜘蛛爬取wordpress网站的全部PHP文件,可以用Disallow: /*.php 。

以上就是我们今天介绍的所有内容——如何为我们的wordpress网站添加robots.txt文件?每一个wordpress网站,可能的限制不一样,所以,我们都要根据自己网站情况,做出相应的修改,以达到最佳效果。注意:Disallow: /可千万要小心用哦,除非在我们wordpress网站的建站初期——网站还在建设当中,不希望搜索引擎来打扰。但一定要记住,等网站做好了,一定要去掉这个Disallow: / 。