WORDPRESS第六課WORDPRESS前端代碼詳細說明

WordPress前端代碼展讀

本文的側重點是:展示和解讀WordPress從啓動(即從index.php入口進入)到在網頁上展示模板和內容的過程。這個過程可以分爲3個階段,一是初始化階段,即初始化常量、環境、加載核心文件等等;二是內容處理階段,即根據用戶的請求調用相關函數獲取和處理數據,爲前端展示準備數據;三是主題應用階段,在這個階段,需要展示的數據已經準備完畢,需要根據用戶的請求加載相應的主題模板,即對主題進行路由。經過這三各階段,用戶請求的頁面就可以完全的展現出來了~_~

:爲了是思路更加的清晰易懂,暫時不考慮後臺管理相關的文件,以及多博客/站點相關的文件!

 

初始化階段

從WordPress入口(大部分情況下是index.php)進入,到這部分結束爲止,我們看到WordPress主要做了如下幾件事情:定義常量和全局變量設置環境參數進行初始化判斷(例如WordPress是否已經安裝);加載WordPress核心文件處理action和filter相關事務創建功能對象(如$wp,$wp_rewrite等);因而這一階段可以看作是WordPress的初始化階段。WordPress的初始化階段是一個相當繁瑣的過程,詳細見如下列表:

  1. 定義 WP_USE_THEMES 常量,當該常量定義爲 false 時,即不使用主題,站點會顯示爲空白;爲 true 時則正常顯示。
  2. 設置 $wp_did_header 變量,相當於一個 flag ,確保每次刷新時 wp-blog-header.php 文件只執行一次。
  3. 設置 WordPress 目錄的絕對路徑 ABSPATH。
  4. 設置錯誤報告模式。
  5. 在wp-config.php文件中設置可配置項。
  6. 定義 WPINC 常量,版本相關變量,並對這些變量進行賦值。
  7. 調用 wp_initial_constants() 函數,初始化常量 WP_MEMORY_LIMIT, WP_DEBUG, WP_CONTENT_DIR 和 WP_CACHE。
  8. 關閉運行期的魔術引用,魔術引用稍後將在 wp-settings.php 中通過 wpdb 添加。
  9. 設置 PHP5 的默認時區。
  10. 調用 wp_unregister_GLOBALS() 函數關閉 register_globals。
  11. unset 全局變量 $wp_filter, $cache_lastcommentmodified, $cache_lastpostdate,以確保他們不會存在。
  12. 調用函數 wp_fix_server_vars() 規範 $_SERVER 變量設置。
  13. 調用函數 wp_check_php_mysql_versions() 檢查所需的 PHP 版本和 MySQL 擴展或數據庫 drop-in。
  14. 調用函數 wp_favicon_request() 檢查是否收到由於缺少 favicon.ico 的而產生請求。
  15. 檢查是否處於維護模式。
  16. 開啓加載計時器。
  17. 檢查是否處於 WP_DEBUG 模式。
  18. 根據 WP_CACHE 和 WP_DEBUG 常量判斷是否載入以及以何種方式載入文件:
    1. WP_CONTENT_DIR/advanced-cache.php,屬於drop-in,供高級的緩存插件使用。
  19. 調用 wp_set_lang_dir() 函數設置常量 WP_LANG_DIR。
  20. 調用 require_wp_db() 函數,引入 wpdb 類,或者數據庫 drop-in db.php (如果存在的話)。
  21. 調用 wp_set_wpdb_vars() 函數,設置數據庫表前綴和數據庫表列的格式說明符
  22. 調用 wp_start_object_cache() 函數,開啓WP對象緩存,或者擴展對象緩存(如果相應 drop-in 存在的話)。
  23. 加載WP文件:
    1. WPINC/default-filters.php,爲 WP 中的鉤子設置默認的 action 和 filter;
  24. 如果開啓了多站點,則加載文件;否則設置常量 MULTISITE 爲 false:
    1. WPINC/ms-blogs.php,定義一組 Site/blog 函數,用於操作 blogs 表及相關數據;
    2. WPINC/ms-settings.php(涉及多站點的文件暫不考慮)。
  25. ————如果只需要基本功能(即 SHORTINIT 常量爲真),則 wp-setting.php 文件執行到此即返回!————
  26. 調用 wp_not_installed() 函數,如果還沒有安裝 WP,則啓動安裝程序。
  27. 加載 WP 的*大頭(most of WP)*:
    1. WPINC/capabilities.php,定義一組類WP_Roles, WP_Role, WP_User和函數,用於操作角色和權限;
    2. WPINC/post.php,定義一組文章相關的函數,並添加 add_action( ‘init’, ‘create_initial_post_types’, 0 );
    3. WPINC/rewrite.php, 定義一組 WP 的重寫 API 以及 WP_Rewrite 類,用於重寫鏈接的格式;並且該文件還定義了一組常量 EP_NONE,EP_PERMALINK,EP_ATTACHMENT,EP_DATE,EP_YEAR,EP_MONTH,EP_DAY,EP_ROOT,EP_COMMENTS,EP_SEARCH,EP_CATEGORIES,EP_TAGS,EP_AUTHORS,EP_PAGES,EP_ALL;
    4. WPINC/kses.php, 定義一組 HTML/XHTML 的過濾器 API,並定義一組標籤數組,添加了兩個action:add_action(‘init’, ‘kses_init’);add_action(‘set_current_user’, ‘kses_init’);
    5. WPINC/script-loader.php,WP 中腳本和樣式表的默認加載器 API,並加載瞭如下文件:
      • /class.wp-styles.php,定義類 WP_Styles,繼承自 WP_Dependencies,用於反壓樣式表隊列;
    6. 並添加了如下的 action 和 filter:
      • add_action( ‘wp_default_scripts’, ‘wp_default_scripts’ );
      • add_filter( ‘wp_print_scripts’, ‘wp_just_in_time_script_localization’ );
      • add_filter( ‘print_scripts_array’, ‘wp_prototype_before_jquery’ );
      • add_action( ‘wp_default_styles’, ‘wp_default_styles’ );
      • add_filter( ‘style_loader_src’, ‘wp_style_loader_src’, 10, 2 );
    7. WPINC/update.php,定義一組 API 用於檢查版本升級信息,添加了一組action,並進行事件調度:
      • add_action( ‘admin_init’, ‘_maybe_update_core’ );
      • add_action( ‘wp_version_check’, ‘wp_version_check’ );
      • add_action( ‘load-plugins.php’, ‘wp_update_plugins’ );
      • add_action( ‘load-update.php’, ‘wp_update_plugins’ );
      • add_action( ‘load-update-core.php’, ‘wp_update_plugins’ );
      • add_action( ‘admin_init’, ‘_maybe_update_plugins’ );
      • add_action( ‘wp_update_plugins’, ‘wp_update_plugins’ );
      • add_action( ‘load-themes.php’, ‘wp_update_themes’ );
      • add_action( ‘load-update.php’, ‘wp_update_themes’ );
      • add_action( ‘load-update-core.php’, ‘wp_update_themes’ );
      • add_action( ‘admin_init’, ‘_maybe_update_themes’ );
      • add_action( ‘wp_update_themes’, ‘wp_update_themes’ );
    8. WPINC/canonical.php,定義一組重定向規範函數,用於處理 WP 中重定向,並添加 action:
      • add_action(‘template_redirect’, ‘redirect_canonical’);
    9. WPINC/shortcodes.php,定義一組 WP 的簡碼 API,並定義數組 $shortcode_tags,添加 filter:
      • add_filter(‘the_content’, ‘do_shortcode’, 11);
    10. WPINC/media.php,定義一組媒體(視頻、圖片等)顯示相關的 API 和類 WP_Embed,並創建 $wp_embed = new WP_Embed() 變量,添加簡碼:
      • add_shortcode(‘wp_caption’, ‘img_caption_shortcode’);
      • add_shortcode(‘caption’, ‘img_caption_shortcode’);
      • add_shortcode(‘gallery’, ‘gallery_shortcode’);
    11. WPINC/widgets.php,定義一組創建動態側邊欄的 API 和類 WP_Widget,WP_Widget_Factory,並定義了一組全局變量;
  28. 加載多站點特定文件:
    1. WPINC/ms-functions.php,
    2. WPINC/ms-default-filters.php,
    3. WPINC/ms-deprecated.php。
  29. 調用 wp_plugin_directory_constants() 函數,定義依賴於API獲取默認值的常量,定義必須使用的插件文件夾常量,後者可能會在 sunrise.php drop-in 中被覆蓋。
  30. 利用函數 wp_get_mu_plugins() 加載必須使用的插件,並觸發掛載點 do_action( ‘muplugins_loaded’ );
  31. 調用函數 ms_cookie_constants() 爲多站點設置 cookie 常量。
  32. 調用函數 wp_cookie_constants() 在多站點加載後定義常量,cookie 相關的常量可能會在 ms_network_cookies() 中被覆蓋。
  33. 調用函數 wp_ssl_constants() 定義和執行 SSL 常量。
  34. 加載文件創建公共全局變量:
    1. WPINC/vars.php,爲 WP 的剩餘部分創建公共變量。
  35. 調用函數 create_initial_taxonomies() 和 create_initial_post_types() 使分類和文章對插件和主題可見。插件作者需要注意:這些在初始化 hook 時會被再次註冊。
  36. 利用函數 wp_get_active_and_valid_plugins() 加載已激活的插件。
  37. 調用函數 wp_set_internal_encoding() 設置內部編碼。
  38. 如果 WP_CACHE 開啓並且 wp_cache_postload() 函數存在,則調用該函數。
  39. 觸發掛載點 do_action( ‘plugins_loaded’ )。
  40. 調用函數 wp_functionality_constants() 定義那些尚未被定義但會影響功能的常量。
  41. 調用函數 wp_magic_quotes() 添加魔術引用並裝配 $_REQUEST ( $_GET + $_POST )。
  42. 觸發掛載點 do_action( ‘sanitize_comment_cookies’ )(無害的評論 cookie)。
  43. 創建全局的WP查詢對象 $wp_the_query =& new WP_Query(),並保存 $wp_the_query 的引用到 $wp_query,使用 $wp_query 進行查詢。
  44. 創建 WP 的重寫對象 $wp_rewrite =& new WP_Rewrite(),以創建漂亮的 URLs。
  45. 創建WP對象 $wp =& new WP()。
  46. 創建 WP Widget 工廠對象 $wp_widget_factory =& new WP_Widget_Factory()。
  47. 觸發掛載點 do_action( ‘setup_theme’ )。
  48. 調用函數 wp_templating_constants() 設置模板相關常量。
  49. 調用函數 load_default_textdomain() 加載默認的文本本地化域。
  50. 找到博客區域設置 $locale = get_locale()。
  51. 創建本地化對象 $wp_locale =& new WP_Locale() 用以加載本地化域數據和各種字符串。
  52. 加載激活的主題的函數庫文件:
    1. TEMPLATEPATH/functions.php,加載模板自帶函數。
  53. 觸發掛載點 do_action( ‘after_setup_theme’ )。
  54. 註冊關閉函數 register_shutdown_function( ‘shutdown_action_hook’ )。
  55. 建立當前用戶 $wp->init()。
  56. 觸 發掛載點 do_action( ‘init’ ),在這個階段WP 的大部分已被加載,用戶也已認證。WP 會繼續加載 init 鉤子上的掛載者,如widgets和各種插件實例。如果你想在WP加載後插入一個action,請使用下面的 wp_loaded 鉤子。
  57. 如果是多站點,則檢查站點的狀態。
  58. 觸發掛載點 do_action(‘wp_loaded’),當WP、所有插件以及主題都被完全加載和實例化後,該鉤子將被解除。Ajax請求應該使用 wp-admin/admin-ajax.php,admin-ajax.php 能夠處理未登錄用戶的請求。

