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支持團隊!