好消息是,我想出了一个方法来实现这一点。这是我的解决方案。
以我上面的例子,我将向您介绍我为获得example.com/book/genre/horror
指向自定义帖子类型book
, 分类学genre
和类别horror
.
应该启用Pretty permalinks。转到设置>永久链接以启用它。否则,这样做就没有意义了。所以我们开始。。。
1) 创建一个名为book(和slug book)的页面,注意发布后为该页面生成的页面ID,您将需要它(您可以在URL中看到它,应该是?post=
其中包含页面ID。)
2) 现在我们需要创建一个重写,以便将链接指向正确的模板页面。所以,在你的functions.php
文件(或插件文件,由您决定)您需要添加以下代码:
function my_rewrite_rules() {
add_rewrite_rule(
\'book/genre/([[A-Za-z0-9\\-]+)?/?$\',
\'index.php?page_id=1234&genre=$matches[1]\',
\'top\'
);
flush_rewrite_rules();
}
add_action( \'init\', \'my_rewrite_rules\' );
现在,用为页面生成的页面ID替换1234
book
. 然后转到任何前端页面并重新加载。
Important: 你不想跑flush_rewrite_rules();
每次在站点中加载页面时。这是一个繁重的功能,会让你的速度变慢。您只需在front end. 在前端重新加载任何页面后,将刷新重写规则,您可以删除此行。
此函数的作用是,如果url的结构为/book/genre/ANYTHING_HERE/
, WordPress将用户重定向到ID为1234的页面,其中包含数据genre=ANYTHING_HERE
. 请注意,这里的ANYTHING\\u都是通过提供的正则表达式过滤的,它只接受来自a-z、数字0-9和破折号(-)的字符(大写和小写)。
3) 转到主题文件夹并创建一个名为page-1234.php
(将1234替换为your 当然是页面ID。)现在在这个文件中,你可以做各种有趣的事情。下面是如何列出所有书籍的by genre:
<?php
get_header();
global $wp_query;
$genre = $wp_query->query_vars[\'genre\'];
$args = array(
\'post_type\' => \'book\',
\'tax_query\' => array(
array(
\'taxonomy\' => \'genre\',
\'field\' => \'slug\',
\'terms\' => $genre,
), ),
);
$books = new WP_Query( $args );
?>
<h1>Books of <?php echo $genre;?></h1>
<ul>
<?php foreach ( $books as $book ) : ?>
<li><?php echo $book->post_title; ?></li>
<?php endforeach; ?>
</ul>
<?php get_footer(); ?>
此外,如果您不使用分类法,如
genre
在本例中,可以使用自定义标记。顺便说一下
genre
仅在本例中有效,因为它已注册为分类法。如果不是这样,您可以通过将此添加到
functions.php
因此:
function custom_rewrite_tag() {
add_rewrite_tag(\'%food%\', \'([^&]+)\');
}
add_action(\'init\', \'custom_rewrite_tag\', 10, 0);
现在您替换
genre
在步骤2中,使用标签
food
. 在您的
page-1234.php
你可以得到
query_vars[\'food\']
并以您喜欢的方式对其进行操作,并运行如下请求
example.com/book/food/chocolate
. 请注意,一些query\\u vars是保留的。请查看下面的资源。
最后,要获得指向正确自定义帖子类型和分类的链接,您需要一个自定义函数。这是我唯一能想到的方法,是这样的:
function get_books_category_link( $category_slug ) {
$page = get_permalink( 1234 );
$link = \'\';
if ( \'/%postname%/\' == get_option(\'permalink_structure\') ) {
$link = $page . \'genre/\' . $category_slug;
} else {
$link = add_query_arg( array( \'genre\' => $category_slug ) , $page );
}
return $link;
}
就这样!希望有帮助。下面的一些精彩阅读,特别是StephenHarris的文章,在理解重写API方面确实有所不同。谢谢
Tuts+ The Rewrite API: The Basics
Rewrite API/add rewrite rule
WordPress Query Vars