По умолчанию бестселлеры сортируются по общему количеству проданных товаров за все время.
При чем если пришел клиент и купил сразу 100000 лейкопластырей, они могут зависнуть в бестселлерах на несколько месяцев.
Кому как, возможно в разных тематиках по разному, но считаю такой подход не верным.
Бестселлеры должны считаться за некоторый период времени (допустим последние 2 недели). Плюс, количество купленное в одном заказе (т. е. одним человеком), не должно влиять на популярность этого товара (должен влиять только сам факт продажи).
Потому написал для себя такой плагин (это две разные версии).
Учитывать только продажи за последние 14 дней:
function onBeforeQueryGetProductList($type, &$adv_result, &$adv_from, &$adv_query, &$order_query, &$filters){
if ($type=="bestseller_products"){
$adv_from .= "LEFT JOIN `#__jshopping_orders` AS orders ON OI.order_id = orders.order_id";
$adv_query .= " AND orders.order_date > '" . date("Y-m-d", mktime(0, 0, 0, date("m"), date("d")-14, date("Y"))). "' ";
}
}
Учитывать только продажи за последние 14 дней + не учитывать количество в заказе.
Чтобы не трогать исходник, пришлось вынести весь метод в onBeforeDisplayProductListView.
function onBeforeDisplayProductListView(&$view){
$count = 3;
$tProduct = JTable::getInstance('product', 'jshop');
$adv_result = $tProduct->getBuildQueryListProductDefaultResult();
$adv_query = "";
$adv_from = "";
//Get bestsellers
if (JRequest::getInt('category_id')){
$jshopConfig = JSFactory::getConfig();
$db = JFactory::getDBO();
$array_categories = JRequest::getInt('category_id');
$filters = array();
$tProduct->getBuildQueryListProductSimpleList("best", $array_categories, $filters, $adv_query, $adv_from, $adv_result);
$adv_from .= "LEFT JOIN `#__jshopping_orders` AS orders ON OI.order_id = orders.order_id";
$adv_query .= " AND orders.order_date > '" . date("Y-m-d", mktime(0, 0, 0, date("m"), date("d")-14, date("Y"))). "' ";
$query = "SELECT SUM(1) as max_num, $adv_result FROM #__jshopping_order_item AS OI
INNER JOIN `#__jshopping_products` AS prod ON prod.product_id=OI.product_id
INNER JOIN `#__jshopping_products_to_categories` AS pr_cat ON pr_cat.product_id = prod.product_id
LEFT JOIN `#__jshopping_categories` AS cat ON pr_cat.category_id = cat.category_id
$adv_from
WHERE prod.product_publish = '1' AND cat.category_publish='1' ".$adv_query."
GROUP BY prod.product_id
ORDER BY max_num desc LIMIT ".$count;
$db->setQuery($query);
$bestsellers = $db->loadObjectList();
$bestsellers = listProductUpdateData($bestsellers);
$view->assign('bestsellers', $bestsellers);
}
}
p. s. на самом деле выкладываю, чтобы более толковые люди проверили и, возможно, подсказали более правильное решение
