Свое описание препаратов для шопов Glavmed by Fred
Glavmed 9 ноября, 2009
1. Причины написания.
Главная причина – необходимость выразить благодарность Лаки за проделанную работу. Статьи его реально сэкономили мне время, может и мой опус кому-нибудь пригодится.
2. Задача.
Необходимо сделать добавление контента в описание препаратов на движке SE2 главмеда. Способ правки шаблонов работает, но он несколько прямолинеен и не универсален.
3. Теория.
Как известно (или неизвестно), все (т.е. абсолютно ВСЕ) данные по продаваемым лекарствам в главмедовском движке хранятся в виде XML файла. Насколько я успел разобраться (вникать особенно времени не было, поэтому поправлять меня можно и нужно), при установке движка, а также при выполнении операции ?xmlupdate через браузер происходит следующее:
- каждый препарат или группа препаратов, которые хранятся в файле data/data.xml извлекаются, преобразуются в ассоциативный массив;
- полученный массив сериализуется;
- сериализованный массив сохраняется в папке data с именем item.{ID}.ser или items_in_group.{ID}.ser.
Далее при работе движка обращение за данными по препарату или группе препаратов идет по id препарата или id группы соответственно к файлу item.{ID}.ser или items_in_group.{ID}.ser. Пытливый читатель спросит, что такое child.{ID}.ser, я отвечу так: это данные по подгруппам для тех препаратов, у которых есть несколько вариантов расфасовки.
4. Главная идея.
Мне не хочется лезть в шаблон каждый раз, когда у меня появляется новый, заказанный у Лаки
контент для очередного препарата. С другой стороны, мне нельзя править ser файлы в движке главмеда, ибо они не переживут обновления каталога. В таких нечеловеческих условиях приходится работать.
Выход есть. Когда в движке некая функция получает массив значений для препарата или группы, мне нужно вставить проверку на наличие измененных данных. Если они есть в наличии – значит заменить данные на мои, если нет – ничего не менять. И уже после этого возвращать данные из функции.
5. Конкретика.
Для работы нам понадобится минимальное знание php и наличие сервера с этим самым php. Для начала возьмем любой из ser файлов и преобразуем его содержимое в массив. Далее делаем простой print_r и получаем примерно следующее:
Array
(
[id] => 188
[name] => Viagra
[packages] => Array
(
[0] => Array
(
[id] => 4730
[parent_id] => 188
[pills_count] => 30
[pills_type] => pills
[dosage] => 25
[dosage_type] => mg
[price] => 145.38
[price_per_item] => 4.85
[name] => 30 pills x 25 mg
[save_money] => 0
[per_type] => pill
)
[1] => Array
(
[id] => 4731
[parent_id] => 188
[pills_count] => 60
[pills_type] => pills
[dosage] => 25
[dosage_type] => mg
[price] => 217.13
[price_per_item] => 3.62
[name] => 60 pills x 25 mg
[save_money] => 74
[per_type] => pill
)
[!skip!]
[description] =>
[Drug_name] => Viagra (Sildenafil)
[Drug_Uses] => Viagra is used for treating erectile dysfunction (e.g. male impotence). It works by helping the blood flow into the penis to achieve and maintain an erection during sexual stimulation.
[How_Taken] => Viagra is to be taken 30 minutes to 1 hour before sexual activity. You may take it up to 4 hours before sexual activity. Viagra is not supposed to be taken more often than once per day.
[Drug_Class_and_Mechanism] => Viagra is a phosphodiesterase type 5 inhibitor and it works by helping the blood flow into the penis to achieve and maintain an erection during sexual stimulation.
<img src="/img/viagra.jpg" alt="" />
<img src="/img/viagra_3d.jpg" alt="" />
[Missed_Dose] => Viagra is to be
[!skip!]
[bundle] =>
[price_per_item] => 2.09
[min_price_child_id] => 4735
[sprice_per_item] => 3.97
[group] => Array
(
[name] => Men's Health
[id] => 57
)
)Пропустить пришлось очень многое, потому как, повторюсь, тут хранится ВСЯ информация о препарате, включая описания на нескольких языках. На всякий случай приведу секретный код для получения всего массива:
<?php $str = file_get_contents('data/item.188.ser'); $ar = unserialize($str); print_r($ar); ?>
Для чего это надо? Исключительно для того, чтобы видеть индексы в массиве именно того текста, который мы хотим изменить. Например, мы заказали у Лаки контент по препарату c id 188 (Viagra) и контент этот включает описание дозировки препарата.
Ищем прямо на странице главмедовского движка главмедовский текст, потом ищем его же в нашем массиве (который надо просматривать по F3 в браузере, он тогда удобнее для просмотра) и находим, например, ключ массива [Drug_Uses], для которого значение содержит искомый текст.
Отмечаем себе, что нам нужно будет изменить значение для $array['Drug_Uses'] и повторяем все шаги для остального контента.
Для определенности скажу, что я собираюсь менять следующие значения в массиве:
- [small_description]
- [Drug_Uses]
- [Missed_Dose]
- [Warnings_Precautions]
Наверное, нелишним будет указать, что порядок расположения не имеет никакого значения.
Идем дальше. Если опустить все лирические подробности, то файл, в котором вызывается ТА САМАЯ функция расположен в каталоге core и называется item_data.cls.php. И вот с этой самой минуты начинается очень тонкая работа.
6. ПРЕДУПРЕЖДЕНИЕ.
Далее идут советы по внесению изменений в ядро движка SE2. Все, что вы сделаете – вы сделаете своими руками на свой страх и риск. Если что-то перестанет работать, никто в этом не виноват и помощи ждать будет неоткуда. Я сказал.
7. Снова конкретика.
На самом деле все не так страшно, если вы понимаете простую вещь: резервная копия файла на создание потребует минуты, а сэкономить может часы. Поэтому копируем файл core/item_data.cls.php в core/item_data.cls.php.bck и начинаем “хирургию”.
Находим следующий код (у меня он на строке 289):
/* Читает данные из файла, сохраненые ранее в сериализованном виде
* @param $filename String Имя файла для сохранения
* @return Any Переменная сохраненая ранее.
*/
function load_data($filename){
global $SITE_ROOT;
if(file_exists($SITE_ROOT.'data/'.$filename.'.ser')){
$str = file_get_contents($SITE_ROOT.'data/'.$filename.'.ser');
return unserialize($str);
}
else{
return false;
}
}Заменяем его на следующий:
/* Читает данные из файла, сохраненые ранее в сериализованном виде
* @param $filename String Имя файла для сохранения
* @return Any Переменная сохраненая ранее.
*/
function load_data($filename){
global $SITE_ROOT;
if(file_exists($SITE_ROOT.'data/'.$filename.'.ser')){
$str = file_get_contents($SITE_ROOT.'data/'.$filename.'.ser');
$ar = unserialize($str);
if (file_exists($SITE_ROOT.'data/changed/'.$filename.'.ser')){
include_once ($SITE_ROOT.'data/changed/'.$filename.'.ser');
foreach ($changed as $key => $value){
$ar[$key] = $value;
}
}
return $ar;
}
else{
return false;
}
}и сохраняем.
Что необходимо знать. Во-первых, файлы с измененными значениями массива будут искаться в папке data/changed/ и названия их должны совпадать с названиями исходных файлов. Чуть подробнее объясню ниже. Во-вторых, эти файлы должны иметь строго оговоренную структуру, потому как проверку на валидность данных я не предусматриваю.
8. Порядок работы (в качестве резюме).
- В директории data создаем директорию changed.
- Делаем бекап файла core/item_data.cls.php и вносим в него изменения.
- Находим id препарата, данные которого необходимо изменить.
- Находим ключи массива, в которых хранятся данные, подлежащие изменению.
- Создаем в директории data/changed/ файл с именем item.{ID}.ser и в нем размещаем данные в следующем виде:
“Здесь измененный текст”,
“Drug_Uses” => “Здесь измененный текст”,
“Missed_Dose” => “Здесь измененный текст”,
“Warnings_Precautions” => “Здесь измененный текст”
);
?>
6. Идем на страницу сайта с описанием препарата и проверяем, что получилось.
9. TODO.
Я не предусматривал никакой фильтрации измененного контента. Т.е. не делается проверок на корректность текста, его размер, наличие специальных символов и т.д. Для моих целей вполне достаточно и того, что получилось. В принципе, вполне можно набросать скрипт, который будет автоматически создавать файлы для измененного контента, чтобы избежать ошибок. Но это уже другая история.
Оптимизация шопов Glavmed Part 4 + Бонус
Glavmed 20 июля, 2009
Add to cart
Сегодня повышал плотность ключевых слов на одном из шопов. Выражение Add to cart, которое выводится под каждым препаратом на главной из дефолтовых бестселлеров или же ваших препаратов, никак не позволяло мне добиться нужной плотности ключевых слов на главной шопа. Устранил проблему с часто повторяющимся выражением Add to Cart, поместив его в .jpg
Как сделал:
1. Ctrl+Print Screen, вырезал
, сохранил в .jpg *
2. Открыл /themes/моя тема/index.tpl
*По желанию можно не прятать текст Add to Cart в картинку, для скрытия бессмысленных повторов. Вместо Add to Cart пишем к примеру Order/Buy now, по вашему желанию и усмотрению, тем самым повышаем плотность по Buy и т.д
Нашел:
<div class="add"><img src="/themes/white2/img/bascket2.gif" border="0" alt="add to cart" align="absmiddle" /> <a href="{:se_module module=">{:$LANG_CONSTS.ADD_TO_CART:}</a></div>
Заменил на:
<div class="add"> <a href="{:se_module module="> <img src="/themes/white2/img/add.jpg" border="0" alt="add to cart" align="absmiddle" /></a></div>
Last Viewed Items
Если вы заметили, в блоке Last Viewed Items ссылки динамичесие, делаем их статическими следующим образом.
1. Открываем /themes/ваша тема/data/big_banner.tpl
2. Находим(29 строка):
<a href="/item.php?id={:$item.parent_id:}">{:$item.item_name:}</a>
3. Заменяем на:
<a href="{:se_module module=">{:$item.item_name:}</a>
На последок, специально для читателей моего блога выкладываю шаблон медицинской тематики, присутствует .PSD, хорошо подойдет для качественного фарма сателлита.
Скачать фарма шаблон
Вчера были в лесу, жарили мясцо. Фото вчерашней вкуснятины, приятного аппетита!
Понравилась статья!? Подпишись на RSS, будь в курсе оптимизации фарма шопов ведущих партнерок!
Теги: Glavmed 4
Статический Titile в шопах Glavmed.
Glavmed 17 июля, 2009
В дефолтовых шопах главмеда выводятся динамические тайтлы для всех страниц. Динамические тайтлы хороши при сливании трафика на шоп, но учитывая то, что я продвигаю шоп в SE, динамические тайтлы страниц меня не устраивают.
Приведу к примеру свой фарма шоп, который оптимизирован только под ED категорию. На главной странице шопа шесть бестселлеров ED, в категории Products всего 25 препаратов из дефолтовой категории Man’s Health, ко всему этому 4к оптимизированного контента под бестселлеры ED. Мне хотелось бы видеть на своем шопе статический тайтл, это же касается и других препаратов.
К примеру на странице с препаратом VPXL выводится следующий тайтл страницы: Special Offer: Phentrimine from $1.51 per pill. Почему бы нам не заменить данный динамический тайтл, на статический тайтл Buy VPXL Online?
Вспомним что в дефолтовом шопе главмеда 993 препарата, для каждого препарата писать статический тайтл не актуально. На форуме главмеда созданно очень много топиков по смене, уникализации тайтлов. Для того чтобы выводился свой статический тайтл на необходимых нам страницах, делаем следующее:
Открываем:
themes/ваша тема/data/header.tpl
заменяем стандартную форму вывода тайтла на:
<title> {:if $current_page == "index" || $current_page == "":} Great July Specials! Buy Tadalafil - $1.99 per pillZZ {:elseif $current_page == "item":} {:se_module module="item" action="item_data_by_ids" item_ids=$smarty.get.id type="small" fields="name" var_name="title_data":} Buy {:$title_data.name:} Online {:/if:} </title>
Где, {:if $current_page == “index” || $current_page == “”:}
Great July Specials! Buy Tadalafil – $1.99 per pillZZ – Статический тайтл для главной страницы.
И Buy {:$title_data.name:} Online, где {:$title_data.name:} – название препарата. После этого тайтлы на всех страницах с продуктами будут выводятся в таком виде: Buy название теблетки Online. Buy и Online можно заменить на желаемые, к примеру Order, Purchase и т.д
Таким образом можно создать статический тайтл для других страниц шопа. К примеру для создания статического тайтла для страницы All Products, мы добавим следующее условие в форму вывода тайтла:
{:if $current_page == “all_products” || $current_page == “”:}
New desk for All Products
Выглядеть должно примерно так:
<title> {:if $current_page == "index" || $current_page == "":} Great July Specials! Buy Tadalafil - $1.99 per pillZZ {:if $current_page == "all_products" || $current_page == "":} New desk for All Products {:elseif $current_page == "item":} {:se_module module="item" action="item_data_by_ids" item_ids=$smarty.get.id type="small" fields="name" var_name="title_data":} Buy {:$title_data.name:} Online {:/if:} </title>
Где New desk for All Products и будет нашим статическим тайтлом на странице All Products.
Надеюсь у вас все получится, если нет оставляйте комментарии, обязательно разберемся. Сеоблондинка взяла у меня интервью, у меня очень много измениний, в основном все в лучшую сторону. Я вернулся собственно, в ближайщие дни опубликую серию постов, в корторых обо всем и расскажу.
Понравилась статья!? Подпишись на RSS, будь в курсе оптимизации фарма шопов ведущих партнерок!
Glavmed – часть третья
Glavmed 18 марта, 2009
Кто не читал: Glavmed – часть первая, Glavmed – Часть вторая, советую прочитать перед началом прочтения третей части.
И так, вы зарегистрировались в Glavmed, установили шоп на свой хост. Что дальше!? Нам необходимо зарабатывать деньги, продавать пилюли. Я вижу два варианта:
- Сливать трафик на шоп доры, блоги, сплоги, сайты сателлиты и т.д
- Оптимизировать сайт и раскручивать его по ВЧ, СЧ, НЗ в SE.
Я выбрал второй вариант, оптимизации и продвижения шопа в поисковых системах. Ранее я писал, что выбрал движок SE2. Для продвижения в SE я постарался максимально его оптимизировать.
Что я сделал до написания третей части:
1. Написал robots.txt для SE2
# Еще добавил запрет на /?cv= выбор оплаты, так как он приведет робота к 4 языковым версиям шопа. Если не запретил бы, противоречил бы сам себе, так как до этого я запретил роботу индексировать сайт на других языках /?lng=X&cv=X
2. Добавил нужное количество оптимизированного текста на главную шопа.
Сейчас сделал еще пару важных моментов, которые будут мне необходимы для дальнейшей оптимизации, о которых я сегодня написал:
1. Количество отображаемых продуктов на главной шопа, и их замена на желаемые.
2. Свое описание продуктов.
3. Вывод одной категории продуктов в меню на главной, на примере ED
Многие зададутся вопросом, зачем все это делать!? Ведь многие продвигаю и так, и без robots.txt и так далее.
К примеру дефолтовый шоп состоит из 993 продуктов и Куевы тучи страниц. Представьте сколько веб мастеров работает с главмедом, сколько проиндексированных дефолтовых шопов в индексе SE!?
Я не решился на оптимизацию дефолтового шопа, а именно на оптимизацию 993 страниц с продуктами. Только задумался, сколько мне потребуется денег для перевода уникального контента, и маму я свою люблю.
Продвигать шоп, просто так с бухты-барахты считаю немного не разумно. Но если у вас есть постоянные продажи в отличии от меня, и вы не оптимизировали свой шоп, я искренне за вас РАД, желаю удачи, да побольше продаж!
Другое дело если лить траф на шоп, доров и так далее. Милое дело, в отличии от продвижения в SE!
Я создам пять шопов в главмеде, которые уверен в ближайшем будущем начнут радовать Лаки.
1. Шоп со всеми ED препаратам
2. Шоп со всеми Антидепрессантами
3. Шоп по Weight Loss
4 -5 Шопы будут содержать все 993 продукта.
Первые 3-и шопа разбиты по категориям как заметили. В каждом шопе будут отображены продукты данной категории. К примеру Weight Loss содержит 41 продукт, значит в шопе будет только 41 препарат. Вполне реально оптимизировать от А до Я. Под оптимизацией шопа от А до Я я подразумеваю: написание полного дескрипшина для каждого продукта, уникального контента, и всех действий которые я описывал в предыдущих постах о главмеде и блоге.
Возможно у вас возникнет вопрос: А если покупатель попадет на мой шоп по Weight Loss продуктам и захочет купить не Фентермин, а Ампицилин!? А его нет у меня в шопе, так как шоп заточен под Weight Loss препараты, засада, теряешь Лаки клиента!
Моё мнение: если я продвигаю шоп по Weight Loss, значит и трафик будет по Weight Loss продуктам. Помимо этого можно повесить привлекающие баннера основных аптек. Я не думаю что человек который хотел купить Амипицилин попадет с SE в мой шоп по Weight Loss.
Возвращаюсь к оптимизации:
1. Количество отображаемых продуктов на главной шопа, и их замена на желаемые.
Мне это было крайне необходимо, так как для шопов по категориям написан уникальный оптимизированный контент, соответственно и продукты из категории должны отображаться на главной соответствующие контенту. Перечитал форум, искал везде, не нашел. Начал пытаться сам, не получалось у меня с выводом желаемых препаратов на главную, вместо Bestseller-ов. Помог мне во всем Егор, суппорт Glavmed-а по SE2, за что ему большой респект.
Какие были сделаны изменения:
1. В конфиг файле _cnf/default.cnf.php добавлен параметр
$SDATA['INDEX_ITEMS'] = array(156,3739,3740,267); – #сюда добавляем ID продукта, который должен отобрадаться на главной шопа.
2. В core/modules/item.module.cls.php добавлена функция
function index_items(&$data){
global $SDATA;
if(array_key_exists(‘var_name’,$data)) $var_name = $data['var_name'];
$arr = $SDATA['INDEX_ITEMS'];
$this->core->smarty->assign($var_name,$arr);
return ”;
}
Благодоря этой функцие в теме themes/white2/index.tpl массив с ID вызывается стандартно
{:se_module module=”item” action=”index_items” var_name=”index_items”:}
Можете скачать этот архив, в нем 3-и измененых файла. Редактируем, настраиваем под себя. Заливаем и наслаждаемся. Вывод продуктов и их количесвто изменяем в конфиг файле “Пункт-1″.
Теперь есть возможность вывода нужных нам продуктов на главной в SE2, вместо вывода продуктов бестселлеров.
2. Свое описание для продуктов
У вас имеется в наличии свой уникальный, оптимизированный контент для продуктов. Чтобы изменить ввывод дескрипшина продукта можно отредактировать data.xml, но этого делать не стоить! При будующих обновлениях возникнет множество проблем.
Нам необходимо запретить ввывод стандартного дескрипшиона из data.xml и подключить свой дескпришн для нужного нам ID
Создаем к примеру папку в themes/ваша тема/desc #desc – ваша папка
Каждый продукт имеет свой ID. К примеру у таблетки Cialis ID=156. Создаем в нашей папке файл 156.tpl, в него копируем наш оптимизированный текст, сохраняем.
Открываем themes/ваша тема/intem.tpl находим:
<div id="informer1" class="text"> {:if $item_data.Drug_name != '':}<strong>{:$LANG_CONSTS.DRUG_NAME:}</strong>{:$item_data.Drug_name:} {:/if:} {:if $item_data.Drug_Uses != '':}<strong>{:$LANG_CONSTS.DRUG_USES:}</strong>{:$item_data.Drug_Uses:} {:/if:} {:if $item_data.How_Taken != '':}<strong>{:$LANG_CONSTS.HOW_TAKEN:}</strong>{:$item_data.How_Taken:} {:/if:} {:if $item_data.Drug_Class_and_Mechanism != '':}<strong>{:$LANG_CONSTS.DRUG_CLASS_AND_MECHANISM:}</strong>{:$item_data.Drug_Class_and_Mechanism:} {:/if:} {:if $item_data.Missed_Dose != '':}<strong>{:$LANG_CONSTS.MISSED_DOSE:}</strong>{:$item_data.Missed_Dose:} {:/if:} {:if $item_data.Storage != '':}<strong>{:$LANG_CONSTS.STORAGE:}</strong>{:$item_data.Storage:} {:/if:}</div>
Заменяем на:
<div id="informer1" class="text"> {:if $item_data.id==156:} {:include file="desc/`$item_data.id`.tpl":} {:else:} {:if $item_data.Drug_name !='':}<strong>{:$LANG_CONSTS.DRUG_NAME:}</strong>{:$item_data.Drug_name:} {:/if:} {:if $item_data.Drug_Uses != '':}<strong>{:$LANG_CONSTS.DRUG_USES:}</strong>{:$item_data.Drug_Uses:} {:/if:} {:if $item_data.How_Taken != '':}<strong>{:$LANG_CONSTS.HOW_TAKEN:}</strong>{:$item_data.How_Taken:} {:/if:} {:if $item_data.Drug_Class_and_Mechanism != '':}<strong>{:$LANG_CONSTS.DRUG_CLASS_AND_MECHANISM:}</strong>{:$item_data.Drug_Class_and_Mechanism:} {:/if:} {:if $item_data.Missed_Dose != '':}<strong>{:$LANG_CONSTS.MISSED_DOSE:}</strong>{:$item_data.Missed_Dose:} {:/if:} {:if $item_data.Storage != '':}<strong>{:$LANG_CONSTS.STORAGE:}</strong>{:$item_data.Storage:} {:/if:} {:/if:}</div>
{:if $item_data.id==156:} {:include file="desc/`$item_data.id`.tpl":}
Таким образом подключаем наш оптимизированный дескрипшин для ID-156 Cialis находящегося в папке themes/ваша-тема/desc/156.tpl
При переходе к препарату Cialis будет выводится содержание файла 156.tpl, в данном случае название файла 156.tpl и есть ID продукта. Каждый ID – разный продукт, разное описание
Как правильно перечислить несколько описаний для препаратов, как их правильно записать. Вторая строка:
{:if $item_data.id==156 or $item_data.id==XXX or $item_data.id==XXX:}$item_data.id==XXX, где XXX – ID товара, $item_data.id==XXX – повторяем необходимое количество раз.
3.Вывод одной категории продуктов в меню на главной, на примере ED
Я хочу отказаться от всех категорий с таблетками, мне необходима только одна категория с ED пилюлями в меню шопа, это необходимо для дальнейшей оптимизации и продвижения шопа в SE. Чтобы удалить все категории с шопа и оставить к примеру только категорию с ED открываем:
themes/ваша тема/modules/navigation_main.module.cls.php
Удаляем всё, и вставляем следующий код:
{:se_module module="item" action="group_data" group_id=152 var_name="b_group":} <div class="lmLinkGroup"> <a class="act" href="{:se_module module=">{:se_module module="langs" action="langGroup" group_id=152:}</a> {:foreach name=items key=key item=item from=$b_group.items:} {:if $item.bundle != true:} <div class="lmLinkItem"><a href="{:se_module module=">{:$item.name:}</a></div> {:/if:} {:/foreach:}</div>
Таким образом у нас на главной будет отображаться только раздел ED.
Надеюсь данная статья будет полезна вам, жду ваших комментариев!
Еще оформил патч устраняющий проблему c register_globals при установке Osc
Теги: Glavmed 3




