Оценок: 1
Title, description и keywords для категорий и

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

Рассмотрим, как в cms Opencart 1.5.6 (должно подойти для версий до 2.0) добавить мета описание, ключевые слова для информационных страниц, а так же 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)

Оценок: 1

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

  1. Добрый день! Все встает, но не одна категория не отркывается потом, 500 ошибку выдает, что не так? Что может быть не так?

    Наталья 28 августа 2019, 15:19 0
    • А версия опенкарт какая?

      Владимир 28 августа 2019, 16:21 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 и все ОК

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

      Екатерина 28 августа 2017, 19:59 0
      • information_description и blog_description — совсем разное. таблица information_description стандартная, должна быть.

        Владимир 28 августа 2017, 20:15 0
        • Точно, нашла.
          joxi.ru/1A5xqdDun7JvP2 вот что у нее внутри. Нужно ли создавать meta_title еще?

          Екатерина 28 августа 2017, 20:23 0
          • да, все как и для категорий

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

              Екатерина 28 августа 2017, 20:31 0
              • Раздел статьи — это в админке, или на сайте? В БД все верно

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

                  Екатерина 28 августа 2017, 20:53 0
                  • нужно посмотреть соответствует ли URL статьи ссылке в меню (там вообще может быть ссылка проставленная прямо в шаблоне) и включена ли эта статья.

                    Владимир 28 августа 2017, 20:56 0
                    • ссылка та, которая нужна: сайт.ру/dostavka
                      ошибка 404 — стр не найдена…
                      А что значит включена?

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

                      Екатерина 28 августа 2017, 20:58 0

                      • Я вот про это

                        Владимир 28 августа 2017, 21:03 0
                        • А где это в админке?

                          Екатерина 28 августа 2017, 21:05 0
                          • Это в разделе «Статьи» в админке… там есть вообще статья «Доставка»? Может это вовсе категория блога (судя по всему у Вас есть для этого модуль)?

                            Владимир 28 августа 2017, 21:06 0
                            • Про модуль не знаю.
                              Отдельной статьи нет.
                              joxi.ru/E2p1YKGS9yxMWA вот это части доставки

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

                                Владимир 28 августа 2017, 21:53 0
                                • Да, вы угадали: SeoPro

                                  Екатерина 28 августа 2017, 23:24 0
                                  • Вы супер! Все работает!
                                    А будет продолжение для карточек товара? :-)

                                    Екатерина 31 августа 2017, 17:56 0
                                    • В карточках только тайтла не хватает, да и то только в старых версиях, можно вполне сделать по аналогии с информацией

                                      Владимир 31 августа 2017, 18:09 0
                                      • Я делала по аналогии с категорией — не получилось.
                                        Поле появилось в карточке, введенные данные сохраняются в админке, но не выводятся в браузере.

                                        Екатерина 31 августа 2017, 18:24 0
                                        • посмотрите catalog/model/catalog/product.php, найдите 'name' => $query->row['name'], и по аналогии добавьте meta_title, если нет

                                          Владимир 31 августа 2017, 19:54 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']);}

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

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

                                              Владимир 31 августа 2017, 20:18 0
                                              • Еще раз добавила, точно — не было запятой)))
                                                Спасибо!

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

              Игорь Чишкала 12 мая 2017, 13:10 0
              • А смысл если перевод не требуется? Зато чуть меньше кода

                Владимир 12 мая 2017, 14:22 0
              • Здравствуйте! Подскажите есть ли подобный способ выводить H1 в карточке товара? Я их заполняю, а в коде их нет. OcStore 2.1.x

                Лекс 03 июня 2016, 08:52 0
                • В самом последнем коде в последней строке фиг.скобочку закройте

                  Александр 25 декабря 2015, 12:05 0
                  • Хм… так все же верно — вверху — код который нужно заменить, там так же скобки закрывающей нет, дальше еще есть код внутри.

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

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

                    С уважением.

                    Андрей 02 июня 2014, 23:57 0
                    • Да, действительно. спасибо. Исправил, так же немного подправил изменения в контроллере каталога

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

                      Title (тайтл)

                      С уважением.

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