opencart从admin中获取产品seo url

时间:2013-11-27 15:00:15

标签: php opencart

我正在扩展时事通讯区域,以便我可以发送一封包含产品列表的电子邮件,但我找不到如何获取每种产品的搜索引擎优化网址?

当我这样做时,我实际上最终得到了管理员网址。

$this->url->link('product/product', 'product_id=' . $row['product_id'])

商店前端的相同代码工作正常并返回seo url(如果存在)。

我可以让它工作的唯一方法是我手动构建URL,显然没有seo url。

HTTP_CATALOG .'index.php?route=product/product&product_id='.$row['product_id']

进一步研究我发现管理区域缺少以下代码,但我无法弄清楚它是如何工作的,并与$this->url->link联系在一起,以便我可以修改它以适合我。< / p>

$controller->addPreAction(new Action('common/seo_url'));    

更新 - 最后最简单的解决方案就是添加我自己的方法:

public function getUrl($route, $key, $value){
    $url = "index.php?route={$route}&{$key}={$value}";

    if($this->config->get('config_seo_url')){
        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");        
        if($query->row['keyword']){
            $url = $query->row['keyword'];
        } 
    } 

    return $url;
}

3 个答案:

答案 0 :(得分:7)

前端链接

从管理区创建前端链接而不修改核心文件的最佳方法是创建自己的URL对象:

$url = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTP_CATALOG : HTTPS_CATALOG);

要创建网址,您可以使用$ url而不是$ this-&gt; url,所以您的示例将是:

$url->link('product/product', 'product_id=' . $row['product_id']);

SEO网址

获取SEO网址有点困难,不幸的是需要复制一些代码或一些躲避。

复制代码

基本上,从rewrite($link)复制整个catalog/controller/common/seo_url.php函数并将其添加到您正在创建的控制器类中。然后在上面提到的新$url行之后添加以下行:

$url->addRewrite($this);

然后将当前控制器用作重写器,并重写所有URL。您可能可以使用单独的类,但是有依赖项可以访问数据库。这似乎是最直接的方式,即使它很难看。

您的代码应为:

<?php
class ControllerMyController extends Controller {
  public function index() {
    ...
    $url = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTP_CATALOG : HTTPS_CATALOG);
    if ($this->config->get('config_seo_url')) {
      $url->addRewrite($this);
    }
    $url->link('product/product', 'product_id=' . $row['product_id']);
    ...
  }

  public function rewrite($link) {
    ... [stuff from seo_url.php] ...
  }
}

您将从管理区域获取SEO的网址。

Bodging

如果您对任意require语句感到满意,那么您可以选择执行以下操作并使用现有的SEO代码(这意味着如果它发生变化,它将保持最新状态,但是会如果文件移动则失败。)

要以这种方式创建SEO URL,您的代码必须是:

            $url = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTP_CATALOG : HTTPS_CATALOG);
            if ($this->config->get('config_seo_url')) {
                    // Require the SEO file directly - path is relative to /admin/index.php
                    require_once('../catalog/controller/common/seo_url.php');
                    $rewriter = new ControllerCommonSeoUrl($this->registry);
                    $url->addRewrite($rewriter);
            }
            $url->link('product/product', 'product_id=' . $row['product_id']);

答案 1 :(得分:1)

管理部分不需要 preAction 用于SEO,因为管理中没有SEO链接。

您遇到的问题是因为在前端,常量HTTP[S]_SERVER指向http[s]://mydomain.com/,同时管理相同的常量点http[s]://mydomain.com/admin/

您要查找的内容可能是url类(system/library/url.php)的修改,并通过复制frontend_link方法并替换link来添加新方法HTTP[S]_SERVER方法体中的常量HTTP[S]_CATALOG常量仅存在于管理中...

答案 2 :(得分:0)

对@IBBoard 提供的非常有用的答案进行一些扩展:在 Opencart 3.0.2 及更高版本中,seo_url.php 不再位于目录/公共文件夹中。它已移至目录/启动。

另外,强烈建议通过opencart的修改功能运行require_once语句中的文件名,例如:

require_once modification(DIR_CATALOG . 'controller/startup/seo_url.php');