想象一下——您是想象中的 OpenCart 商店http://myshinystore.com的管理员,并且您刚刚将商店设置为使用SEO URL。
因此,您的类别链接看起来像这样:
http://myshinystore.com/parent_category/child_category (而不是http://myshinystore.com/index.php?route=product/category&path=11_3)
同样,产品链接看起来像这样:
http://myshinystore.com/product_link(而不是http://myshinystore.com/index.php?route=product/product&product_id=7)
看起来很棒,对吧?不再有丑陋的长 URL – 从现在开始只有有意义的路径。
所以呢?
好吧,有一件小事可能会影响您的网站在 Google 或 Bing 等搜索引擎中的排名。以上面的类别链接为例。可以从以下位置访问同一页面:
http://myshinystore.com/child_category(而不是http://myshinystore.com/parent_category/child_category)
这是一个问题,因为即使两个链接指向完全相同的内容,搜索引擎也会将它们视为您网站上的不同页面——即所谓的“重复内容”问题。关于它的更多信息在这里:
https://support.google.com/webmasters/answer/66359?hl=en
那么,我们如何解决这个问题呢?
由于 OpenCart 中没有解决此问题的设置,因此我们需要亲自动手并修改您商店中的一些代码。修改将作为 OCMOD 扩展进行,以避免更改您的核心文件。
注意:请记住,我们即将进行的更改可能会导致与您商店中的其他第三方扩展发生冲突。如果发生这种情况,请随意禁用修改以返回之前的行为。
注意:还请记住,这些修改是为 OpenCart 2.0.0.0 – 2.3.0.2 开发的。在我们更新此博文之前,它们可能与较新的版本不兼容。
第 1 步 – 准备文件。
事不宜迟,让我们开始吧!使用您最喜欢的文本编辑器,创建一个名为duplicate_url_fix.ocmod.xml的新文件。
有几种方法可以解决重复问题。根据您的偏好,仅使用以下方法之一。
第 2 步,方法 1 – 修改商店以仅使用链接的短版本。
这将使 OpenCart 将所有 SEO 链接仅转换为一个单词(没有任何路径)。因此,所有指向子类别和产品的链接都将如下所示:
http://myshinystore.com/child_category(而不是http://myshinystore.com/parent_category/child_category)
将以下内容添加到新创建的文件duplicate_url_fix.ocmod.xml中:
<?xml version=”1.0″ encoding=”UTF-8″?>
<modification>
<name><![CDATA[Duplicate Content Fix]]></name>
<code><![CDATA[duplicate_content_fix]]> </code>
<version><![CDATA[1.0]]></version>
<author><![CDATA[iSenseLabs]]></author>
<link><![CDATA[https://isenselabs. com]]></link>
<file path=”catalog/controller/*/seo_url.php”>
<operation>
<search><![CDATA[parse_str($url_info[‘query’], $data);] ]></search>
<add position=”after”><![CDATA[
$has_product_id = false;
$has_path = 假;
foreach ($data as $query_key => $query_value) {
if ($query_key == ‘product_id’ && !empty($data[‘route’]) && $data[‘route’] == ‘product/product’) {
$has_product_id = true;
}
if ($query_key == ‘path’) {
$has_path = true;
}
}
if ($has_product_id && $has_path) {
unset($data[‘path’]);
} else if (!$has_product_id && $has_path) {
$path_parts = explode(‘_’, $data[‘path’]);
$data[‘path’] = $path_parts[count($path_parts) – 1];
}
]]></add>
</operation>
</file>
</modification>
第 2 步,方法 2 – 修改商店以始终使用类别和产品的长链接版本。
这将使 OpenCart 将所有 SEO 链接转换为可能的最长路径。因此,所有指向子类别和产品的链接都将如下所示:
http://myshinystore.com/parent_category_1/parent_category_2/child_category (而不是http://myshinystore.com/child_category)
将以下内容添加到新创建的文件duplicate_url_fix.ocmod.xml中:
[CDATA[ $this->session->data[‘last.entered.category’] = $category_id; ]]></add> </操作>
</file>
<file path=”catalog/controller/*/seo_url.php”>
<operation>
<search><![CDATA[public function index() {]]></search>
<add position=”before “><![CDATA[
公共函数 findParentPath($category_id) {
$found_path = array($category_id);
do {
$category_result = $this->db->query(“SELECT * FROM ” . DB_PREFIX . “category WHERE category_id = ‘” . $category_id . “‘”);
$category_id = (int)$category_result->row[‘parent_id’];
array_unshift($found_path, $category_id);
}
} 而 ($category_id != 0);
返回$found_path;
}
]]></add>
</operation>
<operation>
<search><![CDATA[parse_str($url_info[‘query’], $data);]]></search>
<add position=”after “><![CDATA[
$has_product_id = false;
$has_path = 假;
foreach ($data as $query_key => $query_value) {
if ($query_key == ‘product_id’ && !empty($data[‘route’]) && $data[‘route’] == ‘product/product’) {
$has_product_id = $query_value;
未设置($data[‘product_id’]);// 我们稍后会设置它,因为我们需要 product_id 在路径之后。
}
if ($query_key == ‘path’) {
$has_path = true;
}
}
// 计算完整路径
$parent_categories_paths = array();
if ($has_product_id !== false) {
// 根据product_id查找真实路径
$parent_categories_result = $this->db->query(“SELECT * FROM ” . DB_PREFIX . “product_to_category WHERE product_id='” . (int)$has_product_id . “‘”);
foreach ($parent_categories_result->rows as $parent_category) {
$parent_categories_paths[] = $this->findParentPath($parent_category[‘category_id’]);
}
} else if ($has_path) {
// 根据最后一个 category_id 找到真正的路径
$path_parts = explode(‘_’, $data[‘path’]);
$category_id = $path_parts[count($path_parts) – 1];
$parent_categories_paths[] = $this->findParentPath($category_id);
}
if (!empty($parent_categories_paths)) {
$last_entered_category = !empty($this->session->data[‘last.entered.category’]) ?(int)$this->session->data[‘last.entered.category’] : 0;
$data[‘path’] = implode(‘_’, $parent_categories_paths[0]);
$has_path = 真;
foreach ($parent_categories_paths as $parent_categories_path_candidate) {
if (in_array($last_entered_category, $parent_categories_path_candidate)) {
$data[‘path’] = implode(‘_’, $parent_categories_path_candidate);
休息;
}
}
}
if ($has_product_id !== false) {
$data[‘product_id’] = $has_product_id;
}
]]></add>
</operation>
</file>
</modification>
第 2 步,方法 3 – 修改商店以始终使用类别链接的长版本和产品的短链接。
这将使 OpenCart 将所有类别的 SEO 链接转换为可能的最长路径。产品的 SEO 链接将转换为可能的最短路径。
因此,所有指向子类别的链接都像这样:
http://myshinystore.com/parent_category_1/parent_category_2/child_category ( 而不是 http://myshinystore.com/child_category)
…所有产品链接将如下所示:
http://myshinystore.com/product_seo_url
将以下内容添加到新创建的文件 duplicate_url_fix.ocmod.xml中:
[CDATA[ $this->session->data[‘last.entered.category’] = $category_id; ]]></add> </操作>
</file>
<file path=”catalog/controller/*/seo_url.php”>
<operation>
<search><![CDATA[public function index() {]]></search>
<add position=”before “><![CDATA[
公共函数 findParentPath($category_id) {
$found_path = array($category_id);
do {
$category_result = $this->db->query(“SELECT * FROM ” . DB_PREFIX . “category WHERE category_id = ‘” . $category_id . “‘”);
$category_id = (int)$category_result->row[‘parent_id’];
array_unshift($found_path, $category_id);
}
} 而 ($category_id != 0);
返回$found_path;
}
]]></add>
</operation>
<operation>
<search><![CDATA[parse_str($url_info[‘query’], $data);]]></search>
<add position=”after “><![CDATA[
$has_product_id = false;
$has_path = 假;
foreach ($data as $query_key => $query_value) {
if ($query_key == ‘product_id’ && !empty($data[‘route’]) && $data[‘route’] == ‘product/product’) {
$has_product_id = $query_value;
未设置($data[‘product_id’]);// 我们稍后会设置它,因为我们需要 product_id 在路径之后。
}
if ($query_key == ‘path’) {
$has_path = true;
}
}
// 计算完整路径
$parent_categories_paths = array();
if ($has_product_id !== false) {
// 取消设置路径和制造商id,因为有product_id
unset($data[‘path’]);
未设置($data[‘manufacturer_id’]);
} else if ($has_path) {
// 根据最后一个 category_id 找到真正的路径
$path_parts = explode(‘_’, $data[‘path’]);
$category_id = $path_parts[count($path_parts) – 1];
$parent_categories_paths[] = $this->findParentPath($category_id);
}
if (!empty($parent_categories_paths)) {
$last_entered_category = !empty($this->session->data[‘last.entered.category’]) ?(int)$this->session->data[‘last.entered.category’] : 0;
$data[‘path’] = implode(‘_’, $parent_categories_paths[0]);
$has_path = 真;
foreach ($parent_categories_paths as $parent_categories_path_candidate) {
if (in_array($last_entered_category, $parent_categories_path_candidate)) {
$data[‘path’] = implode(‘_’, $parent_categories_path_candidate);
休息;
}
}
}
if ($has_product_id !== false) {
$data[‘product_id’] = $has_product_id;
}
]]></add>
</operation>
</file>
</modification>
第 3 步 – 上传文件
差不多了。现在保存您的文件并使用 OpenCart Extension Installer 安装它。确保在上传文件后单击“管理”>“扩展”>“修改”中的“刷新”,以便应用更改。
而已!
恭喜!您所做的更改将有助于避免重复内容问题。请注意,这不是解决此问题的唯一方法 – 另一种完全不同的方法是在您的页面中使用规范 URL。可以在此处找到有关规范 URL 的更多信息:
https://support.google.com/webmasters/answer/139066
如果您想在您的网站中使用规范 URL,OpenCart 扩展商店中有一些现成的模块:
http://www.opencart.com/index.php?route=marketplace/extension&filter_search=canonical
我希望你发现上面的信息有用。如果您在下面的评论中有任何问题,请告诉我们。
注意:这篇文章最后一次更新是在 2016 年 10 月 25 日和 2017 年 7 月 17 日。