Автопарсинг и обновление цены в опенкарт
Недавно закончил работу над одним интересным заказом – парсинг + автоматическое обновление цен на опенкарт. Ну и управление всем этим в админке. По отдельности все эти задачи я решал не раз, а тут пришлось все собрать вместе и немного поработать напильником.
Парсинг
Как ни странно, тут это оказалась самая простая и по времени малозатратная задача. Пара доноров интернет-магазинов, без какой-либо защиты и понятной, легко читаемой версткой.
Подключаем не новую, но вполне рабочую еще библиотеку simple html dom, скачиваем курлом через php, разбираем и получаем необходимые числа. Вот, например, для основной цены
include_once('simple_html_dom.php');
$price_current = $html->find('.price-current', 0);
if ($price_current){
$strong = $price_current->find('strong', 0);
if ($strong){
$txt = $strong->plaintext;
if ($txt){
$special_price = preg_replace("/[^0-9.]/",'',$txt);
}
}
}
Обновление цены opencart
У опенкарта актуальная цена товара хранится не только в основной таблице oc_product (поле price), но также может быть в таблице oc_product_special (акции) и в таблице oc_product_discount (скидки) – так что надо это всё учитывать.
В данном заказе заказчик не мудрствуя лукаво заказал менять обычную цену (если есть акция – то и цену по акции), а также две самых больших скидки, когда берешь товар оптом.
Вот, например, такая получилась функция для получения строки из таблицы для товара с самой низкой ценой:
function get_product_last_discount($product_id){
global $conn;
$product_last_discount = array();
$res = $conn->query("SELECT * FROM `oc_product_discount` WHERE `product_id` = '$product_id' ORDER BY price ASC LIMIT 1");
if ($res){
if ($row = $res->fetch_assoc()) {
$product_last_discount = $row;
}
}
return $product_last_discount;
}
Ну а дальше уже обновляем цену в базе данных. Естественно, что стоит предусмотреть, что цену от донора мы не получим и не выставлять нулевую.
База данных и админка
В базе данных мы создадим самую простую табличку oc_product_parser с полями id, product_id, href, last_update. А в админке в редактировании товара вкладку «Парсер цен конкурентов»
Тут не забудем обработать удаление добавление – рутина, обычный CRUD. Например, добавление ссылки для отслеживания
function insert_product_parser($product_id, $href){
global $conn;
$id = 0;
$stmt = $conn->prepare("INSERT INTO `oc_product_parser` (`product_id`, `href`)
VALUES (?, ?)");
$stmt->bind_param("is", $product_id, $href);
if ($stmt->execute()) {
$id = $conn->insert_id;
}
$stmt->close();
return $id;
}
Получение всех ссылок отслеживания для конкретного товара в контроллере admin\controller\catalog\product.php
$data['parser'] = array();
$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "product_parser` WHERE product_id = '" . $this->request->get['product_id'] . "'");
foreach ($query->rows as $ress) {
$data['parser'][] = $ress;
}
Пара замечаний
Само обновление запускается по крону, каждую минуту. Так как товар не один и не два, то лучше не переусердствовать и за один раз обновлять не больше нескольких. А сам обновление делать не очень часто – например, раз в час. Платные консультации по парсингу и интеграции с опенкарт - недорого, пишите по любым контактам.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты