Php Opencart重复URL关键字

Php Opencart重复URL关键字,php,opencart,Php,Opencart,我如何着手解决Opencart中两个类别/产品具有相同URL的问题?或者,如果他们的模块已经实现了这一点 例如:类别 Ladies -> Trousers (URL: ladies/trousers) Mens -> Trousers (URL: mens/trousers) 这破坏了Opencart,因为我们有两个子类别,URL=裤子 我是为那个确切的场景开发的我是为那个确切的场景开发的我已经解决了这个问题,我制作了一个vqmodexml文件 请参阅opencart为以下URL提

我如何着手解决Opencart中两个类别/产品具有相同URL的问题?或者,如果他们的模块已经实现了这一点

例如:类别

Ladies -> Trousers (URL: ladies/trousers)
Mens -> Trousers (URL: mens/trousers)

这破坏了Opencart,因为我们有两个子类别,URL=裤子

我是为那个确切的场景开发的

我是为那个确切的场景开发的

我已经解决了这个问题,我制作了一个vqmodexml文件

请参阅opencart为以下URL提供相同的结果

http://mycart/mp3-players/iPod-Classic http://mycart/mp3-players/some-child/iPod-Classic http://mycart/some-parent/mp3-players/iPod-Classic http://mycart/iPod-Classic 为“iPod Classic”产品做搜索引擎优化是很困难的

因此,我编写了一个“vqmod”脚本,使用该脚本,您可以将用户重定向到特定且正确的页面

即使用户输入了错误的url

i、 e

它将自动将其重定向到

http://mycart/mp3-players/iPod-Classic
您只需要从“box”或“com”下载“controller\u common\u seo\u url.xml”

在打开的购物车中安装vqmode 在vqmod/xml中创建一个名为“controller\u common\u seo\u url.xml”的xml文件 打开controller_common_seo_url.xml并编写以下代码 公共函数索引添加更多函数 1 2.1.5

我已经解决了这个问题,我制作了一个vqmode xml文件

请参阅opencart为以下URL提供相同的结果

http://mycart/mp3-players/iPod-Classic http://mycart/mp3-players/some-child/iPod-Classic http://mycart/some-parent/mp3-players/iPod-Classic http://mycart/iPod-Classic 为“iPod Classic”产品做搜索引擎优化是很困难的

因此,我编写了一个“vqmod”脚本,使用该脚本,您可以将用户重定向到特定且正确的页面

即使用户输入了错误的url

i、 e

它将自动将其重定向到

http://mycart/mp3-players/iPod-Classic
您只需要从“box”或“com”下载“controller\u common\u seo\u url.xml”

在打开的购物车中安装vqmode 在vqmod/xml中创建一个名为“controller\u common\u seo\u url.xml”的xml文件 打开controller_common_seo_url.xml并编写以下代码 公共函数索引添加更多函数 1 2.1.5

我知道这是一个迟来的答案,但这是OpenCarts体系结构的一个根深蒂固的问题

就我个人而言,我不是vQmod的粉丝,所以这里有一个被一些人称为“黑客”的解决方案,可以解决这个问题而不使用它

我已经看到了对catalog/controller/common/seo_url.php的许多修改,它们添加了自定义的seo url。此修复程序与此类修改兼容

我还想补充一点,这绝不是世界上最复杂的解决方案,但它将保证具有重复seo url条目的子类别将正常工作

在catalog/controller/common/seo_url.php中找到

替换为以下内容:

if ($url[0] == 'category_id') {
    $categories[$i] = $this->model_catalog_category->getCategory($url[1]);

    if (!isset($this->request->get['path'])) {
        $this->request->get['path'] = $categories[$i]['category_id'];
    } else {
        foreach ($query->rows as $row) {
            $url = explode('=', $row['query']);
            $category_id = $url[1];

            $category = $this->model_catalog_category->getCategory($category_id);

            if ($category['parent_id'] == $categories[$i - 1]['category_id']) {
                $this->request->get['path'] .= '_' . $category['category_id'];
            }
        }
    }
}
$categories = array();

for ($i = 0; $i < count($parts); $i++) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'");
将以下行添加到方法索引的顶部

$this->load->model('catalog/category');
找到线

foreach ($parts as $part) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");
并替换为以下内容

if ($url[0] == 'category_id') {
    $categories[$i] = $this->model_catalog_category->getCategory($url[1]);

    if (!isset($this->request->get['path'])) {
        $this->request->get['path'] = $categories[$i]['category_id'];
    } else {
        foreach ($query->rows as $row) {
            $url = explode('=', $row['query']);
            $category_id = $url[1];

            $category = $this->model_catalog_category->getCategory($category_id);

            if ($category['parent_id'] == $categories[$i - 1]['category_id']) {
                $this->request->get['path'] .= '_' . $category['category_id'];
            }
        }
    }
}
$categories = array();