內容處理階段

 

在這一階段,調用wp()函數對數據庫內容進行查詢,並將查詢的內容賦值給一些全局變量,方便在模板中使用模板標籤獲取相應的數據並展示在前端。

  1. 調用 wp() 函數。
  2. 調用 $wp->main() 函數。
  3. 初始化,調用wp_get_current_user()函數(pluggable.php中),獲取當前用戶信息,即設置全局變量$current_user。
  4. 調用parse_request()函數,對查詢參數進行解析。
  5. 調用send_headers()函數,發送附加的http頭信息。
  6. 調用query_posts()函數,進行查詢操作。
  7. 調用handle_404()函數,處理404錯誤。
  8. 調用register_globals()函數,註冊全局變量。
  9. 調用do_action_ref_array()函數(在wp-includes/plugin.php文件中),設置本對象作爲wp鉤子上的函數的參數。

主題應用階段

WordPress主題的路由和加載主要在 WPINC/template-loader.php 文件中進行,該文件相當於是一個模板加載的路由器,根據 url 加載相應的模板。

  1. 如果 WP_USE_THEMES 常量爲真,則觸發掛載點 do_action(‘template_redirect’);
  2. 根據判斷函數is_robots(), is_feed() 和 is_trackback()的返回結果,處理 feeds 和 trackbacks,即使沒有使用任何主題;
  3. 如果 WP_USE_THEMES 常量爲真,則根據下列判斷函數的結果,調用相應函數獲取主題:
    • is_404()–>get_404_template()
    • is_search()–>get_search_template()
    • is_tax()–>get_taxonomy_template()
    • is_front_page()–>get_front_page_template()
    • is_home()–>get_home_template()
    • is_attachment()–>get_attachment_template()
    • is_single()–>get_single_template()
    • is_page()–>get_page_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()
    • is_comments_popup()–>get_comments_popup_template()
    • is_paged()–>get_paged_template()
    • Other–>get_index_template()
  4. 如果對主題應用filter成功 apply_filters( ‘template_include’, $template ),則加載該主題。

模板路由完成以後,被調用的模板會被加載,模板中的模板標籤也會訪問在內容準備階段所設置的全局變量,獲取所需的數據,並且將這些數據輸出到模板中,最終完成樣式+內容在前端的顯示!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章