我一直在读这个question and answer 我很感兴趣,因为我正试图实现一些非常相似的目标,但我失败了,我想知道是否有人可以帮助我。
我还使用了一个自定义插件,它查询自定义表以填充页面。该页面是一个普通的WP页面,附带了一个模板,可以调用插件文件的函数来获取数据。
如果我在URL中键入此内容,我会正确加载页面:
www.mywebsite。com/?pagename=产品/食品和餐饮工作服;prodid=232(&;pname=Trilby帽子
我想键入此内容(或在链接中使用),并得到相同的结果:
我的网站。com/产品/食品和餐饮工作服/232/Trilby帽子/
(顺便说一句,我一开始也在想重写\\u规则的相反情况;一旦到位,它实际上会将我的URL“更改”为更“友好”的版本:-)
我已经在插件文件中的init函数中添加了这一行(一件事是,我正在使用同一个init函数将一些js排队——我假设只需将这一行添加到同一个函数中就可以了):
add_rewrite_rule(\'([^/]+)/([^/]+)/([^/]+)/?\',\'index.php?pagename=$matches[1]&prodid=$matches[2]&pname=$matches[3]\',\'top\' );
注意:在我的页面层次结构中,slug中始终有一个父页面和一个子页面;父母很可能永远是同一页,但孩子肯定会有所不同。但我想保持规则的灵活性,以抓住所有的可能性。我的插件的主要触发器是查询字符串中的这两个变量。
我还将prodid和pname添加到$query\\u vars中:
add_filter( \'query_vars\', \'prod_query_vars\' );
function prod_query_vars( $query_vars )
{
$query_vars[] = \'prodid\';
$query_vars[] = \'pname\';
return $query_vars;
}
有人知道我错在哪里吗?还有一件事。我不理解刷新规则的部分。既然这是一个插件(不是functions.php),那么什么时候需要刷新规则?每次我更新插件文件(尝试不同的代码可能性)时,在尝试使用我的“友好”URL格式之前,我都会先进入Permalinks页面。我在上一个问题的一个示例中注意到:flush\\u rewrite\\u rules(false)被放置在register\\u activation\\u hook()函数中,但我的插件已经设置好并正在运行。我正在尝试修改它,所以我现在想我不会使用它(但这可能是插件未来“安装”的解决方案)
我也不太精通正则表达式,所以我知道它可能是我误入歧途的地方。
很抱歉提出这么冗长的问题,但我想尽可能详细地说明我的情况。
提前感谢任何能帮忙的人。
SO网友:Joe Hoyle
关于何时需要刷新重写规则:
这只能发生一次,请确保not 使命感flush_rules()
在init上,这将真正降低高流量站点的性能。
WordPress将所有重写存储在数据库中的一个数组中,因此您所需要做的就是在更新数据库之前挂接。一种方法是挂接到“rewrite\\u rules\\u array”并添加规则:
add_filter( \'rewrite_rules_array\', \'my_rewrites_function\' );
function my_rewrite_function( $rules ) {
$my_rules = array(
\'([^/]+)/([^/]+)/([^/]+)/?\' => \'index.php?pagename=$matches[1]&prodid=$matches[2]&pname=$matches[3]\'
);
$rules = array_merge( $my_rules, $rules );
return $rules;
}
保持“query\\u vars”挂钩不变。您需要访问Permalinks页面,将您的规则插入WordPress的选项中,但之后您应该进行设置。
如果不起作用,您可以挂接到“parse\\u request”,查看为您正在查看的页面选择了哪个重写规则:
add_filter( \'parse_request\', \'my_request_rewrite_check\' );
function my_request_check( $wp ) {
var_dump( $wp->matched_rule );
return $wp;
}
此外,您的正则表达式对于上面的结构来说是一个松散的
mywebsite.com/products/food-and-catering-workwear/232/Trilby Hat/
, 更像是:
^products/([^/]+)/([\\d]*)/([^/]+)/?$
Is表示“以‘products’、‘/’开头,然后是任意单词,‘/’,然后是任意数字,‘/’,然后是任意单词”(“$”表示字符串现在必须结束)
我希望这有帮助!