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)

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

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

  1. Екатерина 28 августа 2017, 19:59(Комментарий был изменён)
    0 #

    Добавила для информации НЕ через phpmyadmin последний шаг — вышла ошибка в админке, данные не отображаются на сайте (статьи).
    В phpmaadmin у меня нет information_description
    но есть: blog_description
    а там, вот что: joxi.ru/V2VLx4zSxDqYyr не та кодировка (utf8_bin)
    боюсь что либо трогать, так как не знаю, были ли эти таблицы или они появились после того как я заменила код
    if ($information_info) {
    $this->document->setTitle($information_info['title']);
    на ваш в /catalog/controller/information/information.php

    Для каталога добавляла через phpmyadmin и все ОК

    Что делать?(((( Подскажите, пожалуйста…

    1. Владимир 28 августа 2017, 20:15
      0 #

      information_description и blog_description — совсем разное. таблица information_description стандартная, должна быть.

      1. Екатерина 28 августа 2017, 20:23
        0 #

        Точно, нашла.
        joxi.ru/1A5xqdDun7JvP2 вот что у нее внутри. Нужно ли создавать meta_title еще?

        1. Владимир 28 августа 2017, 20:24
          0 #

          да, все как и для категорий

          1. Екатерина 28 августа 2017, 20:31(Комментарий был изменён)
            0 #

            Добавила, ошибка из админки изчезла, но страницы не доступны из раздала Статьи.
            Сейчас выглядит так содержимое: joxi.ru/4AkoV5NHynlYWA

            1. Владимир 28 августа 2017, 20:44(Комментарий был изменён)
              0 #

              Раздел статьи — это в админке, или на сайте? В БД все верно

              1. Екатерина 28 августа 2017, 20:53(Комментарий был изменён)
                0 #

                В общем, я заменила опять на старый код (последний шаг в инструкции) и статьи заработали. Кроме одной.
                У нас была сложная страница, она правилась через несколько статей через админку.
                Вот она не доступна на сайте (в админке есть). Браузер пишет, что страница не найдена (типо 404). Меню, шапке есть, но самой стр нет.

                1. Владимир 28 августа 2017, 20:56
                  0 #

                  нужно посмотреть соответствует ли URL статьи ссылке в меню (там вообще может быть ссылка проставленная прямо в шаблоне) и включена ли эта статья.

                  1. Екатерина 28 августа 2017, 20:58(Комментарий был изменён)
                    0 #

                    ссылка та, которая нужна: сайт.ру/dostavka
                    ошибка 404 — стр не найдена…
                    А что значит включена?

                    Статья состоит из других статей, они есть и ссылки которые указаны в админке работают (если по ним пройти), но сама страница была создана из этих страниц (сложный скрипт что ли, не знаю). И перестал работать…

                    1. Владимир 28 августа 2017, 21:03
                      0 #


                      Я вот про это

                      1. Екатерина 28 августа 2017, 21:05
                        0 #

                        А где это в админке?

                        1. Владимир 28 августа 2017, 21:06
                          0 #

                          Это в разделе «Статьи» в админке… там есть вообще статья «Доставка»? Может это вовсе категория блога (судя по всему у Вас есть для этого модуль)?

                          1. Екатерина 28 августа 2017, 21:08
                            0 #

                            Про модуль не знаю.
                            Отдельной статьи нет.
                            joxi.ru/E2p1YKGS9yxMWA вот это части доставки

                            1. Владимир 28 августа 2017, 21:53
                              0 #

                              Видимо страница «доставка» — модуль (что то вроде того) со списком статей. Рекомендую обратиться к разработчику, что бы подсказал куда смотреть, или поправил. Возможно был заменен seo_url, или seo_pro установлен… гадать можно долго

                              1. Екатерина 28 августа 2017, 23:24
                                0 #

                                Да, вы угадали: SeoPro

                                1. Екатерина 31 августа 2017, 17:56
                                  0 #

                                  Вы супер! Все работает!
                                  А будет продолжение для карточек товара? :-)

                                  1. Владимир 31 августа 2017, 18:09
                                    0 #

                                    В карточках только тайтла не хватает, да и то только в старых версиях, можно вполне сделать по аналогии с информацией

                                    1. Екатерина 31 августа 2017, 18:24
                                      0 #

                                      Я делала по аналогии с категорией — не получилось.
                                      Поле появилось в карточке, введенные данные сохраняются в админке, но не выводятся в браузере.

                                      1. Владимир 31 августа 2017, 19:54
                                        0 #

                                        посмотрите catalog/model/catalog/product.php, найдите 'name' => $query->row['name'], и по аналогии добавьте meta_title, если нет

                                        1. Екатерина 31 августа 2017, 20:08(Комментарий был изменён)
                                          0 #

                                          не помогло…

                                          Когда делаю этот шаг:

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

                                          $this->document->setTitle($product_info['name']);
                                          Меняем на:

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

                                          Сайт недоступен

                                          1. Владимир 31 августа 2017, 20:18
                                            0 #

                                            а в модель добавлено 'meta_title' => $query->row['meta_title'],? Нужно смотреть в логах где ошибка. Очень вероятно, что где то незакрытая скобка или ";"

                                            1. Екатерина 31 августа 2017, 20:31
                                              0 #

                                              Еще раз добавила, точно — не было запятой)))
                                              Спасибо!

          2. Игорь Чишкала 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 (тайтл)

                    С уважением.