您所做的是添加一个查询变量,这对于您尝试执行的操作来说是非常必要的,但还有两个步骤需要执行:
使其美观:向映射添加重写规则/books/edition/xxx
到index.php?ed=xxx
使其功能化:使其加载自定义模板,以便在用户请求时知道要做什么index.php?ed=xxx
让我们假设用户已经到达example.com/?ed=123
. 您的筛选器允许您使用get_query_var(\'ed\')
但是如何加载模板呢?
首先,我们需要让它在ed
设置了查询变量,WP不知道自己该做什么:
// call render_page() when needed
add_action( \'template_redirect\', \'custom_page_template_redirect\' );
/**
* Filter that maps the query variable to a template
*/
function custom_page_template_redirect() {
global $wp_query;
if ( ! empty( $wp_query->query_vars[\'ed\'] ) ) {
// we\'ve found our page, call render_page and exit
get_template_part( \'ed page template\' );
exit;
}
}
如果我们依靠主查询来获取内容,我们需要执行一些额外的步骤来调整内容:
// don\'t pull in a full listing of posts in the main query, there\'s no need
// ( you can comment this out if you\'re not using a theme template to render content )
add_filter( \'pre_get_posts\', \'custom_page_paging_issue\' );
/**
* fix page loops if pulling in a theme template
*/
function custom_page_paging_issue( $query ) {
if ( !empty( $query->query_vars[\'custom_page\'] ) ) {
$query->set( \'posts_per_page\', 1 );
}
}
现在就让它变得漂亮
example.com/?ed=123
应该可以,但正如您的问题所述,我们需要漂亮的URL!
这就是重写规则的用武之地。重写规则使用add_rewrite_rule
, 这需要两件事:
匹配URL的正则表达式基于查询参数的URL,用于将匹配的内容映射到URL。例如,此重写规则允许您使用URL,如/leaf/22
:
add_filter( \'generate_rewrite_rules\', \'custom_page_generate_rewrite_rules\' );
/**
* Add our rewrite rules
*/
function custom_page_generate_rewrite_rules( $wp_rewrite ) {
$custom_page_rules = array(
\'^leaf/([0-9]+)/?\' => \'index.php?page_id=$matches[1]\'
);
$wp_rewrite->rules = $custom_page_rules + $wp_rewrite->rules;
}
请注意,无论何时更改重写规则,都必须刷新永久链接。WP不会自动重新生成规则。有些人可能会打电话来回避这个问题
flush_rewrite_rules
在
init
钩子,但这可能会导致与物品排序相关的问题,并且非常昂贵/缓慢。只要访问permalinks设置页面就足够了。
此外,重写到与index.php
, 或者重写到一个很好的永久链接。这行不通。重写规则映射到index.php?key=value
键入URL,其他任何内容都无法工作。为此,您需要HTAccess或Nginx规则。重写规则也不是重定向,不能用于重定向到不同的URL
进一步阅读
I wrote about this in greater length here, 包括一个助手类来简化事情。
I also wrote a post here 描述从URL到完全加载页面的整个过程