Wordpress自定义URL重写

use*_*894 1 php wordpress mod-rewrite url-rewriting

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

mysite.com/catalog/?tl=flooring
Run Code Online (Sandbox Code Playgroud)

但是我想重写这个url以显示为

mysite.com/catalog/flooring
Run Code Online (Sandbox Code Playgroud)

我曾尝试修改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;
}
Run Code Online (Sandbox Code Playgroud)

The*_*dic 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 如果它是子页面,`pagename`应该是slug**路径** - 例如`pagename = parentname/childname` (3认同)