Автопарсинг и обновление цены в опенкарт


Недавно закончил работу над одним интересным заказом – парсинг + автоматическое обновление цен на опенкарт. Ну и управление всем этим в админке. По отдельности все эти задачи я решал не раз, а тут пришлось все собрать вместе и немного поработать напильником.

Парсинг

Как ни странно, тут это оказалась самая простая и по времени малозатратная задача. Пара доноров интернет-магазинов, без какой-либо защиты и понятной, легко читаемой версткой.



Подключаем не новую, но вполне рабочую еще библиотеку 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, opencart, парсинг, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Вывод данных PHP
Урок 12. Рендеринг диаграмм в приложениях Laravel
История одной и решение любой проблемы с сайтом