Автопарсинг и обновление цены в опенкарт
Недавно закончил работу над одним интересным заказом – парсинг + автоматическое обновление цен на опенкарт. Ну и управление всем этим в админке. По отдельности все эти задачи я решал не раз, а тут пришлось все собрать вместе и немного поработать напильником.
Парсинг
Как ни странно, тут это оказалась самая простая и по времени малозатратная задача. Пара доноров интернет-магазинов, без какой-либо защиты и понятной, легко читаемой версткой.
Подключаем не новую, но вполне рабочую еще библиотеку 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.