如果你把 WordPress 當一個 PHP 網站 Framework 來使用的話,應該也會有跟我一樣的感想:「怎麼路徑管理這麼麻煩,都沒有比較好的方式統一個方法建立請求路徑規則嗎?
SlimLaravel 都不錯的說。」

抱持著 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 方法的內文的內容!<br/>";
    $content .= "傳入參數:<br/>1. {$query_value1} <br/>";
    $content .= "2. {$query_value2} <br/>";
    $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 結果被改變的部分,想辦法救回來拉!

Facebook 外掛功能


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *