VOID001
原创 通过WordPress学PHP 入门级别PHP教程

本帖最后由 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),是定义在其它文件里的

VOID001
今天继续更
展开Biu

今天继续更#22x

[查看全文]
VOID001
来捧场了
展开Biu

Nulla.Liber 发表于 2014-9-1 08:43

来捧场了。。话说之前我搭wordpress搭了n次都没成功

你可以用SAE试试,SinaAppEngine 申请一个帐号后 ,你可以下载SAE专用的Wordress代码包,那个用起来很方便 #22x

[查看全文]
Nulla.Liber
来捧场了
展开Biu

来捧场了。。话说之前我搭wordpress搭了n次都没成功@@22!!

[查看全文]
VOID001
如果这个文件
展开Biu

首先 ,如果这个文件(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
多谢支持
展开Biu

#22x多谢支持~~~ 我会继续努力写教程的 =w=

[查看全文]
VOID001
本帖最后由
展开Biu

本帖最后由 VOID001 于 2014-8-31 11:24 编辑

接着 #00 来继续写 ,我们上一期看到wp-blog-header那个文件 ,里面包含了wp-load 和 template-loader.php 我们按照顺序先来看
首先我们先自己测试一下 include 和 require的区别 根据这段实例代码
[mw_shl_code=php,true]<?php

echo " *本站禁止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.php
index.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是否存在了~

[查看全文]
VOID001
没有人呢
展开Biu

唔,,没有人呢~ 一会儿继续更新教程~

[查看全文]