Difficulty with rewrite rules

时间:2018-07-13 作者:Michael Riordan

我不知道如何将重写规则和自定义查询变量结合起来。

我创建了一个自定义的“edition”模板,它调用外部API来填充一个表,其中包含特定书籍的详细信息。

https://wwww.example.com/books/editions

我使用自定义查询变量填充数据库:

https://www.example.com/books/editions/?ed=1950

例如,其中ed是版本的唯一标识符,通常是年份。

如何(使用WordPress函数)将其重写为:

https://www.example.com/books/editions/1950

我试过许多抄本上的东西,但都没有成功!迄今为止:

Functions.php:

function mr2018_custom_query_vars_filter($vars) {
    $vars[] .= \'ed\';
    return $vars;
    }
    add_filter( \'query_vars\', \'mr2018_custom_query_vars_filter\' );

MyCustomTemplate.php:

$edition = get_query_var( \'ed\' ); 
这很有效:我可以使用?ed=1603 在里面MyCustomTemplate.php 调用数据库。我陷入困境的地方是将其改写为可读性强、搜索引擎优化友好的内容。

我相信有一些函数可以将这两个过程结合起来,但我不确定在这种情况下使用哪一个。

1 个回复
SO网友:Tom J Nowell

您所做的是添加一个查询变量,这对于您尝试执行的操作来说是非常必要的,但还有两个步骤需要执行:

使其美观:向映射添加重写规则/books/edition/xxxindex.php?ed=xxxindex.php?ed=xxxexample.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_rulesinit 钩子,但这可能会导致与物品排序相关的问题,并且非常昂贵/缓慢。只要访问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到完全加载页面的整个过程

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post