我正在尝试设置一个自定义WordPress路由,它将如下所示:
sitename/books/{book_name}/
将指向Page-Book-Single.php文件并在query_vars中获取该名称
sitename/books/{book_name}/{article-name}/
将指向Page-Book-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';
});
}
}
答案 0 :(得分:1)
第一个重写规则可能优先,并且满足所有匹配。
如果您请求sitename/books/{book_name}/{article-name}/
,则'books/?([^/]*)'
符合规则。规则可能必须是:
'books/([^/]*)/?$'
and
'books/([^/]*)/([^/]*)/?'
第一个,强制它匹配到结尾($),并且没有跟随斜杠,除非它是最后一个斜杠。第二个要求两个部分之间的斜线。这样,如果第二个斜杠在请求中(并且它不是最终字符),则将其视为第二个值