在Wordpress中使用动态和漂亮URL的URL重写规则

时间:2018-04-29 12:06:05

标签: php wordpress url-rewriting

我有一个页面被标记book-store。我希望此页面包含不同的部分,即:categorybook。我想使用重写规则来实现与以下示例路由匹配的漂亮网址:

example.com/book-store/category/{category_name}
example.com/book-store/book/{book_id}

我尝试了以下但我认为我遗漏了一些重要内容:

functions.php

add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars)
{
    $vars[] = 'category_name';
    $vars[] = 'book_id';
    return $vars;
}

page-book-store.php

add_rewrite_rule('^book-store/category/([^/]*)/?', 'index.php?post_type=page&name=book-store&book-category=$matches[1]', 'top');
add_rewrite_rule('^book-store/book/([^/]*)/?', 'index.php?post_type=page&name=book-store&book-id=$matches[1]', 'top');

然后我进入/wp-admin并点击了永久链接设置中的保存

每当我点击网址example.com/book-store/category/fictionexample.com/book-store/book/123时,我都会收到404

我正在使用apache2.4和mysql。在apache中启用了mod-rewrite模块。

我在这里错过了什么/做错了什么?

1 个答案:

答案 0 :(得分:1)

据我所知:

  • 您有页面example.com/book-store/
  • 您想要创建以下网址:

    example.com/book-store/category/{category_name}
    example.com/book-store/book/{book_id}
    

    {category_name}{book_id}query vars

您添加到page-book-store.php文件中的代码将无效,只是因为在您的代码之前查询了该网址。此外,过滤器add_filter('query_vars', 'add_state_var', 0, 1);也不起作用。此过滤器的优先级为10,但您使用的是0.

要实现目标,请将此代码添加到functions.php文件中:

add_action('init', 'ww_rewrite_book_store');
function ww_rewrite_book_store(){
    add_rewrite_tag('%book_id%', '([^&]+)');
    add_rewrite_rule('^(book-store)/book/([^/]*)/?', 'index.php?pagename=$matches[1]&book_id=$matches[2]', 'top');

    add_rewrite_tag('%category_name%', '([^&]+)');
    add_rewrite_rule('^(book-store)/category/([^/]*)/?', 'index.php?pagename=$matches[1]&category_name=$matches[2]', 'top');
}

转到Dashboard>设置>永久链接,只需点击保存更改按钮。

首先,我们使用add_rewrite_tag()来建立查询变量。并使用add_rewrite_rule()使其正常工作。

例如,如果您的网址为example.com/book-store/category/some_category,则可以在{some_category}文件中使用查询变量(获取page-book-store.php),如:

echo get_query_var('category_name');