2010-07-22 37 views
1

我在我的網站有鏈接,將查詢傳遞給從外部數據庫查詢的頁面。這工作正常,例如WordPress的自定義URL重寫

mysite.com/catalog/?tl=flooring 

不過,我想改寫這個網址顯示爲

mysite.com/catalog/flooring 

伊夫試圖修改WordPress的重寫規則,但它始終顯示的索引頁

add_filter('rewrite_rules_array','wp_insertMyRewriteRules'); 
add_filter('query_vars','wp_insertMyRewriteQueryVars'); 
add_filter('init','flushRules'); 

// Remember to flush_rules() when adding rules 
function flushRules(){ 
    global $wp_rewrite; 
    $wp_rewrite->flush_rules(); 
} 

// Adding a new rule 
function wp_insertMyRewriteRules($rules) 
{ 
    $newrules = array(); 
    $newrules['(catalog)/([a-zA-Z0-9 ]+)$'] = '/catalog/?tl=$matches[2]'; 
    return $newrules + $rules; 
} 

// Adding the id var so that WP recognizes it 
function wp_insertMyRewriteQueryVars($vars) 
{ 
    array_push($vars, 'id'); 
    return $vars; 
} 

回答

7

重寫規則在WordPress並不像你期待他們那樣工作。所有重寫規則映射到文件處理程序(幾乎總是index.php),而不是另一個URL。

這裏是一個簡短的代碼示例;

$rules['catalog/(.*)/?'] = 'index.php?pagename=catalog&tl=$matches[1]'; 
array_push($query_vars, 'tl'); // note query var should match your query string 

這將映射catalog/whatever WordPress的頁面 '目錄',並沿查詢VAR 'TL' 通過。您可以爲'catalog'創建一個頁面模板,然後使用get_query_var('tl')獲取'tl'的值。

也避免使用像id這樣的查詢變量 - 使用更獨特的東西(如'tl')以避免與WordPress發生衝突。

And 不要刷新每個init的規則!這是不好的做法,並且將寫入.htaccess並且每頁面加載呼叫數據庫更新

無論何時您更新帖子或您的永久鏈接結構(只需在更改代碼時更新您的永久鏈接),WordPress永遠都會刷新永久鏈接。

+0

是否可以重定向到子頁面?我已經將該帖子名稱放入了pagename中,但實際上是重定向該頁面。 – 2010-07-27 15:18:53

+3

如果它是一個子頁面,'pagename'應該是slug **路徑** - 例如'pagename = parentname/childname' – TheDeadMedic 2010-07-27 16:14:52

2

This article over at Raazorlight更詳細地介紹了在WP中抓取查詢字符串和URL重寫的過程。

此外,檢查那裏的意見,看看爲什麼要調用flushRules()可能不必要,如果你重新保存永久鏈接。可選地,在插件激活回調期間,flushRules()只能被調用一次。

挖掘更深入的評論'pmdci'鏈接到的相關主題上的指導性帖子/傳奇將查詢傳遞給使用自定義分類標準的自定義帖子類型。