黃聰:wordpress源碼解析-目錄結構-文件調用關系(轉)


Wordpress是一個單入口的文件,所有的前端處理都必須經過index.php,這是通過修改web服務器的rewrite規則來實現的。這種做法的好處是顯而易見的,這樣URL更好看,不必為每一個url新建一個文件。

我們看看wp大致的文件調用是什么樣子的。

wordpress可以分為3個階段,一是初始化階段,即初始化常量、環境、加載核心文件等等;二是內容處理階段,即根據用戶的請求調用相關函數獲取和處理數據,為前端展示准備數據;三是主題應用階段,在這個階段,需要展示的數據已經准備完畢,需要根據用戶的請求加載相應的主題模板,即對主題進行路由。經過這三各階段,用戶請求的頁面就可以完全的展現出來了。從上圖可以看到wp的初始化階段相當的繁瑣。

Index.php文件實際上沒啥內容. 定義了常量WP_USE_THEMES和加載了文件wp-blog-header.php

<?php  
/*index.php*/  
//該常量定義為false時,不使用主題,站點會顯示為空白,為true時,則正常顯示。  
define('WP_USE_THEMES', true);  
//加載wp-blog-header.php  
require('./wp-blog-header.php');  
?>  

wp--blog-header里面是什么樣子呢?

<?php  
/*wp-blog-header.php */  
//wp_did_header變量,相當於一個flag,確保每次刷新時,wp-blog-header.php文件只執行一次。  
if ( !isset($wp_did_header) ) {  
  
    $wp_did_header = true;//置為true,確保只執行一次。  
    //初始化階段。加載wp-load.php,  
    require_once( dirname(__FILE__) . '/wp-load.php' );  
    //內容處理階段 wp()位於functon.php中  
    wp();  
    //主題應用階段。ABSPATH wordpress目錄的絕對路徑  
    require_once( ABSPATH . WPINC . '/template-loader.php' );  
  
}  

wp-blog-header任然很簡單,但是可以看到wp的三個明顯的階段,初始化階段、內容處理階段、主題應用階段。

wp-load.php的功能很簡單,就是加載wp-config.php. wp-config.php是需要用戶自己進行設置的。設置DB設置,密鑰,路徑,語言等

<?php  
/*wp-load.php 
 */  
  
// 定義常量 wordpress根目錄的絕對路徑   
define( 'ABSPATH', dirname(__FILE__) . '/' );  
//設置錯誤報告模式 這個if的分支 差別在E_RECOVERABLE_ERROR ?  
if ( defined('E_RECOVERABLE_ERROR') )  
    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);  
else  
    error_reporting(E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING);  
//加載wp-config.php  
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*/  
    //如果wp-config.php存在於絕對路徑的上一級,而且不是另一個wordpress的一部分  
    require_once( dirname(ABSPATH) . '/wp-config.php' );  
  
} else {  
  
    // wp-config.php 不存在時,  
  
    // Set a path for the link to the installer  
    if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false )  
        $path = '';  
    else  
        $path = 'wp-admin/';  
  
    // Die with an error message  
    require_once( ABSPATH . '/wp-includes/class-wp-error.php' );  
    require_once( ABSPATH . '/wp-includes/functions.php' );  
    require_once( ABSPATH . '/wp-includes/plugin.php' );  
    $text_direction = /*WP_I18N_TEXT_DIRECTION*/'從左到右'/*/WP_I18N_TEXT_DIRECTION*/;  
    wp_die(sprintf(/*WP_I18N_NO_CONFIG*/'看起來似乎沒有 <code>wp-config.php</code> 文件。我們需要這個文件來讓一切開始,可以查看<a href=\'http://codex.wordpress.org/Editing_wp-config.php\'>更多幫助</a>。 那么現在您可以通過這個 Web 界面創建一個 <code>wp-config.php</code> 文件,但並非所有主機都支持,安全的做法是手動創建。</p><p><a href=\'%ssetup-config.php\' class=\'button\'>試試創建一個配置文件</a>'/*/WP_I18N_NO_CONFIG*/, $path), /*WP_I18N_ERROR_TITLE*/'WordPress › 錯誤'/*/WP_I18N_ERROR_TITLE*/, array('text_direction' => $text_direction));  
}  
?>  

來看看wp-config.php是什么樣子的。

<?php  
/*wp-config.php */  
  
// ** 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');  

 

原文:http://blog.csdn.net/liujiyong7/article/details/8037843


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM