本文介紹如何開發設計你自己的 WordPress 主題,所討論的是編寫代碼去構建你自己的主題的技術內容。
WordPress 主題由一系列文件和 CSS 樣式表構成,構成了一個美麗的 WordPress 網站。每個主題都是不同的, 這樣WordPress用戶就可以隨時更改 WordPress 網站的外觀。
你也許想為自己開發 WordPress 主題,或者制作公開發行的的主題。但是除了這個為什么要自己制作主題呢?
為什么要自己制作主題呢?這才是問題的關鍵.
WordPress 主題應該按照如下標準開發:
WordPress主題目錄位于 wp-content/themes/。主題的子目錄擁有所有樣式文件、模板文件、可選的函數文件 (functions.php)、JavaScript 文件、圖片等。比如說一個叫做 "test" 的主題就會放在 wp-content/themes/test/目錄里。請避免使用數字名字,這會導致無法在主題列表中正常顯示出來。
WordPress每一個發行版都會有一個默認的主題。請認真查看默認的主題,這樣可能會對制作你自己的主題有幫助。
WordPress 主題除了圖片和JavaScript,經常由三種文件構成。
讓我們單獨看一下。
CSS文件不僅列出了一些主題的樣式設計, style.css 必須 以注釋的形式列出主題的詳細信息 兩個不同的主題是不允許擁有相同的表述的 , 因為這樣會導致主題選擇出錯。如果你通過拷貝一個你已經制作的主題來制作你新的主題,請確保先更改這些頭部注釋.
下面是樣式表頭部注釋的例子,被稱作樣式表頭注釋。比如主題叫做 "Twenty Ten":
/*
Theme Name: Twenty Ten
Theme URI: http://wordpress.org/
Description: The 2010 default theme for WordPress.
Author: wordpressdotorg
Author URI: http://wordpress.org/
Version: 1.0
Tags: black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu (optional)
License:
License URI:
General comments (optional).
*/
這些位于style.css里的文件是必須要寫的,這是用來區分安裝的主題。
注意使用不同的標簽來描述你的主題,如果你的主題提交到WordPress官方主題庫,這允許用戶使用標記過濾器找到你的主題。下面是完整的允許的標簽列表。
最簡單的主題可能是子主題,其僅僅包含一個style.css文件,也可以加上一些圖片。之所以它能工作是因為它是以另一個主題為基礎進行工作的。
更多關于子主題的信息,請看Child Themes。
一個主題可以使用一個函數文件,位于主題的子目錄,叫做 functions.php。這個文件就像一個插件, 如果它位于你正在使用的主題里的話, 他在你的主題初始化的時候就會自動加載(后臺和前臺都一樣加載)。對于這個文件的建議:
默認的WordPress的主題包含一個functions.php文件,它定義這些功能很多,所以你可能會把它當做參考.既然functions.php基本上可以作為一個插件,所以Function_Reference可以讓你更多的了解這個函數,以及你可以怎么利用這些函數.
需要注意的是,如果你要在不同的主題使用同一個功能時,那么請將函數應建立在一個插件上,而不是一個特定主題的functions.php。這樣一來,及時你更換主題,你還是可以通過這個插件實現你想要的功能。
模板 是一些PHP文件,他可以輸出HTML代碼呈獻給瀏覽器,決定著主題的外觀。下面讓我們來看一下主題的模板。
WordPress允許為你的網站定義不同的模板。他雖然不是必需的,但是這些不同的模板為你的網站添上一筆。模板是根據模板層次(Template Hierarchy)的,由一個具體的主題決定。
作為一個主題開發者,你可以自由決定如何定制你的模板。比如說,極端情況下, 你甚至可以僅僅使用一個文件index.php作為模板文件,所有 頁面都會使用這個模板.更多的情況是,使用不同的模板文件產生不同的結果,以達到最大定制。
這里是被WordPress確認的主題文件列表.當然,你的主題可以包含任何樣式表,圖像或者文件。記住 下面列出的文件對WordPress有特殊的意義——點擊模板層次(Template Hierarchy) 查看具體情況。
按照Template Hierarchy,這些文件在 WordPress 中有特殊的意義,即當對應的 條件標簽 返回 true 的時候,他們將在這種情況下代替index.php ,例如,如果當前顯示的是單一的一篇博文,那么is_single() 這個函數將返回'true',并且,如果有一個single.php文件存在于當前主題中,該文件模板就將起作用.
在最簡單的情況下,一個WordPress主題由兩個文件構成:
這些文件都位于主題目錄. 這index.php 模板 是非常靈活的.他可以用來包含所有的引用 header, sidebar, footer, content, categories, archives, search, error, 和其它在WordPress產生的文件.
或者,他也可以模塊化,使用單獨的文件分擔工作.如果你沒有提供其它的模板文件,WordPress 會使用默認文件.比如說,如果你沒有提供comments.php 文件, WordPress會自動使用 wp-comments.php 模板文件 模板層次(Template Hierarchy). (注:從 3.0 版本開始,默認的文件不能保證是現成的或者相同的。為了安全起見,請使用自己的模板文件。)
典型的模板文件包括:
使用這些模板文件,你可以把這些文件嵌入到index.php 中,最后生成的文件里.
include 用法:
<?php get_sidebar(); ?>
<?php get_footer(); ?>
一些模板函數的默認文件可能被廢棄或不存在,在你的主題,你應該提供這些文件。至于3.0版本以上,不推薦使用位于 wp-includes/theme-compat 的默認文件。例如,你應該提供 header.php 文件讓 get_header() 函數更好地安全工作,以及為 comments_template() 函數提供 comments.php 文件。
關于更多的如何利用各種模板,如何產生不同的信息, 請閱讀 Templates 文檔.
在你的主題目錄中,你可以定義每個頁面的模板。要創建一個新的自定義頁面模板,你必須創建一個文件,比如我們創建一個 snarfer.php 文件,然后將下面的內容添加到這個文件中:
<?php
/*
Template Name: Snarfer
*/
?>
上面的代碼定義了這個 snarfer.php 文件作為“Snarfer”模板。當然,你可以使用其他名稱替換“Snarfer”。此模板的名稱將出現在“主題編輯器”(即:外觀 - 編輯)中,作為編輯這個文件的鏈接。
需要注意的是,你不能使用WordPress默認保留的名字來命名這個文件,因為那些名字是有特殊用途的。你可以查看 WordPress保留的文件名。
上面的代碼只是用來聲明這個模板的,至于這個模板要顯示什么,如何顯示,就要靠你自己添加代碼了。要了解WordPress模板的各種功能,你可以通過 模板標簽 查看介紹。你可能會發現,通過復制一些其他的模板(比如 page.php 或 index.php)的代碼到 snarfer.php,然后添加上面的5行代碼,就可以擁有和其他模板一樣的功能。你就可以在此基礎上對代碼進行二次修改,而不必從頭開始了。一旦你創建好這個模板,請將它添加到你的主題目錄中,這樣,你就可以在創建或編輯頁面的時候,通過“頁面屬性”這個模塊下的“模板”選擇這個模板啦。(注:如果你的主題不存在任何頁面模板,就沒辦法在“頁面屬性”中看到“模板”這個選項)
WordPress可以根據不同查詢類型加載不同的模板。你可以通過兩種方法做到這一點:作為內置模板層次(Template Hierarchy)的一部分,并通過使用 條件標簽(Conditional Tag) 在模板文件的 循環 (loop)中加載。
要使用 模板層次,你基本上需要提供特殊用途的模板文件,它會自動覆蓋原來的 index.php 。例如,如果你的主題中提供了一個名為 category.php 的模板文件,但一個分類被查詢時,就會優先加載 category.php 文件取代 index.php ;如果category.php 不存在,就會使用 index.php。
你還可以通過文件的命名獲得一個更具體的模板層次,比如一個名為 category-6.php 的文件,如果查詢的分類ID為 6 ,那么就會優先加載這個 category-6.php 文件取代 category.php 。(要獲得分類的ID,你只需訪問后臺 文章 - 分類目錄,然后點擊編輯任何一個分類下的“編輯”,就可以在URL中看到“categories.php?action=edit&cat_ID=3”這樣的字樣,3 就是ID號)。你可以閱讀 分類模板 了解更多詳情。
如果你的主題需要更好地控制哪些模板文件中提供的 模板層次,你可以使用 條件標簽。通過使用 條件標簽 ,判斷在WordPress循環中哪些條件為真,就加在對應的特定模板,或者顯示對應的內容。
例如,要為一個特定的類別加載一個獨特的樣式表,可以使用類似的代碼:
<?php
if ( is_category( '9' ) ) {
get_template_part( 'single2' ); // 將這個模板樣式應用于分類ID為 9 的文章
} else {
get_template_part( 'single1' ); // 其他分類的文章使用這個模板樣式
}
?>
或者使用一個查詢,例如:
<?php
$post = $wp_query->post;
if ( in_category( '9' ) ) {
get_template_part( 'single2' );
} else {
get_template_part( 'single1' );
}
?>
上面例子的2種代碼,都可以根據判斷不同的分類,將不同的模板應用在特定的分類上。查詢條件 不限分類,不過,建議你閱讀 條件標簽 這篇文章查看所有的可用選項。
你可以通過使用 WordPress 插件系統來根據自己的標準定義不同的自定義模板??梢酝ㄟ^使用“template_redirect”這個行動鉤子來實現這個先進的功能。你可以在 插件API 參考 了解過多創建創建的信息。
要在模板中加載另一個模板(除了 header、sidebar、footer,其中包括有預定義的命令,如 get_header()),你可以使用 get_template_part() 。通過這種方式,可以在主題中重復利用一個代碼片段。
在同一個模板中引用其他文件,避免 硬編碼(hard-coded) 的 URIs 或文件路徑。而應該使用 bloginfo() 引用URIs 或文件路徑:請看 從模板中引用文件。
請注意,在樣式表中的 URIs 是相對于樣式表,而不是相對于引用樣式表的頁面。例如,如果要包含一個 images/目錄到你的主題中,你只需要指定相對目錄中的CSS,像這樣:
h1 {
background-image: url(images/my-background.jpg);
}
開發主題的時候,需要注意的是你的主題最好能和用戶可能安裝的任何插件共存。插件可以通過“動作鉤子(Action Hooks, 查看Plugin API)”為wordpress增加功能。
大部分Action Hooks存在于wp的php核心中,所以你的主題不需要任何多余的特殊標簽來讓它可以正常運轉。但是少數的Action Hooks需要在你的主題中做特殊處理,以使插件能夠將頭,尾,側邊欄等信息輸出到頁面中。如下是你需要包含到主題 中的Action Hooks列表:
在 WordPress 3.4開始,添加了一個新的主題自定義功能,幾乎適用于所有WordPress主題。通過在主題中提供一個支持聲明 add_theme_support() 或者使用 設置API ,就可以自動填充一些選項到主題的定制管理頁面中,同時允許管理員在線實時預覽主題的效果。
主題和插件開發者,如果有興趣添加一些新的選項到主題定制頁面中,可以查看 主題定制API 文檔 和Ottopress.com 網站的教程。
你應該避免在你的主題中動態生成內容,尤其是在HTML屬性中輸出的內容。正如 WordPress標準編碼文檔 所提及的,在屬性中加載的本文應該使用 esc_attr() 包括,以避免單引號或雙引號結束屬性值和產生無效的XHTML,從而導致安全問題。
常見的安全輸出情況下,需要有一些特殊的模板標簽。在這種情況下,輸出一個標題屬性,應該使用the_title_attribute() 而不是 the_title() ,這樣才能避免安全問題。下面來看一個例子,正確轉義一篇文章標題鏈接的標題屬性:
<a href="<?php the_permalink(); ?>" style="margin: 0px; padding: 0px; outline: 0px; border: 0px; background-image: none; vertical-align: baseline; overflow: visible; box-shadow: none; word-wrap: normal; color: rgb(0, 153, 0);"><?php sprintf( __( 'Permanent Link to %s', 'theme-name' ), the_title_attribute( 'echo=0' ) ); ?>"><?php the_title(); ?></a>
使用正確的響應函數替換已經棄用的應該避免的函數:使用 esc_html() 替換 wp_specialchars() 和htmlspecialchars(),使用 esc_url() 替換 clean_url(),使用 esc_attr() 替換 attribute_escape()。查看Data_Validation 了解更多。
為了確保本地語言的平穩過渡,請在主題文件中,使用基于 WordPress gettext-based i18n 的功能來包裝所有需要翻譯的文本。這樣更有利于將語言包的翻譯掛載到當前網站中。請閱讀 WordPress 本地化 和 I18n for WordPress Developers 了解更多信息。
使用下面的模板標簽來添加WordPress的 body、post、和 comment 的元素屬性。其中 post 類,只適用于在循環(Loop)中的元素。
開發你的主題時,請按照下面的標準檢查你的主題模板文件:
下面是一個格式正確的HTML5兼容的頭部區域的例子:
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<title><?php wp_title(); ?></title>
<meta name="description" content="<?php bloginfo( 'description' ); ?>">
<link rel="profile" href="http://gmpg.org/xfn/11" />
<link rel="stylesheet" href="<?php echo get_stylesheet_uri(); ?>" type="text/css" media="screen" />
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
<?php if ( is_singular() && get_option( 'thread_comments' ) ) wp_enqueue_script( 'comment-reply' ); ?>
<?php wp_head(); ?>
</head>
主題的主菜單應該支持使用 wp_nav_menu() 的自定義菜單功能:
<?php wp_footer(); ?>
</body>
</html>
<h2><?php printf( __( 'Search Results for: %s' ), '<span>' . get_search_query() . '</span>'); ?></h2>
<script type="text/javascript">
/* <![CDATA[ */
// content of your Javascript goes here
/* ]]> */
</script>
為你的主題添加一個截圖。截圖應該命名為 screenshot.png ,并且放在你的主題的根目錄下。截圖應該能直接展示你的主題設計和保存為 PNG 格式。推薦的圖像大小為600x450,截圖將顯示為300x225,但雙尺寸的圖像,用來給HIDPI顯示器上更好的顯示效果。
主題可以有選擇地支持 主題選項屏幕 。舉個簡單的代碼例子,查看 A Sample WordPress Theme Options Page。
如果要給用戶使用 主題選項屏幕 的權限,應該使用“edit_theme_options”來設置用戶的權限,而不是使用 “switch_themes”,除非這個用戶角色可以直接切換主題。需要了解更多,你可以閱讀 Roles and Capabilities 和 Adding Administration Menus。
如果你正在主題中使用 “edit_themes”能力來為管理員添加訪問 主題選項屏幕 (或其他自定義屏幕)的權限,要知道,自 3.0 版以來,這個能力默認并沒有分配給WordPress多站點的管理員。查看 說明。 在這種情況下,如果你希望管理員訪問“主題選項”菜單,請使用 “edit_theme_options”能力。查看WordPress多站點的管理員的附加能力。
請訪問 原文 閱讀這個部分的內容。
新聞熱點
疑難解答