WordPress重写规则2子目录深度



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

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

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

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

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

最新更新