Рассмотрим, как в 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:
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']);
Добрый день! Все встает, но не одна категория не отркывается потом, 500 ошибку выдает, что не так? Что может быть не так?
А версия опенкарт какая?
Добавила для информации НЕ через 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 и все ОК
Что делать?(((( Подскажите, пожалуйста…
information_description и blog_description — совсем разное. таблица information_description стандартная, должна быть.
Точно, нашла.
joxi.ru/1A5xqdDun7JvP2 вот что у нее внутри. Нужно ли создавать meta_title еще?
да, все как и для категорий
Добавила, ошибка из админки изчезла, но страницы не доступны из раздала Статьи.
Сейчас выглядит так содержимое: joxi.ru/4AkoV5NHynlYWA
Раздел статьи — это в админке, или на сайте? В БД все верно
В общем, я заменила опять на старый код (последний шаг в инструкции) и статьи заработали. Кроме одной.
У нас была сложная страница, она правилась через несколько статей через админку.
Вот она не доступна на сайте (в админке есть). Браузер пишет, что страница не найдена (типо 404). Меню, шапке есть, но самой стр нет.
нужно посмотреть соответствует ли URL статьи ссылке в меню (там вообще может быть ссылка проставленная прямо в шаблоне) и включена ли эта статья.
ссылка та, которая нужна: сайт.ру/dostavka
ошибка 404 — стр не найдена…
А что значит включена?
Статья состоит из других статей, они есть и ссылки которые указаны в админке работают (если по ним пройти), но сама страница была создана из этих страниц (сложный скрипт что ли, не знаю). И перестал работать…
Я вот про это
А где это в админке?
Это в разделе «Статьи» в админке… там есть вообще статья «Доставка»? Может это вовсе категория блога (судя по всему у Вас есть для этого модуль)?
Про модуль не знаю.
Отдельной статьи нет.
joxi.ru/E2p1YKGS9yxMWA вот это части доставки
Видимо страница «доставка» — модуль (что то вроде того) со списком статей. Рекомендую обратиться к разработчику, что бы подсказал куда смотреть, или поправил. Возможно был заменен seo_url, или seo_pro установлен… гадать можно долго
Да, вы угадали: SeoPro
Вы супер! Все работает!
А будет продолжение для карточек товара? :-)
В карточках только тайтла не хватает, да и то только в старых версиях, можно вполне сделать по аналогии с информацией
Я делала по аналогии с категорией — не получилось.
Поле появилось в карточке, введенные данные сохраняются в админке, но не выводятся в браузере.
посмотрите catalog/model/catalog/product.php, найдите 'name' => $query->row['name'], и по аналогии добавьте meta_title, если нет
не помогло…
Когда делаю этот шаг:
Открываем "/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']);}
Сайт недоступен
а в модель добавлено 'meta_title' => $query->row['meta_title'],? Нужно смотреть в логах где ошибка. Очень вероятно, что где то незакрытая скобка или ";"
Еще раз добавила, точно — не было запятой)))
Спасибо!
Все круто в принципе, но почему языковые переменные проигнорировал? :)
Не гоже в Представлении писать Title (тайтл), это нужно через $this->language->get('bla-bla-bla');
А так молодец.
А смысл если перевод не требуется? Зато чуть меньше кода
Здравствуйте! Подскажите есть ли подобный способ выводить H1 в карточке товара? Я их заполняю, а в коде их нет. OcStore 2.1.x
В самом последнем коде в последней строке фиг.скобочку закройте
Хм… так все же верно — вверху — код который нужно заменить, там так же скобки закрывающей нет, дальше еще есть код внутри.
Здравствуйте.
Ваше решение у меня заработало только после мелких изменений, а именно - изменил "title" на "meta_title":
Часть 1, пункт 1 ( (/admin/view/template/catalog/category_form.tpl) ):
[quote]
С уважением.
Да, действительно. спасибо. Исправил, так же немного подправил изменения в контроллере каталога
Здравствуйте.
Ваше решение у меня заработало только после мелких изменений, а именно - изменил "title" на "meta_title":
Часть 1, пункт 1 ( (/admin/view/template/catalog/category_form.tpl) ):
С уважением.