【问题标题】:Prestashop Friendly URL'sPrestashop 友好 URL
【发布时间】:2018-08-20 06:01:30
【问题描述】:

我一直在尝试创建第二个选项,将 URL 重写为 prestashop 内的产品。在 SEO 和 URL 部分的标准 Prestashop 安装中,我有以下产品 url 构建:

{category:/}{id}-{rewrite}-{ean13}.html

这将创建以下产品网址:

https://www.example.com/{category-name}/{product-id}/{product-name}/{ean13}.html

出于各种原因,我想添加一个选项,以通过以下 url 构建访问产品页面:

ean/{ean13}.html

结果 url 类似于以下示例:

https://www.example.com/ean13/{ean13}.html

注意,ID 是 url 构建的标准必填字段,这意味着我不能使用:“Just ajust ajust the url build up”作为答案。

是否有可以生成此类结构的模块、插件或代码片段?

我确实找到了一些“从漂亮的 url 中删除 ID”模块,但这并没有给我正在搜索的结果。只是部分因为它只删除了 ID。

如果它是第一个 {code} 段中提到的标准 url 构建的重定向,则不会有问题。我知道我可以在我的 .htacces 文件中编写重写规则,但是为每个产品执行此操作将需要大量工作,所以我想知道是否有更简单的方法来实现这一点。

一如既往地提前致谢!

【问题讨论】:

    标签: .htaccess url-rewriting seo prestashop clean-urls


    【解决方案1】:

    如果您对重定向到标准 URL 没问题,那么使用模块解决方案非常简单。

    1. 创建一个使用 hook moduleRoutes 的模块并配置一个友好的 URL 以使用模块控制器
    2. 创建模块前端控制器
    3. 在您的自定义控制器中运行数据库查询以检查是否存在具有请求的 EAN 的产品
    4. 如果产品存在则重定向到产品页面,否则重定向到 404 页面或其他内容

    我假设你知道如何编写模块和控制器,所以我不会只写相关部分的整个代码。

    在模块类中挂钩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 友好的控制器。

    【讨论】:

    • 像魅力一样工作!
    • 嗨,你能帮我吗?带着这个问题:stackoverflow.com/questions/49430883/… 我在访问 url 时遇到了一些问题。我认为它会正常工作,但遗憾的是我还没有找到解决方案
    • 能否提供一个完整的代码示例?
    猜你喜欢
    • 2016-09-27
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    相关资源
    最近更新 更多