2

我正在使用 Joomla 2.5,我想更改标题中的规范链接。我在类别视图中执行此操作(components/com_content/category/tmpl/default.php)

$url        = JURI::root();
$sch        = parse_url($url, PHP_URL_SCHEME);
$server     = parse_url($url, PHP_URL_HOST);
$canonical  = $this->escape($_SERVER['REQUEST_URI']);    
$document->addCustomTag('<link rel="canonical" href="'.$sch.'://'.$server.$canonical.'"/>');

它打印正确的规范,但也将旧的规范链接留在那里,因此我在标题中有 2 个规范链接。

如何更改或删除旧的规范链接?

4

2 回答 2

3

我发现以下内容适用于 Joomla!3.2.1。可以直接修改

$_links 

JHtmlDocument 对象中的变量。

我在我的组件的特定视图中执行以下子集,因为 Joomla! 提出来是不正确的。

希望这可以帮助。

    $document = JFactory::getDocument();
    foreach($document->_links as $key=> $value)
    {
        if(is_array($value))
        {
            if(array_key_exists('relation', $value))
            {
                if($value['relation'] == 'canonical')
                {                       
                    // we found the document link that contains the canonical url
                    // change it!
                    $canonicalUrl = 'http://www.something.com/index.php/component/my-component-name-here/?view=viewNameHere&amp;parameterNameHere=parameterValueUsedInTheViewRightNow

                    $document->_links[$canonicalUrl] = $value;
                    unset($document->_links[$key]);
                    break;                      
                }
            }
        }
    }   
于 2014-01-27T06:44:48.990 回答
2

您可能想要做的是如下所示:

$doc_data = $document->getHeadData();
$url        = JURI::root();
$sch        = parse_url($url, PHP_URL_SCHEME);
$server     = parse_url($url, PHP_URL_HOST);
$canonical  = $this->escape($_SERVER['REQUEST_URI']); 
$newtag     = '<link rel="canonical" href="'.$sch.'://'.$server.$canonical.'"/>'

$replaced = false;
foreach ($doc_data['custom'] as $key=>$c) {
    if (strpos($c, 'rel="canonical"')!==FALSE) {
        $doc_data['custom'][$key] = $newtag;
        $replaced = true;
    }
}
if (!$replaced) {
    $doc_data['custom'][] = $newtag;
}

$document->setHeadData($doc_data);

这将从文档中获取所有当前的头部数据,包括您要替换的规范链接。它将搜索自定义集(我猜这将是),如果找到它,请将其替换为您的。如果它没有找到它,那么它会在最后加上它。以防万一。

我可以立即看到的潜在问题:

  1. 如果标签包含rel='canonical'单引号,则找不到,因此您可能需要对其进行调整。
  2. 标签可能被放置在我所说的不同部分$doc_data。您可能需要var_dump($doc_data};确认变量在此数组中的位置。
于 2013-02-08T16:01:14.430 回答