for ($i = 0; $i < count($parts); $i++) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'");

我知道这是一个迟来的答案,但这是OpenCarts架构的一个根深蒂固的问题

就我个人而言,我不是vQmod的粉丝,所以这里有一个被一些人称为“黑客”的解决方案,可以解决这个问题而不使用它

我已经看到了对catalog/controller/common/seo_url.php的许多修改,它们添加了自定义的seo url。此修复程序与此类修改兼容

我还想补充一点,这绝不是世界上最复杂的解决方案,但它将保证具有重复seo url条目的子类别将正常工作

在catalog/controller/common/seo_url.php中找到

替换为以下内容:

if ($url[0] == 'category_id') {
    $categories[$i] = $this->model_catalog_category->getCategory($url[1]);

    if (!isset($this->request->get['path'])) {
        $this->request->get['path'] = $categories[$i]['category_id'];
    } else {
        foreach ($query->rows as $row) {
            $url = explode('=', $row['query']);
            $category_id = $url[1];

            $category = $this->model_catalog_category->getCategory($category_id);

            if ($category['parent_id'] == $categories[$i - 1]['category_id']) {
                $this->request->get['path'] .= '_' . $category['category_id'];
            }
        }
    }
}
$categories = array();

for ($i = 0; $i < count($parts); $i++) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'");
将以下行添加到方法索引的顶部

$this->load->model('catalog/category');
找到线

foreach ($parts as $part) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");
并替换为以下内容

if ($url[0] == 'category_id') {
    $categories[$i] = $this->model_catalog_category->getCategory($url[1]);

    if (!isset($this->request->get['path'])) {
        $this->request->get['path'] = $categories[$i]['category_id'];
    } else {
        foreach ($query->rows as $row) {
            $url = explode('=', $row['query']);
            $category_id = $url[1];

            $category = $this->model_catalog_category->getCategory($category_id);

            if ($category['parent_id'] == $categories[$i - 1]['category_id']) {
                $this->request->get['path'] .= '_' . $category['category_id'];
            }
        }
    }
}
$categories = array();

for ($i = 0; $i < count($parts); $i++) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'");
如果为3级类别,则此项不起作用。我希望有人会有更好的解决办法


如果为3级类别,则此项不起作用。我希望有人会有更好的解决方案。

除了@Ian Brindley之外,您还应该编辑另外两个文件,以便在管理面板中输入关键字: Admin/Controller/Catalog/category.php

在validateForm方法中查找这些代码行

并将其更改为:

if (utf8_strlen($this->request->post['keyword']) > 0) {
    $this->load->model('catalog/url_alias');

    $url_alias_info = $this->model_catalog_url_alias->getUrlAlias($this->request->post['keyword']);

    if ($url_alias_info && !isset($this->request->get['category_id'])) {
        $this->error['keyword'] = sprintf($this->language->get('error_keyword'));
    }

    if ($this->error && !isset($this->error['warning'])) {
        $this->error['warning'] = $this->language->get('error_warning');
    }
}

这将摆脱检查,如果搜索引擎优化关键字是重复的。通过这种方式,您可以在adminpanel中输入seo关键字,而不是phpmyadmin

除了@Ian Brindley之外,您还应该编辑另外2个文件,以便您可以在admin panel中输入关键字: Admin/Controller/Catalog/category.php

在validateForm方法中查找这些代码行

并将其更改为:

if (utf8_strlen($this->request->post['keyword']) > 0) {
    $this->load->model('catalog/url_alias');

    $url_alias_info = $this->model_catalog_url_alias->getUrlAlias($this->request->post['keyword']);

    if ($url_alias_info && !isset($this->request->get['category_id'])) {
        $this->error['keyword'] = sprintf($this->language->get('error_keyword'));
    }

    if ($this->error && !isset($this->error['warning'])) {
        $this->error['warning'] = $this->language->get('error_warning');
    }
}

这将摆脱检查,如果搜索引擎优化关键字是重复的。通过这种方式,你可以在adminpanel中输入seo关键字,而不是phpmyadmin

有趣的是:我看到了这个问题,我正要键入:我为我遇到这个问题的确切场景编写了一个插件。幽默:我看到了这个问题,我正要键入:我写了一个
我在Opencart v2.0.1.0中遇到的问题已经解决了:谢谢!如果完整url不正确,您将如何显示404错误?e、 g:'/mens/beatrs/foo'@JohnMagnolia动作类没有解决404错误吗?没有,它正在加载裤子category@JohnMagnolia然后您必须编写一些代码:使用Opencart v2.0.1.0:谢谢!如果完整url不正确,您将如何显示404错误?e、 g:'/mens/beatrs/foo'@JohnMagnolia动作类没有解决404错误吗?没有,它正在加载裤子category@JohnMagnolia然后您必须编写一些代码: