我一直在尝试创建第二个网址选项,重写为prestashop内的产品。在SEO和标准的Prestashop安装中网址的部分我已经获得了以下产品网址:
{category:/}{id}-{rewrite}-{ean13}.html
这会创建以下产品网址:
https://www.example.com/{category-name}/{product-id}/{product-name}/{ean13}.html
我想添加的是一个选项,出于各种原因通过以下网址构建来访问产品页面:
ean/{ean13}.html
结果网址类似于以下示例:
https://www.example.com/ean13/{ean13}.html
注意,ID是网址构建的标准必填字段,这意味着我无法使用:"只需调整网址建立"作为答案。
是否有能够生成这类结构的模块,插件或代码片段?
我确实找到了一些"从漂亮的网址"中移除ID?模块,但没有给我我搜索的结果。仅部分,因为它只删除了ID。
如果它是第一个{code}段中提到的标准网址构建重定向,则不会成为问题。我知道我可以在我的.htacces文件中编写重写规则但是为每个产品执行此操作会有很多工作,所以我想知道是否有更简单的方法来实现这一点。
一如既往地提前感谢!
答案 0 :(得分:3)
如果您可以重定向到标准网址,那么使用模块可以轻松解决问题。
moduleRoutes
的模块,并配置一个友好的URL以使用模块控制器我假设您知道如何编写模块和控制器,因此我不会仅仅根据相关位编写完整的代码。
在模块类中挂钩moduleRoutes
。
在此钩子中,您可以为自定义控制器配置友好URL。
public function hookModuleRoutes()
{
return [
'mymodulename-mycontrollername-root' => [
'rule' => 'ean13/{:ean13}.html',
'controller' => 'mycontrollername',
'keywords' => [
'ean13' => ['regexp' => '[0-9]+', 'param' => 'ean13']
],
'params' => [
'fc' => 'module',
'module' => 'mymodulename'
]
]
];
}
因此,访问https://www.example.com/ean13/12345.html
将运行您的模块控制器,而GET变量ean13
的值将为12345
。
然后创建mycontrollername
模块控制器,您可以使用postProcess()
方法检查EAN是否存在。
public function postProcess()
{
$query = new DbQuery();
$query->select('id_product')
->from('product_attribute', 'pa')
->where('pa.ean13 = ' . (int)Tools::getValue('ean13'))
$productId = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
if ($productId) {
Tools::redirect($this->context->link->getProductLink($productId));
}
Tools::redirect('pagenotfound');
}
在查询中,我们检查product_attribute
表格,因为产品组合可以拥有自己的EAN13,您还希望这些EAN13重定向到产品页面。
此答案的基础知识最常用于将核心产品搜索控制器替换为自定义和SEO友好型。