本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
如果你把 WordPress 當一個 PHP 網站 Framework 來使用的話,應該也會有跟我一樣的感想:「怎麼路徑管理這麼麻煩,都沒有比較好的方式統一個方法建立請求路徑規則嗎?
Slim 或 Laravel 都不錯的說。」
抱持著 28% 高市佔率的想法再認為「一定有人這麼想而且他可能已經幫我做好了!」
登愣,Google 幫我找到了他XD「WP Router」(不要小看超過兩年沒更新的專案,他還很健壯啊,用在 WordPress 4.8.1 還是穩穩的!)
作者是:Jonathan Brinely
附帶一篇網友教學文:WordPress: Creating new routes (custom URLs) with WP Router
使用方法也夠簡單,照上文中操作可以獲得基本版,但花點時間看作者的說明會發現很強大!
下面是我的
使用範例:
function mxp_routes_01($router) {
//設定註冊路徑參數
$route_args = array(
'path' => '^中文路徑/(.*?)$', //正則表示法下捕捉的請求路徑
'query_vars' => array("query_key1" => 1, "query_key2" => 2), //請求時帶入的參數 ?query_key1=1&query_key2=2
'page_callback' => array(
"GET" => "mxp_demo_route_get_callback", // GET, POST, PUT, DELETE 的請求對應方法
"POST" => "mxp_demo_route_post_callback",
"PUT" => "mxp_demo_route_put_callback",
"DELETE" => "mxp_demo_route_delete_callback",
"default" => "mxp_demo_route_default_callback"), //沒找到對應請求方法就用這個
'page_arguments' => array("query_key1", "query_key2", "a"), //設定傳入頁面方法的參數,會對應 query_vars
'access_callback' => 'mxp_demo_route_access_callback', //設定存取權限的方法
'title' => __('測試路由方法,這裡會是那篇內文標題'), //直接預設標題
'title_callback' => 'mxp_title_callback', //處理標題用的方法名稱
'template' => array('mxp.php'), //設定處理的樣板檔案(路徑不存在會改採用預設)
);
//註冊路由「mxp-routes-01」,必須唯一的key,不能跟別的重複
$router->add_route('mxp-routes-01', $route_args);
}
function mxp_title_callback($title) {
return $title . "->經過回呼函式處理過的標題";
}
function mxp_demo_route_access_callback() {
return true;
}
function mxp_demo_route_get_callback($query_value1, $query_value2, $a) {
$content = "這裡會是 GET 方法的內文的內容!
";
$content .= "傳入參數:
1. {$query_value1}
";
$content .= "2. {$query_value2}
";
$content .= "3. 未註冊就無值直接顯示該key: {$a}";
return $content;
}
function mxp_demo_route_post_callback($query_value1, $query_value2, $a) {
return "這裡會是 POST 方法的內文的內容!";
}
function mxp_demo_route_put_callback($query_value1, $query_value2, $a) {
return "這裡會是 PUT 方法的內文的內容!";
}
function mxp_demo_route_delete_callback($query_value1, $query_value2, $a) {
return "這裡會是 DELETE 方法的內文的內容!";
}
function mxp_demo_route_default_callback($query_value1, $query_value2, $a) {
return "這裡會是 default 方法的內文的內容!";
}
add_action('wp_router_generate_routes', 'mxp_routes_01', 20);
把外掛安裝好後,在主題 functions.php
裡或是你規劃好的檔案中開始接續開發就搞定囉!
他的做法完全符合 WordPress Rewrite API 所以其實他的原理是註冊了一個 Post Type 叫「wp_router_page」並寫入一篇後拿那篇當所有註冊路徑會找到的內容,然後中間在包裝過方法來安插處理程序。
整體來說是包裝過好用不少,但缺點也是內容必須遵守 WordPress Loop 規範吐出內容,要單純一點繞過可能就要在方法中自己在包裝了。
後記
再找這篇之前我還再用土炮的做法硬幹XD
function mxp_rewrite_rule_demo() {
add_rewrite_rule('^中文路徑/(.*?)$', 'index.php?name=$matches[1]', 'top');
}
add_action('init', 'mxp_rewrite_rule_demo');
先註冊一個路徑後,再透過 pre_handle_404
事件去捕捉 404 事件,並在方法中做路徑分析與重導向。至於怎麼會發展成這種土炮呢? 故事的緣由還是因為要盡可能把轉換網站過程中,路徑定義不同會導致 SEO 結果被改變的部分,想辦法救回來拉!
這個外掛在 5.2.2 版本還是妥妥的XD
讚哦,感謝使用回報~