使用RewriteCond和WordPress的add_rewrite_rule()

时间:2017-06-21 18:32:19

标签: php wordpress .htaccess mod-rewrite

背景

我更改了我管理的网站上的网址结构,并且需要设置更改查询参数的重定向,但保留该值。

经过一番研究,我发现了一个重写的工作:

RewriteCond %{QUERY_STRING} ^model=(.*)
RewriteRule ^(building-automation|lighting-controls)/display.php$ /?pagename=products/details/?SKU=%1 [QSA,L]

这会改变这个:

[DOMAIN]/building-automation/display.php?model=Product1

进入这个:

[DOMAIN]/?pagename=products/details&SKU=Product1

问题

我无法弄清楚如何让该规则保留在.htaccess文件中。我直接添加它,当我更新永久链接时它会被删除。所以现在我正在尝试使用WordPress的add_rewrite_rule()函数添加它。

代码到目前为止

我发现的最接近的是:

add_rewrite_rule(
    '(building-automation|lighting-controls)/display.php?model=([^/]*)',
    '?pagename=products/details&SKU=$2',
    'top'
);

这会在.htaccess文件中创建:

RewriteRule ^(building-automation|lighting-controls)/display.php?model=([^/]*) /?pagename=products/details&SKU=$2 [QSA,L]

并且RewriteRule不起作用。

问题

有没有办法使用add_rewrite_rule()来实现有效的RewriteRule?或者,是否有一个不同的RewriteRule,我可以使用它不需要RewriteCond来实现HTTP查询参数的更改?

1 个答案:

答案 0 :(得分:0)

重写很棘手,幸运的是我刚刚与他们合作很多,所以这是我最好的帮助你的尝试。在WordPress中,你不想直接调用php文件,如display.php。这是您系统结构中的第一个问题,我不确定这是一个插件还是什么,但它是一个坏主意,完全否定了首先使用WordPress的原因

通常,URL看起来像/ building-automation / details / Product1,你会有一个重写规则,指向/index.php?pagename=products/details&sku=product1

为此你需要在WordPress中使用它,所以如果使用子主题或者创建一个非常简单的一个文件插件,你可以把它放在你的functions.php中。

allIds.txt

然后您需要添加重写标记,以便您可以访问详细信息查询var:

add_rewrite_rule( '^building-automation/details/([^/]+)/?$', 
    'index.php?pagename=products/details&sku=$matches[1]', 'top' );

最后,您要通过访问代码中的固定链接来刷新重写规则。您不想刷新每个页面加载,因为它在您的服务器上很昂贵:

add_rewrite_tag( '%sku%', '([^&]+)' );