2016-07-05 42 views
0

我試圖建立一個自定義WordPress的路由看起來是這樣:WordPress的重寫規則2個子目錄深

sitename/books/{book_name}/

將指向頁,書本的single.php文件,並抓住這個名字在query_vars

sitename/books/{book_name}/{article-name}/

將指向頁圖書,Article.php文件,並在query_vars抓住這名

它可以工作1頁深(sitename/books/{book_name}/),但有2深(sitename/books/{book_name}/{article-name}/),它只返回1頁深。

下面是代碼:

add_action('init', 'wpse26388_rewrites_init'); 

function wpse26388_rewrites_init() 
{ 
    add_rewrite_rule(
     'books/?([^/]*)', 
     'index.php?pagename=books&book_name=$matches[1]', 
     'top'); 

    add_rewrite_rule(
     'books/?([^/]*)/?([^/]*)', 
     'index.php?pagename=books-single&article_name=$matches[1]', 
     'top'); 

    flush_rewrite_rules(); 
} 

add_filter('query_vars', 'wpse26388_query_vars'); 
function wpse26388_query_vars($query_vars) 
{ 
    $query_vars[] = 'book_name'; 
    $query_vars[] = 'article_name'; 

    return $query_vars; 
} 

function prefix_url_rewrite_templates() 
{ 

    if (get_query_var('book_name')) 
    { 
     add_filter('template_include', function() { 
      return get_template_directory() . '/page-books-single.php'; 
     }); 
    } 

    if (get_query_var('article_name')) 
    { 
     add_filter('template_include', function() { 
      return get_template_directory() . '/page-book-article.php'; 
     }); 
    } 
} 

回答

1

第一重寫規則可能會優先,滿足所有匹配。

如果您要求sitename/books/{book_name}/{article-name}/規則'books/?([^/]*)'滿足它。該規則可能是:

'books/([^/]*)/?$' 
and 
'books/([^/]*)/([^/]*)/?' 

第一個,迫使它匹配到結束($),並且沒有下斜線,除非它是一個最後的斜線。第二個要求兩個部分之間的斜線。這樣,如果第二個斜槓在請求中(並且它不是最終字符),那麼它將作爲第二個值處理。

+0

嗯,現在使'sitename/books/{book_name}/{article-name} /'工作如預期的那樣,但現在'sitename/books/{book_name} /'不起作用 – Packy

+0

因爲^是起始字符,而不是結尾。我應該把美元,而且會解決這個問題。 – ppostma1

+0

完美!我可以通過什麼資源來更好地理解這些規則?喜歡,它是什麼語言? – Packy