WordPress的最新更新使開發者可以非常迅速地定製他們的個人網站。更新你的主題的區域,替換側邊欄的小部件,甚至編寫你自己的自定義PHP程式碼功能,都很簡單。其廣度是巨大的–其中一個受歡迎的領域是改寫漂亮的URL固定連結。
你可以用一些方法去更新預設的WordPress重寫系統。在這個教學中,我將分享幾個例子,並演示這個過程是多麼簡單。你需要對PHP有一定的瞭解才能知道程式碼中發生了什麼,但複製和貼上到你自己的模板中是如此簡單,幾乎沒有任何工作。
瞭解WP_Rewrite
如果你對Apache伺服器上的mod_rewrite非常熟悉,那麼你會發現WordPress的重寫語法。他們的系統仍然建立在.htaccess檔案的基礎上,但所有的規則都是用PHP編碼的。這實際上使這個過程更容易一些,因為我們對編寫我們自己的URL有更多的控制。
我建議瀏覽一下$wp_rewrite類的頁面,因為它有大量關於這個主題的資訊。甚至還有一些我們可以參考的小例子,使一切更容易理解。大部分的程式碼可以直接寫在你的主題的 functions.php 檔案中。讓我們先來看看WordPress已經包含的預設重寫內容。
$wp_rewrite->rules
通過將 $wp_rewrite
類宣告為全域性,我們可以訪問所有的內部資料。當你去新增你自己的規則時,這些規則被新增到一個名為 $wp_rewrite->rules
的陣列中。記住這個變數很重要,因為在開發過程中,你可能需要多次引用這些資料。
<?php global $wp_rewrite; print_r($wp_rewrite->rules); ?>
I added this block of code into my theme’s page.php file. It will output a large array of data which looks like a big mess. But if you View Source on your page it’s actually easy to see which rewrite rules are matched to which filename. For example, let’s look at the rules for category rewrites:
我在我的主題的page.php檔案中加入了這塊程式碼。它將輸出一個大的資料陣列,看起來像一個大混亂。但如果你在你的頁面上檢視來源,實際上很容易看到哪些重寫規則與哪個檔名相匹配。例如,讓我們看一下類別重寫的規則:
[category/(.+?)/?$] => index.php?category_name=$matches[1]
左邊括號裡的部分是我們要尋找的Apache RewriteRule。從/category/部分開始,後面是任何字串的字元。如果這一點被匹配,那麼伺服器就知道要參考 index.php?category_name=
,同時替換掉末尾的變數。
設定自定義固定連結
僅僅在$wp_rewrite類中就有很多內容可以討論。許多其他的屬性可以被引用,比如 $wp_rewrite->category_base
或 $wp_rewrite->author_base
,用於獲取這些頁面的預設URL結構。但除了拉取WP的預設設定外,我們也可以建立我們自己的規則。
重建Author Base
當你進入固定連結設定頁面時,你可以選擇重設類別和標籤基礎。但奇怪的是,重置Author Base的選項卻沒有。
但我們可以使用WordPress程式碼中的 add_rewrite_rule()
來整合一些新的設定。在這種情況下,我把/author/替換成了/writer/,但你可以使用你喜歡的任何基數。此外,我還複製了一些其他的重定向,用於作者頁和RSS訂閱。你可以把這塊程式碼新增到你的主題的 functions.php 檔案中。
add_action( 'init', 'add_author_rules' ); function add_author_rules() { add_rewrite_rule( "writer/([^/]+)/?", "index.php?author_name=$matches[1]", "top"); add_rewrite_rule( "writer/([^/]+)/page/?([0-9]{1,})/?", "index.php?author_name=$matches[1]&paged=$matches[2]", "top"); add_rewrite_rule( "writer/([^/]+)/(feed|rdf|rss|rss2|atom)/?", "index.php?author_name=$matches[1]&feed=$matches[2]", "top"); add_rewrite_rule( "writer/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?", "index.php?author_name=$matches[1]&feed=$matches[2]", "top"); }
即使不使用 $wp_rewrite
變數也可以訪問這個函式。一些開發者喜歡這種方法,因為它比用類屬性硬編碼更簡單。然而我也注意到這種方法對於一些WordPress的安裝來說並不總是可靠的。實際上還有第二個選擇,就是在沖刷你的.htaccess後,在鉤子上新增這些規則(見下文)。
Author Base使用generate_rewrite_rules
為這個方法寫作,我們將再次需要全域性的$wp_rewrite類。然後我設定了一個名為 $new_rules
的新變數,其中包含一個關聯陣列的資料。我下面的例子程式碼只是為基本的作者頁部分進行重寫。
function generate_author_rewrite_rules() { global $wp_rewrite; $new_rules = array( "writer/([^/]+)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1) ); $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; }
但如果我們想包括多個頁面和RSS訂閱,我們可以加強陣列的功能。你可以選擇建立一個PHP函式來推送關聯陣列資料,這可能有點太複雜了。我們也可以通過逗號來分割資料塊,在陣列中表現為獨立的實體。請看我再次寫在 functions.php 主題檔案中的更新程式碼。
function generate_author_rewrite_rules() { global $wp_rewrite; $new_rules = array( "writer/([^/]+)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1), "writer/([^/]+)/page/?([0-9]{1,})/?" => "index.php?author_name=".$wp_rewrite->preg_index(1)."&paged=".$wp_rewrite->preg_index(2), "writer/([^/]+)/(feed|rdf|rss|rss2|atom)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1)."&feed=".$wp_rewrite->preg_index(2), "writer/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1)."&feed=".$wp_rewrite->preg_index(2) ); $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; }
請記住,這兩種方法在你重新整理原始重寫規則之前都不會起作用。當你對這些函式進行修改時,你必須這樣做,但之後你的新規則將無限期地堅持下去。
重新整理重寫規則
每當你對URL重寫程式碼進行更新時,這些變化不會立即應用。你必須重新整理.htaccess重寫規則,這樣你的新程式碼才會被加入。然而,在每一個頁面啟動時都這樣做是非常浪費的,因為它會寫入資料庫並硬重新整理.htaccess檔案。
一個更好的方法是在管理面板中訪問你的permalinks頁面並重新儲存更改。這總是呼叫flush_rewrite_rules,所以你永遠不必擔心使用者在前臺遇到載入問題。而且只需要一次就可以重新儲存頁面並更新你係統中的所有規則。但如果這不起作用,你可以嘗試呼叫 $wp_rewrite->flush_rules()
;
使用非WP規則
在 $wp_rewrite
類中,我們可以訪問幾十個屬性。其中一個比較重要的選項是 $wp_rewrite->non_wp_rules
,它收集了一個不影響index.php檔案的重定向陣列。
這實際上是在WordPress外掛開發中最常使用的。你可以將一個特定的自定義URL型別(如 /calendar/jun-2012/
)推送到你的網站後臺( /wp-content/plugins/calendarplug/myscript.php
)。當然,除了外掛之外,這種自定義重寫規則的關聯陣列還有更多的用途。我在下文中提供了一個很好的例子。
遮蔽你的主題檔案
這是我在WordPress討論區經常看到的一個常見建議。理想情況下,我們想用一個更優雅的URL來引用 /wp-content/themes/mytheme/
資料夾中的一些檔案。注意,這將需要一組不同的WordPress重寫來改變目錄結構。
WordPress的內部重寫系統總是將內容推向一個單一的路由檔案。在預設情況下,我們使用index.php以及任何額外的查詢字串資料。但對於隱藏我們的標準模板目錄( /wp-content/themes/mytheme/*
),我們將需要顯示許多不同的檔案。
add_action('generate_rewrite_rules', 'themes_dir_add_rewrites'); function themes_dir_add_rewrites() { $theme_name = next(explode('/themes/', get_stylesheet_directory())); global $wp_rewrite; $new_non_wp_rules = array( 'css/(.*)' => 'wp-content/themes/'. $theme_name . '/css/$1', 'js/(.*)' => 'wp-content/themes/'. $theme_name . '/js/$1', 'images/wordpress-urls-rewrite/(.*)' => 'wp-content/themes/'. $theme_name . '/images/wordpress-urls-rewrite/$1', ); $wp_rewrite->non_wp_rules += $new_non_wp_rules; }
我寫了一個新的函式 themes_dir_add_rewrites()
來從這些較長的URL中提取所有的主要內容,並在後臺重定向它們。注意,我們正在使用$wp_rewrite類的另一個神祕的屬性,名為 non_wp_rules
。根據文件,這些規則不直接指向WP的index.php檔案,將在伺服器端處理。
這些非WP規則的偉大之處在於,你仍然可以很容易地管理舊的URL方法。沒有什麼可以阻止你連結到:
/wp-content/themes/mytheme/images/wordpress-urls-rewrite/logo.jpg
.
但如果你能參考的話,它看起來就會好很多:
/images/wordpress-urls-rewrite/logo.jpg
代替上面的連結。
有用的工具和外掛
如果你被困在自己的漂亮URL的編碼中,你可以利用一些工具。這個過程是很難掌握的,所以如果你掙扎了幾個星期,也不要灰心。我覺得隨著你花更多時間練習,內容會越來越容易。
但要想開始,請看看這些方便的改寫工具和外掛。你可能不需要所有的工具,但發現有這麼多的開發人員在圍繞著WP重寫工作,這很好。
當第一次接觸到重寫規則時,這個外掛是必須的。它實際上不會改變你網站的任何規則–它只是允許你測試程式碼,看看哪些重定向到哪些頁面。它甚至可以用於測試任何自定義帖子型別的自定義查詢變數。
這與上面的外掛類似,只是它不能讓你測試你自己的規則。相反,這個外掛將顯示你的網站的所有預設WP規則和它們重定向到哪裡。這將包括 $wp_rewrite
的所有主要屬性,如你的固定連結設定和頁面/類別/標籤基礎。
在這裡,你有一套不同的規則來製作新的頁面重定向。該外掛有自己的管理面板,你可以編輯變數,如你的作者基地,頁面基地,甚至附加你自己的自定義.htaccess規則。
這種方法與使用wp_rewrite建立自己的方法不同。然而,對於真正瞭解網路伺服器的技術人員來說,這可能更容易,他們覺得直接寫進.htaccess更舒服。
這實際上不是一個WordPress外掛,但絕對是一個方便的工具,可以儲存在檔案中。你可以複製重寫規則,為你的網站進行測試,而不必編輯你的.htaccess檔案。這是一個完美的方法,可以在網路上釋出之前消除你的語法中的錯誤。
DW Rewrite是一個非常簡單的外掛,安裝後立即建立3個獨特的漂亮URL。預設情況下,它將把管理員、登入和註冊連結分別改為 /admin
、 /login
和 /register
。
如果你需要快速解決一個具有多個作者的部落格,這可能是很好的。它將特別隱藏令人尷尬的複雜的WordPress註冊連結( /wp-login.php?action=register
)。
小結
我希望這個教學能夠提供一些例子,讓你思考WordPress的改寫。這個CMS非常流行,而且開發人員每天仍在生產新的功能。定製你自己的URL是如此巨大的一塊基於使用者的功能。與預設選項相比,它使你的網站有自己獨特的存在和品牌。
如果你在重寫規則方面遇到麻煩,那麼要消除損害應該是不難的。通過簡單地刪除功能程式碼和重新整理你的.htaccess規則,看起來就像什麼都沒有改變。請務必檢視一些其他類似的文章,你可以在這個主題上找到。如果你有任何問題或意見,可以在帖子討論區與我們分享。
評論留言