Magento 中的 URL 重写

已发表: 2014-09-11

对于所有网站来说,拥有友好的 URL 以服务于 SEO 目的至关重要。 然而,我们在 Magento 中创建它们并不总是那么容易,尤其是在您安装模块时。 作为非技术用户,我们如何解决这个问题? 我们为Magento 中的 URL 重写提供 2 个可行的解决方案,并根据需要创建适当的 URL。 你看这将不再是一个大问题。

热的!! Claue 2.0 版本已经发布

claue2_edited (1)

查看演示

Claue – Clean, Minimal Magento 2&1 Theme是现代和干净的电子商务商店的绝佳模板,具有 40 多种主页布局和大量商店、博客、投资组合、商店定位器布局和其他有用页面的选项。 Claue 版本 2. 0 带有一系列独家功能,包括:

  • 基于 Luma 主题。
  • 满足 Magento 主题的所有标准
  • 显着的性能提升
  • 与大多数第三方扩展兼容。
  • 与 Magento 2.4.x 完全兼容

第二个高级版本与之前的版本完全不同。 因此,如果您使用的是 Claue 版本 1 并想更新到 Claue 版本 2,则只能重建新网站,而不是从旧版本更新。 现在,让我们回到主题

在我们讨论这两种解决方案之前,我们将展示一个示例来描述如何创建默认 URL 以及进行一些修复的先决条件知识。 例如。 我们为 Blog 创建了一个名为 Blog 的模块,它的命名空间是 MGS,具有简单的字段为

ID 标题描述

在后端,当我们创建一个帖子时,我们需要插入两个字段,即。 标题和说明。 帖子的 ID 将自动生成。 为了显示博客的详细信息,我们依赖路由器(在文件 config.xml 中声明,我们声明了 blog)、控制器(我们命名为 index,因此它将是文件夹控制器中的文件 IndexControler.php)、操作(我们称为视图,文件 IndexControler.php 中的 viewAction 函数)和帖子的 id。

因此,前端帖子的默认 URL 将如下所示:

http://domain.com/blog/index/view/id/1 (1 是帖子的 ID)

就我们所见,这个 URL 完全不利于 SEO,应该将其重写为对 URL 友好。 回到主要目标,我们提出了 2 种创建 URL 友好的方法。 无论哪种方式,您都需要定义所需的 URL,或者您将遵循通用规则来创建 URL(通常我们将使用帖子的标题,将所有字符转换为正常样式,用 - 替换空格,例如标题“如何在 Magento 中重写 url ”将变为“ how-to-rewrite-url-in-magento。

在本文中,我们将使用 URL 定义方法,因此,我们将在上述数据库中添加一个字段来保存 URL。

ID 标题描述网址

因此,帖子的 URL 将被填写。

重写 URL 的第一种技术

使用 Magento 的 URL 重写功能,您可以在目录-> URL 重写管理中获得更多详细信息。

图片1

在那里你会发现 Magento 创建了一个模块来保存类别和产品的 URL 重写。 Magento 还允许您通过单击“添加 URL 重写”来添加 URL 重写以添加自定义 URL 重写:

目标路径:是帖子的 URL,例如。 博客/索引/视图/id/1

请求路径:是您将插入的 URL 重写,例如。 如何重写 url-in-magento.html

显然我们不会手动添加这些信息来保存 URL 重写。 相反,我们将利用核心模块的 url_rewrite 模型(Mage::getModel('core/url_rewrite'))在保存博客数据后将博客的 URL 保存在 core_url_rewrite 表中。

在博客中保存帖子后,使用以下代码保存 URL 重写:

Mage::getModel('core/url_rewrite')
    ->setIsSystem(true)
    ->setIdPath('blog/index/view/id/'.$blogId)
    ->setTargetPath('blog/index/view/id/'.$blogId)
    ->setRequestPath($url)
    ->save();

注意:$blogId 是保存后的博客 id,$url 是您定义的 URL。

需要提醒的是,上述命令适用于新帖子,如果要编辑现有帖子,则需要更新此记录。

重写 URL 的第二种技术

仍然采用上述博客模块和相同的数据字段,您在后端创建帖子,包括标题、描述、url 的足够数据。

转到 config.xml (app/code/local/MGS/Blog/etc)

在全局标签内:

<global>
…
</global>

添加以下代码

<events>
    <controller_front_init_routers>
        <observers>
            <blog_custom_router>
                <class>MGS_Blog_Controller_Router</class>
                <method>initControllerRouters</method>
           </blog_custom_router>
        </observers>
    </controller_front_init_routers>
</events>

app/code/local/MGS/Blog模块的主文件夹中,您将创建另一个名为 Controller 的文件夹,然后在其中创建一个名为Router.php的文件,其内容如下:

<?php
class MGS_Blog_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract
{
 /**
 * Initialize Controller Router
 *
 * @param Varien_Event_Observer $observer
 */
 public function initControllerRouters($observer)
 {
     /* @var $front Mage_Core_Controller_Varien_Front */
     $front = $observer->getEvent()->getFront();
     $front->addRouter('blog', $this);
 }
/**
 * Validate and Match Cms Page and modify request
 *
 * @param Zend_Controller_Request_Http $request
 * @return bool
 */
 public function match(Zend_Controller_Request_Http $request)
 {
     if (!Mage::isInstalled()) {
         Mage::app()->getFrontController()->getResponse()
         ->setRedirect(Mage::getUrl('install'))
         ->sendResponse();
         exit;
     }
     $identifier = trim($request->getPathInfo(), '/');
     $condition = new Varien_Object(array(
         'identifier' => $identifier,
         'continue' => true
     ));
if ($condition->getRedirectUrl()) {
     Mage::app()->getFrontController()->getResponse()
     ->setRedirect($condition->getRedirectUrl())
     ->sendResponse();
     $request->setDispatched(true);
     return true;
 }
if (!$condition->getContinue()) {
    return false;
 }

 $collection = Mage::getModel('blog/blog')
 ->getCollection();

 if(count($collection)>0){
     foreach($collection as $post){
         if($identifier == $post->getUrl()){
             $request->setModuleName('blog');
             $request->setControllerName('index');
             $request->setActionName('view');
             $request->setParam('id', $post->getId());
             return true;
         }
      }
    }
  }
}

上面这段代码的意思是:
例如,当您在浏览器中键入路径时:
http://domain.com/how-to-rewrite-url-in-magento。

该函数会将路径: how-to-rewrite-url-in-magento.html与博客数据表中的 url 进行比较
如果路径类似于数据库中任何记录的 URL 字段,则 4 个命令行:

$request->setModuleName('blog');
$request->setControllerName('index');
$request->setActionName('view');
$request->setParam('id', $post->getId());

将帮助系统理解 URL 对应于 router: blog, controler: index, action: view 和 id 是 URL 与浏览器中的路径相同的记录的 id。

例如。 记录具有 URL how-to-rewrite-url-in-magento.html 和 id 1,然后:

http://domain.com/how-to-rewrite-url-in-magento.html

对应于

http://domain.com/blog/index/view/id/1

这是我们推荐的两种解决方案,用于解决Magento中的 URL 友好问题。 我们希望它们对您有所帮助。 我们非常感谢您的评论和对文章的进一步贡献。

非常感谢您的时间!

Magesolution支持团队!