2010-06-27 63 views
1

我有一個名爲Book(/ book /)的WP頁面,它以各種語言顯示一本書。語言和章節變量 作爲查詢變量傳遞。因此,URL結構如下:否定自定義重寫表達式中的某些單詞?

/書/英語/(這個用英語顯示章節列表) /書/英語/前言/(這顯示了本英語書的前言)

這裏就是我想出了:

add_action('init', 'book_init'); 
add_filter('rewrite_rules_array', 'book_rewrite_rules_array'); 
add_filter('query_vars', 'book_query_vars'); 

function book_init() { 
global $wp_rewrite; 
$wp_rewrite->flush_rules(); 
} 
function book_rewrite_rules_array($rewrite_rules) { 
global $wp_rewrite; 
$custom['(book)/(.+)/(.+)$'] = 'index.php?pagename=$matches[1]&book_language=$matches[2]&book_chapter=$matches[3]'; 
$custom['(book)/(.+)$'] = 'index.php?pagename=$matches[1]&book_language=$matches[2]'; 
return $custom + $rewrite_rules; 
} 
function book_query_vars($query) { 
array_push($query, 'book_language', 'book_chapter'); 
return $query; 
} 

一切工作,但問題是,我已經添加了重寫規則也趕上/電子書/飼料/我不希望 。所以我正在尋找一個表達式,否定來自'(書)/(。+)/(。+)$'和'(書)/(。+)$''

也餵我想知道,如果假設提供的查詢變量是無效的,我應該使用哪個過濾器來檢查這個過濾器,以及我如何停止WP繼續,並讓它發送404錯誤並讓它顯示404頁面?

+1

沒有足夠的時間給出完整的回覆 - 會盡快嘗試!與此同時,你正在沖洗每個初始化的規則!這太密集了!擺脫它,只要更改代碼時更新管理員的永久鏈接。 'flush_rules()'也被稱爲任何時候一個職位更新,所以你的規則將保持新鮮。 – TheDeadMedic 2010-06-27 17:12:46

回答

1

您應該能夠使用負向預測排除您的路線中的'feed',如下所示:(book)/(?!feed$)(.+)$

至於你的問題的第二部分,你可以掛鉤到request過濾器檢查查詢變量,然後給變量數組添加一個'錯誤'值,導致Wordpress引發404錯誤。

add_filter('request', 'book_request'); 
function book_request($vars) { 
    if (!in_array($vars['book_language'], array('english', 'spanish'))) { 
     $vars['error'] = '404'; 
    } 
    return $vars; 
} 
相關問題