Wordpress自定义URL重写

时间:2010-07-22 09:18:13

标签: php wordpress mod-rewrite url-rewriting

我的网站中有链接将查询传递给从外部数据库查询的页面。这很好,例如。

mysite.com/catalog/?tl=flooring

但是我想重写此网址以显示为

mysite.com/catalog/flooring

我曾尝试修改wordpress中的重写规则,但它始终显示索引页

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(catalog)/([a-zA-Z0-9 ]+)$'] = '/catalog/?tl=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'id');
    return $vars;
}

2 个答案:

答案 0 :(得分:8)

在WordPress中重写规则并不像你期望它们那样有效。所有重写规则都映射到文件处理程序(几乎总是index.php),而不是另一个URL。

这是一个缩短的代码示例;

$rules['catalog/(.*)/?'] = 'index.php?pagename=catalog&tl=$matches[1]';
array_push($query_vars, 'tl'); // note query var should match your query string

这会将catalog/whatever映射到WordPress页面'catalog',并传递查询var'tl'。您可以为“目录”创建页面模板,然后使用get_query_var('tl')获取“tl”的值。

同时避免使用像id这样的查询变量 - 使用更独特的东西(比如'tl')来避免与WordPress的冲突。

刷新每个init的规则!这是不好的做法,会写入.htaccess并在每个页面加载时调用数据库更新!

每当您更新帖子或永久链接结构时,WordPress将始终刷新固定链接(只需在更改代码时更新固定链接)。

答案 1 :(得分:2)

This article over at Raazorlight详细介绍了在WP中获取查询字符串和URL重写的过程。

另外,检查那里的评论,看看为什么在重新保存永久链接时可能不需要调用flushRules()。可选地,在插件激活回调期间,flushRules()只能被调用一次。

深入挖掘,评论者'pmdci'链接到关于使用自定义分类将查询传递到自定义帖子类型的相关主题的指导性帖子/传奇。