
本帖最后由 VOID001 于 2014-9-1 12:03 编辑
看这个文章前需要掌握的一些东西
1.C语言或者任何一门语言的编程基础
2.PHP的基本语法
3.没了 因为是新人教程,所以我会尽量详细的介绍WP的源码以及PHP的知识
这个文章是LZ用来学习PHP 以及Web开发的业余时间写的自己的源码学习笔记,由于本人第一次制作这种东西,难免有很多地方会给大家造成困惑。希望大家多多指出和批评
#22xHalo~ 本人技宅新人一枚,属于完全IT向 = =在搞ACM的业余也会学学PHP ,最近用WordPress搭了个blog ,感觉很不错~对于技术控来说,有一个好看的自己的blog神马的最幸福了,在享受WP的同时#22x 我就突然想到#28x我是不是可以通过学习WP的开源代码来学习PHP技术呢~~ 于是乎 ,就有了下面的这些文章 ,本人PHP新人 ,学生党,希望大神们多多指教,文中有不正确的地方,希望大家能给我指出来,批评也好提醒也好~你们的关注与指导就是给我最好的礼物~ 大家如果有没看懂的地方,欢迎提问 ,本人一定保证在看到提问后尽快回答 好了进入正题 PS:本文原文在我的blog 欢迎大家去坐坐~
开始学习研究开源代码 ,不过自己的PHP技术还很差 ,但是只要是有强大的搜索能力~ 以及一定的理解力 就可以呢{*≧∀≦}参考一下这个文章那就从根目录的index.php开始解析代码~~index.php[mw_shl_code=php,true]<?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('./wp-blog-header.php');[/mw_shl_code]
[color=rgb(98, 98, 98) !important]index.php只有两句代码: 我们分别来看一下~~define是PHP的定义常量的语法define函数的用法 : define(NAME,VAL,CASE_SENSITIVE); 没有什么需要过多说明的地方 ,define函数就是定义一个常量 然后参数列表也很明确 ,注意的是 常量不需要加美元符号 ($)require函数 : require(‘FILENAME’) 语句包含并运行指定文件。 如果文件不存在 ,报Fatal Error 也就是说 ,如果文件不存在 这个函数的报错会导致这个网页无法加载 ,这个特性在很多时候还会用到 与它功能差不多的还有一个 include函数 不同的是如果文件不存在,只会报一个WARNING。这两个看情况使用当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。上面的代码既然调用了wp-blog-header.php那么我们下来就看这个代码~wp-blog-header.php[mw_shl_code=php,true]<?php/**
* Loads the WordPress environment and template.
*
* @package WordPress
*/
if ( !isset($wp_did_header) ) {
$wp_did_header = true;
require_once( dirname(__FILE__) . '/wp-load.php' );
wp();
require_once( ABSPATH . WPINC . '/template-loader.php' );
}[/mw_shl_code]
[color=rgb(98, 98, 98) !important]wp-blog-header.php这个代码也不是很难理解 一行一行一个函数一个函数分析~isset函数 isset函数可以检测这个变量是否被定义了 用法 isset(var1,var2,var3…);其中第一个必须填require_once函数 require_once(‘FILENAME’);require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。dirname()函数 函数用法 dirname(string $path)给出一个文件的路径 ,返回这个文件所在的目录的绝对路径 而__FILE__这个常量 ,是 预定义常量 也叫 魔术常量 详细介绍在这里 这里就理解为wp-blog-header这个文件的绝对路径就好~dirname(__FILE__) 取到的是当前文件的绝对路径,也就是说,比起相对路径,查找速度是最快的。上面的代码通过require_once函数把wp-load.php的代码包含进来了~ 我们一会儿再去看那个代码 下面先继续看 :下一个部分是wp()函数 ,这是自定义的函数,而且这个函数多的定义不存在与当前的这个文件里(wp-blog-header.php),是定义在其它文件里的
Nulla.Liber 发表于 2014-9-1 08:43来捧场了。。话说之前我搭wordpress搭了n次都没成功
你可以用SAE试试,SinaAppEngine 申请一个帐号后 ,你可以下载SAE专用的Wordress代码包,那个用起来很方便 #22x
[查看全文]
首先 ,如果这个文件(wp-config)存在于当前的目录下,那么就加载它 如果这个文件存在于WP的父母目录, 并且在当前目录的父母目录不存在wp-settings 这一文件,加载wp-config(没看明白) 如果都不是 就说明wp config还没被配置,这时候就会要求配置wp-config也就是下面的代码 我们来看一下else时候执行的代码 首先 ,获得$_SERVER数组里的$index为 PHP_SELF的变量值,这个值经测试为 /index.php,暂时猜测这个变量的值是目前你所在的网页的路径名 and 文件名 这里还需要再查阅资料 ,下面 我们先跳过wp_load_translations_early 以及下面的1个函数,因为这些函数都在**functions.php文件下 ,我们先来看 ,如果存在wp-config这个文件,会如何执行下面的代码 :下面是 wp-config的代码 :[mw_shl_code=php,true]<?php/**
* WordPress 基础配置文件。
*
* 本文件包含以下配置选项: MySQL 设置、数据库表名前缀、
* 密匙、WordPress 语言设定以及 ABSPATH。如需更多信息,请访问
* {@Link http://codex.wordpress.org/Editing_wp-config.php 编辑
* wp-config.php} Codex 页面。MySQL 设置具体信息请咨询您的空间提供商。
*
* 这个文件用在于安装程序自动生成 wp-config.php 配置文件,
* 您可以手动复制这个文件,并重命名为 wp-config.php,然后输入相关信息。
*
* @Author Elmer Zhang <freeboy6716@gmail.com>
* @package WordPress
*/
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress 数据库的名称 */
define('DB_NAME', SAE_MYSQL_DB);
/** MySQL 数据库用户名 */
define('DB_USER', SAE_MYSQL_USER);
/** MySQL 数据库密码 */
define('DB_PASSWORD', SAE_MYSQL_PASS);
/** MySQL 主机 */
define('DB_HOST', SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT);
/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8');
/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');
define('WP_USE_MULTIPLE_DB', true);
$db_list = array(
'write'=> array(
array(
'db_host' => SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,
'db_user'=> SAE_MYSQL_USER,
'db_password'=> SAE_MYSQL_PASS,
'db_name'=> SAE_MYSQL_DB,
'db_charset'=> 'utf8'
)
),
'read'=> array(
array(
'db_host' => SAE_MYSQL_HOST_S.':'.SAE_MYSQL_PORT,
'db_user'=> SAE_MYSQL_USER,
'db_password'=> SAE_MYSQL_PASS,
'db_name'=> SAE_MYSQL_DB,
'db_charset'=> 'utf8'
)
),
);
$global_db_list = $db_list['write'];
/**#@+
* 身份密匙设定。
*
* 您可以随意写一些字符
* 或者直接访问 {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org 私钥生成服务},
* 任何修改都会导致 cookie 失效,所有用户必须重新登录。
*
* @since 2.6.0
*/
define('AUTH_KEY', hash_hmac('sha1', SAE_ACCESSKEY . 'AUTH_KEY', SAE_SECRETKEY ));
define('SECURE_AUTH_KEY', hash_hmac('sha1', SAE_ACCESSKEY . 'SECURE_AUTH_KEY', SAE_SECRETKEY ));
define('LOGGED_IN_KEY', hash_hmac('sha1', SAE_ACCESSKEY . 'LOGGED_IN_KEY', SAE_SECRETKEY ));
define('NONCE_KEY', hash_hmac('sha1', SAE_ACCESSKEY . 'NONCE_KEY', SAE_SECRETKEY ));
define('AUTH_SALT', hash_hmac('sha1', SAE_ACCESSKEY . 'AUTH_SALT', SAE_SECRETKEY ));
define('SECURE_AUTH_SALT', hash_hmac('sha1', SAE_ACCESSKEY . 'SECURE_AUTH_SALT', SAE_SECRETKEY ));
define('LOGGED_IN_SALT', hash_hmac('sha1', SAE_ACCESSKEY . 'LOGGED_IN_SALT', SAE_SECRETKEY ));
define('NONCE_SALT', hash_hmac('sha1', SAE_ACCESSKEY . 'NONCE_SALT', SAE_SECRETKEY ));
/**#@-*/
/**
* WordPress 数据表前缀。
*
* 如果您有在同一数据库内安装多个 WordPress 的需求,请为每个 WordPress 设置不同的数据表前缀。
* 前缀名只能为数字、字母加下划线。
*/
$table_prefix = 'wp_';
/**
* WordPress 语言设置,默认为英语。
*
* 本项设定能够让 WordPress 显示您需要的语言。
* wp-content/languages 内应放置同名的 .mo 语言文件。
* 要使用 WordPress 简体中文界面,只需填入 zh_CN。
*/
define ('WPLANG', 'zh_CN');
/**
* 开发者专用:WordPress 调试模式。
*
* 将这个值改为“true”,WordPress 将显示所有开发过程中的提示。
* 强烈建议插件开发者在开发环境中启用本功能。
*/
define('WP_DEBUG', false);
/* 好了!请不要再继续编辑。请保存该文件。 */
/** WordPress 目录的绝对路径。 */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** 设置 WordPress 变量和包含文件。 */
require_once(ABSPATH . 'wp-settings.php');[/mw_shl_code]
这个代码没什么太多需要说明的 ,它实际上就是做了很多定义的工作 ,定义了很多常量,然后在最后包含了 wp-settings.php这个文件 这个文件才是重头戏~wp-settings.php这个文件需要很长时间来研究 ,这次就先到这里~下次开始研究wp-settings.php[查看全文]
本帖最后由 VOID001 于 2014-8-31 11:24 编辑
[查看全文]接着 #00 来继续写 ,我们上一期看到wp-blog-header那个文件 ,里面包含了wp-load 和 template-loader.php 我们按照顺序先来看首先我们先自己测试一下 include 和 require的区别 根据这段实例代码[mw_shl_code=php,true]<?phpecho " *本站禁止HTML标签噢* "."INCLUDE 1"."</h1>";
require('./include1.txt');
echo INC;
echo " *本站禁止HTML标签噢* "."INCLUDE 2"."</h1>";
include('./include2.php');
echo INC
?>[/mw_shl_code]
其中 ,INC是在include2.php内定义的常量, 有人说 inlcude和require的一个区别是 include会把文件包含在整个代码的最前面 ,而require不会 ,按照他的说法 ,这个代码运行的时候运行到底一个echo INC 就应该输出了 INC的值 可实际上 运行结果是未定义的常量 ,所以 ,这个说法是错误的 include 和require 都是在运行到这里的时候,才会把文件包括进去,而不是在一开始就包括进去 。 下面测试一下 ,如果require的文件不存在会怎样把sample.php的第一个require的文件名改为 mengmengda.php(这个文件真的不存在哦~) 我们得到了这样的错误报告Fatal error: require() [function.require]: Failed opening required './mengmengda.php' (include_path='.;C:\php5\pear') in F:\WAMP\www\wplearn\index.php on line 4果然是个FatalError 我们再试试把include的改为 mengmengda.phpindex.php文件正常显示,除了报了两个警告以外,没有其它的问题 ,看来这就是include和require的区别了 ~下面我们继续研究wp-blog-header.php里面require的那几个 ,首先深入研究wp-load.php这段注释里面已经说明了,这个代码做了什么 来看一下注释:[mw_shl_code=c,true]/*** Bootstrap file for setting the ABSPATH constant
* and loading the wp-config.php file. The wp-config.php
* file will then load the wp-settings.php file, which
* will then set up the WordPress environment.
*
* If the wp-config.php file is not found then an error
* will be displayed asking the visitor to set up the
* wp-config.php file.
*
* Will also search for wp-config.php in WordPress' parent
* directory to allow the WordPress directory to remain
* untouched.
*
* @internal This file must be parsable by PHP4.
*
* @package WordPress
*/[/mw_shl_code]
也就是说 ,wp-load是一个引导程序(bootstrap),这个引导程序定义了ABSPATH绝对路径 这个常量 然后 会加载wp-config并且由wp-config来加载wp-settings这个文件,如果不存在wp-config那么就会要求用户创建wp-config.php 这个bootstrap也会在WP的父母目录下搜索wp-config这个文件,保证WP的目录不被触碰(逗号后面这句话没明白) 在内部这段代码必须以php4编译下面是 wp-load的代码[mw_shl_code=php,true]<?php/** Define ABSPATH as this file's directory */
define( 'ABSPATH', dirname(__FILE__) . '/' );
error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
if ( file_exists( ABSPATH . 'wp-config.php') ) {
/** The config file resides in ABSPATH */
require_once( ABSPATH . 'wp-config.php' );
} elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
/** The config file resides one level above ABSPATH but is not part of another install */
require_once( dirname(ABSPATH) . '/wp-config.php' );
} else {
// A config file doesn't exist
// Set a path for the link to the installer
if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false )
$path = 'setup-config.php';
else
$path = 'wp-admin/setup-config.php';
define( 'WPINC', 'wp-includes' );
define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
require_once( ABSPATH . WPINC . '/load.php' );
require_once( ABSPATH . WPINC . '/version.php' );
wp_load_translations_early();
wp_check_php_mysql_versions();
// Die with an error message
$die = __( "There doesn't seem to be a *本站禁止HTML标签噢* wp-config.php</code> file. I need this before we can get started." ) . '</p>';
$die .= ' *本站禁止HTML标签噢* ' . __( "Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>." ) . '</p>';
$die .= ' *本站禁止HTML标签噢* ' . __( "You can create a *本站禁止HTML标签噢* wp-config.php</code> file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file." ) . '</p>';
$die .= ' *本站禁止HTML标签噢* <a href="' . $path . '" class="button">' . __( "Create a Configuration File" ) . '</a>';
wp_die( $die, __( 'WordPress › Error' ) );
}[/mw_shl_code]
error_reporting这个函数 就是设置报错级别的一个函数 , 用法就是 error_reporting(CONSTANT1 | CONST 2| ...) 设置了之后 系统会把你指定的类型的错误报告,其他的不报告 ,举个例子 ,如果是 error_report(0)那么 就不会报告几乎任何错误 ,上面那个sample.php的代码 会输出一行 INCLUDE1 然后由于编译错误 ,不能继续运行了, 但是由于你的报错级别设定,不会显示错误信息 。 而如果你把常量定为-1 即error_report(-1)那么PHP会报告所有已知的错误和警告下面这段代码就是检查 wp-config.php是否存在了~