在本教程的过程中,我们将详细介绍自定义SEO友好的URL。 这是开发自定义模块时应注意的重要方面,它也会影响整体搜索引擎排名。
我们将使用最新版本的OpenCart,因此请确保已安装该版本以遵循代码。
简而言之,我们要做什么
这是在OpenCart中实现自定义URL所需采取的步骤的摘要:
- 首先,我们需要了解它在核心中是如何工作的。
- 我们将介绍核心文件中所需的更改。
- 我们将快速浏览一下SQL查询以插入我们的自定义URL映射。
- 我们将介绍如何使用内置的重写功能。
因此,这就是接下来要发生的事情的快速浏览。 让我们继续第一个主题。
数据库中的URL映射
首先,重要的是要了解SEO URL在OpenCart核心中的工作方式。
继续并使用phpMyAdmin或类似工具浏览“ url_alias” MySQL表中的条目。 您会看到这样的映射。
product_id=48 ipod-classic
category_id=20 desktops
manufacturer_id=8 apple
information_id=6 delivery
这里有两个重要的列需要注意。 第一个是存储实际路径的查询列,另一个是关键字 ,它存储该URL的SEO别名。
如您所见,这里有不同实体的映射,例如产品,类别,信息和制造商。 每当将任何实体保存在OpenCart的后端中时,就会将关联的条目添加到该表中。
在前端,每当用户访问URL时,OpenCart就会从“ url_alias”表中找到相关的映射。 这样,实际实体将映射到SEO友好的URL。
继续打开文件catalog/controller/common/seo_url.php
,让我们从index
方法中探索以下代码片段。
public function index() {
// Add rewrite to url class
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
}
// Decode URL
if (isset($this->request->get['_route_'])) {
$parts = explode('/', $this->request->get['_route_']);
// remove any empty arrays from trailing
if (utf8_strlen(end($parts)) == 0) {
array_pop($parts);
}
foreach ($parts as $part) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");
if ($query->num_rows) {
$url = explode('=', $query->row['query']);
if ($url[0] == 'product_id') {
$this->request->get['product_id'] = $url[1];
}
if ($url[0] == 'category_id') {
if (!isset($this->request->get['path'])) {
$this->request->get['path'] = $url[1];
} else {
$this->request->get['path'] .= '_' . $url[1];
}
}
if ($url[0] == 'manufacturer_id') {
$this->request->get['manufacturer_id'] = $url[1];
}
if ($url[0] == 'information_id') {
$this->request->get['information_id'] = $url[1];
}
if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') {
$this->request->get['route'] = $query->row['query'];
}
} else {
$this->request->get['route'] = 'error/not_found';
break;
}
}
if (!isset($this->request->get['route'])) {
if (isset($this->request->get['product_id'])) {
$this->request->get['route'] = 'product/product';
} elseif (isset($this->request->get['path'])) {
$this->request->get['route'] = 'product/category';
} elseif (isset($this->request->get['manufacturer_id'])) {
$this->request->get['route'] = 'product/manufacturer/info';
} elseif (isset($this->request->get['information_id'])) {
$this->request->get['route'] = 'information/information';
}
}
if (isset($this->request->get['route'])) {
return new Action($this->request->get['route']);
}
}
}
如您所见,我们正在从“ url_alias”表中获取关联的条目。 之后,将解析查询参数并返回关联的内部路径。
因此,这就是它在核心中工作的方式。 不幸的是,该设置仅适用于核心URL,对于自定义URL,我们需要更改核心代码。 这就是我们下一部分的方法。
核心文件更改
继续并打开文件catalog/controller/common/seo_url.php
,并将rewrite
方法替换为以下方法。
public function rewrite($link) {
$url_info = parse_url(str_replace('&', '&', $link));
$url = '';
$data = array();
parse_str($url_info['query'], $data);
foreach ($data as $key => $value) {
if (isset($data['route'])) {
if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");
if ($query->num_rows && $query->row['keyword']) {
$url .= '/' . $query->row['keyword'];
unset($data[$key]);
}
} elseif ($key == 'path') {
$categories = explode('_', $value);
foreach ($categories as $category) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");
if ($query->num_rows && $query->row['keyword']) {
$url .= '/' . $query->row['keyword'];
} else {
$url = '';
break;
}
}
unset($data[$key]);
// OUR CUSTOM CODE
} else {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $data['route'] . "'");
if ($query->num_rows && $query->row['keyword']) {
$url .= '/' . $query->row['keyword'];
} else {
$url = '';
break;
}
}
// OUR CUSTOM CODE
}
}
if ($url) {
unset($data['route']);
$query = '';
if ($data) {
foreach ($data as $key => $value) {
$query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value);
}
if ($query) {
$query = '?' . str_replace('&', '&', trim($query, '&'));
}
}
return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
} else {
return $link;
}
}
rewrite
方法用于将内部URL转换为SEO友好的URL。 但这仅适用于内部URL。 因此,我们需要添加自定义代码以使其也适用于我们的自定义模块。 在代码更改中,我们提供了其他情况 ,该情况为我们的自定义模块加载了映射。 我们还没有添加自定义映射,因此让我们在下一部分中进行。
尽管我们直接修改了核心文件,但这只是为了简单起见。 您应该使用OCMOD来更改核心文件,而无需实际对其进行修改。
添加MySQL条目
在本部分中,我们将为自定义模块添加SEO URL映射。 同样,它只是出于示例目的的简单SQL,您可以使用模块安装脚本来实现。
INSERT INTO `url_alias` (`query`, `keyword`) VALUES ('custom/custom', 'custom-rewrite');
继续并在您的OpenCart数据库中运行它。
在下一节和最后一节中,我们将看到如何使用帮助器功能来生成SEO友好链接。
这个怎么运作
继续并使用以下内容创建一个新的文件catalog/controller/custom/custom.php
。
<?php
class ControllerCustomCustom extends Controller {
function index() {
$data['customlink'] = $this->url->link('custom/custom');
$this->response->setOutput('<a href="'.$data['customlink'].'">Custom URL Rewrite Link</a>');
}
}
现在,在前端中,打开URL http://www.yourstore.com/index.php?route=custom/custom 。
是的,这是一个只有一个链接的纯白色屏幕,这就是我们想要的。 这里要注意的重要一点是该链接的URL ,它现在对SEO友好! 单击该按钮,它将加载同一页面,因为我们已在“ url_alias”表中添加了该页面的映射。
因此,这就是以简单方式演示的整个概念。 您可以扩展它并制作模型以为自定义模块插入SEO友好链接。
结论
今天,我们已经讨论了OpenCart中的一个重要主题-自定义SEO友好URL。 我们采用了非常简单的方法来解释它,希望对您有用。
如果您正在寻找其他OpenCart工具,实用程序,扩展等,以便可以在自己的项目中使用或用于自己的教育,请不要忘记查看我们在市场上提供的产品 。
随时使用以下供稿发布您的查询和建议。
翻译自: https://code.tutsplus.com/tutorials/how-to-rewrite-custom-urls-in-opencart--cms-25734