Title, description и keywords для категорий и "информации"

Рассмотрим, как в cms Opencart добавить мета описание, ключевые слова для информационных страниц, а так же title для этих же страниц и страниц категорий. 

Для начала разберем страницу категории, т.к. ключевые слова и описание здесь уже есть. Так же есть и тайтл, который нужно заменить на альтернативный. 

Метатеги в Opencart выводятся через контроллер, в данном случае "/catalog/controller/product/category.php". Открываем файл и ищем здесь следующее:

if ($category_info) { $this->document->setTitle($category_info['name']); 
$this->document->setDescription($category_info['meta_description']);
 $this->document->setKeywords($category_info['meta_keyword']);
........

Пока что нас интересует только первое - Title. Изначально в тайтле дублируется название категории "name", соответственно что бы вывести в тайтл что-то другое, необходимо добавить возможность записать нужные данные в БД, а затем их вывести в контроллер. 

Часть 1 - админка. 

1. добавляем новое поле в шаблон формы категории (/admin/view/template/catalog/category_form.tpl) - находим:

<tr>
<td><?php echo $entry_meta_description; ?></td>
..........

И перед этим вставляем:

<tr>
 <td>Title (тайтл)</td>
<td><input type="text" name="category_description[<?php echo $language['language_id']; ?>][meta_title]" size="100" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['meta_title'] : ''; ?>" />
<?php if (isset($error_name[$language['language_id']])) { ?>
<span class="error"><?php echo $error_name[$language['language_id']]; ?></span>
<?php } ?></td>
</tr>

Поле есть, теперь необходимо добавить запись значений данного поля в БД и вывод обратно для редактирования, открываем "/admin/model/catalog/category.php"

2. Находим:

name = '" . $this->db->escape($value['name']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "',

Добавляем сюда:

meta_title = '" . $this->db->escape($value['meta_title']) . "',

Получаем:

name = '" . $this->db->escape($value['name']) . "',meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "',

Будет две в которых необходимо сделать данную замену, у меня это 13 и 67

Далее в этом же файле - "public function getCategoryDescriptions", после 

'name'             => $result['name'],

добавляем

'meta_title'             => $result['meta_title'],

​Теперь в админке появилось новое поле для добавления Title страницы категории, но при попытке сохранения данных в этом поле получим ошибку, т.к. нет соответствующего столбца в таблице БД. Добавить можно либо вручную, либо добавив запись в контроллере.

3.1. Добавляем вручную, через phpmyadmin:

скриншот из phpmyadmin

3.2. Во втором случае (если решили добавить вручную, это можно пропустить.. пару раз были ошибки с этим вариантом.. как-нибудь посмотрю в чем дело. лучше phpmyadmin), в "admin/controller/catalog/category.php" находим:

 

public function index() {

и сразу за открывающей скобкой добавляем:

$query = $this->db->query("DESC ".DB_PREFIX."category_description meta_title");
if (!$query->num_rows) {
$this->db->query("ALTER TABLE `" . DB_PREFIX . "category_description` ADD `meta_title` varchar(255) NOT NULL COMMENT '' COLLATE utf8_bin AFTER name;");
}

Это добавит соответствующий столбец при первом обращении к файлу, затем данную запись можно удалить. Теперь данные в поле "title" должны добавляться в БД.

Теперь осталось вывести тайтл в <head>

Часть 2 - сайт

Открываем "/catalog/controller/product/category.php", находим "if ($category_info) {" и далее: 

$this->document->setTitle($category_info['name']);

Меняем на:

if ($category_info['meta_title']) {
	$this->document->setTitle($category_info['meta_title']);
} else {
	$this->document->setTitle($category_info['name']);}

Теперь "информация". Делаем по аналогии.

Открываем "/admin/view/template/catalog/information_form.tpl", находим:

<tr>
<td><span class="required">*</span> <?php echo $entry_description; ?></td>
<td><textarea name="information_description[<?php echo $language['language_id']; ?>][description]" id="description<?php echo $language['language_id']; ?>"><?php echo isset($information_description[$language['language_id']]) ? $information_description[$language['language_id']]['description'] : ''; ?></textarea>
<?php if (isset($error_description[$language['language_id']])) { ?>
<span class="error"><?php echo $error_description[$language['language_id']]; ?></span>
<?php } ?></td>
</tr>

Сразу после добавляем:

<tr>
<td>Title (тайтл)</td>
<td><input type="text" name="information_description[<?php echo $language['language_id']; ?>][meta_title]" size="100" value="<?php echo isset($information_description[$language['language_id']]) ? $information_description[$language['language_id']]['meta_title'] : ''; ?>" />
<?php if (isset($error_name[$language['language_id']])) { ?>
<span class="error"><?php echo $error_name[$language['language_id']]; ?></span>
<?php } ?></td>
</tr>
<tr>
<td>Description (мета описание)</td>
<td><textarea name="information_description[<?php echo $language['language_id']; ?>][meta_description]" cols="40" rows="5"><?php echo isset($information_description[$language['language_id']]) ? $information_description[$language['language_id']]['meta_description'] : ''; ?></textarea></td>
</tr>
<tr>
<td>Keywords (Мета ключевые слова)</td>
<td><textarea name="information_description[<?php echo $language['language_id']; ?>][meta_keyword]" cols="40" rows="5"><?php echo isset($information_description[$language['language_id']]) ? $information_description[$language['language_id']]['meta_keyword'] : ''; ?></textarea></td>
</tr>

Открываем /admin/model/catalog/information.php, находим description = '" . $this->db->escape($value['description'])

Добавляем перед этим (в двух строках):

meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "',

Находим: 

'description' => $result['description']

добавляем до:

'meta_title'  => $result['meta_title'],
'meta_keyword'     => $result['meta_keyword'],
'meta_description' => $result['meta_description'],

Теперь добавим столбцы в таблицу information_description (по аналогии с тайтлом для категории) и вывод в контроллере - /catalog/controller/information/information.php, меняем:

if ($information_info) {
$this->document->setTitle($information_info['title']);

на

if ($information_info['meta_title']) {
$this->document->setTitle($information_info['meta_title']);
$title_cat = $information_info['meta_title'];
} else {
$title_cat = $information_info['name'];
}if ($information_info) {
$this->document->setTitle($title_cat);
$this->document->setDescription($information_info['meta_description']);
$this->document->setKeywords($information_info['meta_keyword']);

 

скачать (vqmod)

Добавить комментарий

Комментарии (8)

  1. Игорь Чишкала 12 мая 2017, 13:10
    0 #

    Все круто в принципе, но почему языковые переменные проигнорировал? :)
    Не гоже в Представлении писать Title (тайтл), это нужно через $this->language->get('bla-bla-bla');
    А так молодец.

    1. Владимир 12 мая 2017, 14:22
      0 #

      А смысл если перевод не требуется? Зато чуть меньше кода

    2. Лекс 03 июня 2016, 08:52
      0 #

      Здравствуйте! Подскажите есть ли подобный способ выводить H1 в карточке товара? Я их заполняю, а в коде их нет. OcStore 2.1.x

      1. Александр 25 декабря 2015, 12:05
        0 #

        В самом последнем коде в последней строке фиг.скобочку закройте

        1. Владимир 25 декабря 2015, 12:13(Комментарий был изменён)
          0 #

          Хм… так все же верно — вверху — код который нужно заменить, там так же скобки закрывающей нет, дальше еще есть код внутри.

        2. Андрей 02 июня 2014, 23:57
          0 #

          Здравствуйте.
          Ваше решение у меня заработало только после мелких изменений, а именно - изменил "title" на "meta_title":
          Часть 1, пункт 1 ( (/admin/view/template/catalog/category_form.tpl) ):

          [quote] Title (тайтл)[/quote]

          С уважением.

          1. Владимир 03 июня 2014, 06:34
            0 #

            Да, действительно. спасибо. Исправил, так же немного подправил изменения в контроллере каталога

          2. Андрей 02 июня 2014, 23:56
            0 #

            Здравствуйте.
            Ваше решение у меня заработало только после мелких изменений, а именно - изменил "title" на "meta_title":
            Часть 1, пункт 1 ( (/admin/view/template/catalog/category_form.tpl) ):

            Title (тайтл)

            С уважением.