我有一个页面被标记book-store
。我希望此页面包含不同的部分,即:category
和book
。我想使用重写规则来实现与以下示例路由匹配的漂亮网址:
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/fiction
或example.com/book-store/book/123
时,我都会收到404
我正在使用apache2.4和mysql。在apache中启用了mod-rewrite模块。
我在这里错过了什么/做错了什么?
答案 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');