wordpress 自定義路由及展示頁

地球沒有花發表於2017-11-16

背景:

我想實現一個特殊的響應,流程如下:訪問domain/test,響應一個表單頁面,填寫並提交表單頁面後,wordpress進行響應(wordpress處理ajax請求)。


key point 1、怎麼註冊domain/test這個路由(add_rewrite_rule())?

key point 2、怎麼響應domain/test這個請求(template_redirect)?


實現過程:

首先,wordpress 有重寫url的方法,叫 add_rewrite_rule()。在function.php中加入如下程式碼段:

// 新增路由重寫,每次修改完記得在wp-admin後臺“設定”-》“固定連結”=》“儲存”才能生效
add_action('init', 'theme_functionality_urls');
function theme_functionality_urls() {
        add_rewrite_rule('^test','index.php?test=1','top');
}
這段程式碼的意思就是把domain?test=1改寫成domain/test,top意思是把這個規則放到最前面。

此時,當你訪問domain/test跟訪問domain?test=1的效果是一樣的。

但是,我們原本也沒有對domain?test=1這樣的請求進行響應。所以1、當請求domain?test=1的時候,我們怎麼獲取到這個test的值?2、怎麼對這個請求進行響應?

add_action('query_vars', 'test_add_query_vars');
function test_add_query_vars($public_query_vars){
    $public_query_vars[] = 'test'; 
    return $public_query_vars;
}
這段程式碼的意思是在執行到query_vars這個鉤子的時候,給$public_query_vars陣列裡面新增一個test欄位,這個test欄位就是當訪問domain?test=1的時候的test的欄位。當新增test到$public_query_vars之後,會檢查每個請求url裡是否包含test欄位。

//模板載入規則   
add_action("template_redirect", 'test_template_redirect');
function test_template_redirect(){
    global $wp;
    global $wp_query;
    $reditect_page =  $wp_query->query_vars['test'];    
    if ($reditect_page == "1"){   
        include(TEMPLATEPATH.'/test/test.php');   
        die();   
    }   
}  

這段程式碼的意思是這樣的,首先,這個TEMPLATEPATH是你的主題路徑,連著/test/test.php相當於在你的主題目錄下新建了一個test目錄,test目錄裡有一個test.php檔案。

所有的請求都會走這個方法,但是,唯獨請求url中包含test欄位並且test的值為1的時候會轉至我們新建的/test/test.php頁面。然後die()掉。


至此,當我們訪問domain/test的時候,相當於在訪問domain?test=1這個url,並且會把我們自定義的template展示出來。



我在這個test.php中寫了一個表單,通過ajax請求打到wordpress後臺進行處理,具體可以參考《wordpress處理ajax請求》。



參考:

http://www.ashuwp.com/courses/highgrade/318.html

https://www.iteblog.com/archives/1988.html



相關文章