开始wordpress源代码学习之旅
我是一个完全php小白,从今天开始坚持每天学一点,最终达到能自己制作自己的主题。学习个人认为最快的方法就是看大神写的源代码,所以我选择本站使用的wordpress开启我的php之旅,慢慢的进步,我使用的wordpress源代码是wordpress-5.4版本
学习过程
在完全不了解php是什么的情况下,我也不能分析出wordpress架构什么的,所以直接简单粗暴,从wordpress第一个文档开始学习,之后慢慢看懂多了代码函数后,再开始归纳wordpress架构。
上代码
index.php代码量比较少,结构也很简单,下面就是index.php中所有代码
<?php
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define( 'WP_USE_THEMES', true );
/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';
知识点1:index.php
- index普遍意义上是首页的意思,我们输入域名后第一个找到的入口就是index
- .php就是需要需要php服务器来解析的脚本
知识点2:<?php
- PHP文件通常包含HTML标签和一些PHP脚本代码。PHP代码需要用
<?php
// PHP 代码
?>
这样包含起来。
- 当一个PHP文件内只包含PHP代码时,Zend的编码规范中提到文件结尾不允许有**?>**结束符的,是为了防止有意外的结尾输出(比如空格,换行),导致程序出现意外响应。一般这种意外多发生在文件包含。index.php文件是个纯PHP代码,所以这里不能在文件结尾加?>
知识点3:/* 注释 */
注释是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码,不会被作为程序来读取和执行。PHP可以实现单行注释和多行注释,分别如下:
- 多行注释
/*
这个时php
的多行注释
可以横跨很多行
*/
- 单行注释
// 这是一个单行注释
# 这个也是单行注释
知识点4:define( ‘WP_USE_THEMES’, true );
- define() 函数定义一个常量。
常量类似变量,不同之处在于:
- 在设定以后,常量的值无法更改
- 常量名不需要开头的美元符号 ($)
- 作用域不影响对常量的访问
- 常量值只能是字符串或数字
语法
define(name,value,case_insensitive)
参数 | 描述 |
---|---|
name | 必需。规定常量的名称。 |
value | 必需。规定常量的值。 |
case_insensitive | 可选。规定常量的名称是否对大小写敏感。若设置为 true,则对大小写不敏感。默认是 false(大小写敏感)。 |
- WP_USE_THEMES
WP_USE_THEMES 字面意思也能理解,它定义 WordPress 是否使用主题,这里定义为 true;一般我们也不会去改这个东西。那么这个东西到底有什么用的?你可以测试一下,将它设置成:false
,网站打开后就是一片空白,那么设置成 flase
的应用场景在哪里的?
我们来看看,在 WordPress 执行的过程中,哪里用到这个常量,除了在 index.php
入口文件定义了这个常量外,只有在 wp-includes
目录下的 template-loader.php
这个处理模板加载的文件中使用到这个常量。
WordPress 的执行流程大概可以分为三部分:第一步是核心文件的加载,第二步是业务逻辑的执行,第三步是模板的加载渲染,最后输出到浏览器客户端。
第三步模板的加载渲染就是通过调用 template-loader.php
这个文件来执行的,在 template-loader.php
中几乎所有的代码逻辑的执行都是需要判断 WP_USE_THEMES
这个常量的真假,只有为 true
才去执行加载模板的逻辑的。
所以在我们不想使用 WordPress 的模板加载,也就是说不输出模板数据的情况下,只是想输出原始的数据到客户端,比如 API 接口,那我们就可以直接设置这个常量为 false
,这样 template-loader.php
中的加载模板的代码都不会执行。
知识点5:require __DIR__ . ‘/wp-blog-header.php’;
-
require()读入require()语句所引入的文件wp-blog-header.php,使它变成 PHP 脚本文件的一部分。与它相识功能的还有include(),区别如下
- require()只处理文件一次,include()每次都进行读取行和评估
- require()在一开始就加载,include()在用到时加载
- require()读取出错是立马停止运行,但include()包含文件出错主程序可以继续运行
PHP 系统在加载PHP程序时有一个伪编译过程,可使程序运行速度加快。但 incluce() 的文档仍为解释执行。include() 的文件中出错了,主程序继续往下执行,require 的文件出错了,主程序也停了,所以包含的文件出错对系统影响不大的话(如界面文件)就用 include(),否则用 require()。
require() 和 include() 语句是语言结构,不是真正的函数,可以像 php 中其他的语言结构一样,例如 echo() 可以使用 echo("ab") 形式,也可以使用 echo "abc" 形式输出字符串 abc。require() 和i nclude() 语句也可以不加圆括号而直接加参数,wordpress这里及没有加()。 include_once() 和 require_once() 语句也是在脚本执行期间包括运行指定文件。此行为和 include() 语句及 require() 类似,使用方法也一样。唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。这两个语句应该用于在脚本执行期间,同一个文件有可能被包括超过一次的情况下,确保它只被包括一次,以避免函数重定义以及变量重新赋值等问题。
-
__DIR__ 是个constant variable,是获取当前路径的意思,可以保证你要引入的文件是从那个路径来的,是为防止在引用其他文件是,出现一些意想不到情况,如有下面一种目录及结构
temp/a.php temp/temp1/b.php temp/temp1/c.php
其中a引用了b文件
<?php require_once 'temp1/b.php'; //... Code goes here ... ?>
b引用了c文件
<?php require_once 'c.php'; // ... Code goes here ... ?>
这时候就出现问题了!a.php 引入 b.php,可是 b.php里有引入 c.php。在这里系统会直接寻找和a.php同个目录的c.php哦!可是目前这个目录只有 a.php一个文件而已,所以某些情况下会发生一些意想不到的事情。
有时候c.php里面的代码会不正常,又或者是 如果当前目录也有 c.php的话,两个不同目录的 c.php会被同时使用 等等。
在 b.php的 require_once ‘c.php’ 改成 require_once __DIR__ . ‘/c.php’ 就能解决之前所说的问题了:
<?php require_once __DIR__ .'/c.php'; // ... Code goes here ... ?>
总结
如wordpress注释描述的一样,index.php就是wordpress的入口,主要为了加载wp-blog-header.php,并且定义了一个全局的宏开关,方便在这里切换控制。
参考链接
https://www.runoob.com/w3cnote/php-different-include-and-require.html
https://www.cnblogs.com/novice-programmer/articles/10533962.html
https://www.w3school.com.cn/php/func_misc_define.asp
https://blog.wpjam.com/m/wordpress-source-index-php/