如何在OpenCart中重写自定义URL

在本教程的过程中,我们将详细介绍自定义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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值