wordpress重写规则2子目录深

时间:2016-07-05 18:54:21

标签: php wordpress .htaccess

我正在尝试设置一个自定义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';
        });
    }
}

1 个答案:

答案 0 :(得分:1)

第一个重写规则可能优先,并且满足所有匹配。

如果您请求sitename/books/{book_name}/{article-name}/,则'books/?([^/]*)'符合规则。规则可能必须是:

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

第一个,强制它匹配到结尾($),并且没有跟随斜杠,除非它是最后一个斜杠。第二个要求两个部分之间的斜线。这样,如果第二个斜杠在请求中(并且它不是最终字符),则将其视为第二个值