Как добавить канонический тег на страницы, полученные по одной и той же ссылке?

Я использую симфони 1.0.6.

На моем сайте у меня есть два URL-адреса.

http://newe4s.com/news/articles/view/033/job-news-and-information

а также

http://newe4s.com/news/articles/view/033/job-news-and-information/graduate/Connections-help-graduates-get-jobs

Теперь все новые статьи используют один и тот же макет, и обе приведенные выше ссылки получают одни и те же данные из базы данных. Google сообщает о дублировании контента, поскольку он получает несколько URL-адресов для одного и того же контента. Когда я искал решение, я понял, что использование «канонической» структуры устраняет эту проблему, которая требует

<link rel="canonical" href="http://newe4s.com/news/articles/view/033/job-news-and-information />

добавить в шапку страницы

http://newe4s.com/news/articles/view/033/job-news-and-information/graduate/Connections-help-graduates-get-jobs

Но проблема здесь в том, что оба используют один и тот же макет и на основе идентификатора статьи (033 в приведенном выше примере), данные извлекаются и отображаются. Я не могу изменить или жестко запрограммировать канонический href.

Есть ли способы добавить тег ссылки вручную в action.class или в файл шаблона?


person Manoj H    schedule 08.06.2012    source источник


Ответы (3)


Согласно старому тикету (на основе старая ветка на старом форуме symfony) - какой пункт до конечного источника, вы можете легко создать помощник, который добавит тег ссылки на вашу страницу (например, /lib/helper/CanonicalHelper.php ):

/**
* Add link tag to slot 'links'
*
* @param String $href [Absolute or internat URI]
* @param String $rel [value for 'rel' attribtue, e.g. 'canonical']
*
* @return void
*/
function add_link($href, $rel)
{
  $slot = get_slot('links');

  try {
    $href = url_for($href, true);
    $slot .= "\n<link rel=\"$rel\" href=\"$href\" />";
  } catch (InvalidArgumentException $e) {
    $slot .= "\n<!-- Could not add Link '$href': Only absolute or internal URIs allowed -->";
  }

  slot('links', $slot);
}

Затем вы можете вызвать его в своем шаблоне:

<?php add_link(
  'http://newe4s.com/news/articles/view/033/job-news-and-information',
  'canonical'
); ?>

Наконец, не забудьте добавить слот в layout.php:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Title</title>
    <link rel="shortcut icon" href="/favicon.ico" />
    <?php include_javascripts() ?>
    <?php include_stylesheets() ?>
    <?php include_slot('links'); ?>
  </head>

Если вы хотите добавить его из actions, это также определено в сообщении блога.

изменить:

Если вы создаете помощника с именем CanonicalHelper.php, не забудьте включить его, когда хотите использовать функцию add_link:

<?php use_helper('Canonical') ?>
person j0k    schedule 08.06.2012
comment
Привет, я создал помощника в /lib/symfony/helper как CanonicaHelper.php, и я вставил в него код, содержащий add_link. Затем в шаблоне я вызвал функцию add_link() и добавил include_slot('links') в layout.php. Должен ли я переименовать include_slot('links') в include_slot('Canonical').... Я пробовал в обоих случаях. это не работает - person Manoj H; 11.06.2012
comment
Привет, я не мог правильно опубликовать свой код в поле для комментариев. Итак, я ответил на свой вопрос. Пожалуйста, дайте мне знать, если это правильно. - person Manoj H; 11.06.2012

Симфония 1.0.11

Важной частью является slot('links') и end_slot(), поэтому любая печать между ними будет назначена слоту, аналогичному ob_start и ob_end().

function add_link($href, $rel)
   {
      slot('links');
      echo "\n<link rel=\"$rel\" href=\"$href\" />\n";
      end_slot();
   }
person Ani    schedule 18.06.2015

Привет, я делаю, как показано ниже, и, пожалуйста, дайте мне знать, прав я или нет.

В /lib/symfony/CanonicalHelper.php

<?php 
function add_link($href, $rel)
{
 $slot = get_slot('links');
 try {
  $href = url_for($href, true);
  $slot.= "\n<link rel=\"$rel\" href=\"$href\" />";
 }
 catch (InvalidArgumentException $e) {
 $slot.= "\n<!-- Could not add Link '$href': Only absolute or internal URIs allowed   -->";
}
 return $slot;
}
?>

В layout.php:

<?php include_slot('links'); ?>

В файле успеха:

<?php use_helper('Canonical');?>
<?php echo add_link('nonsense', 'canonical');?>
person Manoj H    schedule 11.06.2012
comment
Вы поместили помощника не в ту папку. Переместите файл CanonicalHelper.php в /lib/helper/ (если вспомогательная папка не существует, создайте его). - person j0k; 11.06.2012
comment
Мне очень жаль .. Это была опечатка .. :) это только во вспомогательном каталоге. Кроме того, все думают, что все в порядке .. Большое спасибо ... :) - person Manoj H; 11.06.2012
comment
эй ... Мне очень жаль .. Я всегда благодарен тебе, чувак ... Я только что принял свой собственный ответ, и это удалило твои предпочтения .. Я еще раз извиняюсь .. Я принимаю твой ответ .. - person Manoj H; 11.06.2012
comment
нет проблем, и я думаю, вы можете удалить свой ответ, так как это была просто опечатка;) - person j0k; 11.06.2012