我需要一个重写规则。我为“Books”设置了一个自定义帖子类型,每本书都有一个可重复的章节字段(使用ACF Pro)。
我添加了一个query_var
对于chapter
使用下面的代码。。。
// Add chapter to query vars array
function add_query_vars_filter( $vars ){
$vars[] = "chapter";
return $vars;
}
add_filter( \'query_vars\', \'add_query_vars_filter\' );
在
single-books.php
模板页面,我有一个代码来捕获
query_var
并显示图书概述或章节元字段。。。
if (get_query_var(\'chapter\') == \'\') {
// show book title and content
} elseif (get_query_var(\'chapter\') >= 1) {
$chapter_no = (get_query_var( \'chapter\', 1 ) - 1); //minus one as first array row has index of 0.
$rows = get_field(\'chapter\'); // get all the rows
$chapter = $rows[$chapter_no]; // get the row given from query_var
// show chapter fields from ACF array.
// $chapter[\'title\']
// $chapter[\'content\']
// $chapter[\'image\']
};
所以的url
Chapter 1 看起来像这样。。。
www.example.com/books/book-title/?chapter=1
这很好,但出于SEO目的,我希望url看起来更漂亮,如下面的示例。。。
www.example.com/books/book-title/1/chapter-title/
我看了一下抄本,尝试了以下方法。。。
function custom_rewrite_basic() {
add_rewrite_rule(\'^books/([^/]*)/([0-9]+)/?\', \'index.php?post_type=books&chapter=$matches[1]\', \'top\');
}
add_action(\'init\', \'custom_rewrite_basic\');
我没有从中得到任何东西,也不确定我需要做什么/如果可能的话。谁能给我指出正确的方向,或者告诉我如何创建重写规则。
谢谢
最合适的回答,由SO网友:Milo 整理而成
默认情况下,post type查询变量与post type slug相同。未经测试,但这应该有效-
function custom_rewrite_basic() {
add_rewrite_rule(
\'^books/([^/]+)/([0-9]+)/([^/]+)/?\',
\'index.php?books=$matches[1]&chapter=$matches[2]\',
\'top\'
);
}
add_action(\'init\', \'custom_rewrite_basic\');
$matches[3]
将包含章节slug,但如果不需要它来检索章节,则不必设置它。
重写规则在添加/更改后需要刷新。访问设置>永久链接页面将刷新它们,而无需调用flush_rewrite_rules
你自己
重写规则只处理传入的请求,由您为每个章节生成正确的URL,但这应该只是获取章节数据并将数字/标题附加到post permalink的问题。类似这样:
$rows = get_field(\'chapter\');
foreach( $rows as $index => $row ){
echo get_permalink() . \'/\' . ( $index + 1 ) . \'/\' . sanitize_title( $row[\'title\'] ) . \'/\';
}
此外,为了保持模板整洁,您可以
filter single_template
, 检查
chapter
设置了查询变量,并为章节加载与主页不同的模板。