В посте Вывести самые продаваемые/популярные товары в Commerce предлагал альтернативный способ вывода популярных товаров, лишённый недостатков Views способа — поле у продукт дисплея с обновляемым по крону значением. Чтобы это реализовать нужно:
1. Добавить продукт дисплею числовое поле "Число покупок" с именем field_sales_count
.
2. Создать модуль с кодом:
/**
* Implements hook_cron().
*/
function MODULENAME_cron() {
if (variable_get('product_popularity_update_day') != date('d')) {
// Получаем все продукт-дисплеи
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node');
$query->propertyCondition('type', 'product_display');
$result = $query->execute();
if ($result) {
$field_sales_count_info = field_info_field('field_sales_count');
$fields = array($field_sales_count_info['id']);
// Обновляем значение поле field_sales_count без вызова entity_save()
// http://xandeadx.ru/blog/drupal/634
foreach ($result['node'] as $row) {
$node = (object)array(
'nid' => $row->nid,
'vid' => $row->vid,
'type' => 'product_display',
);
$node->field_sales_count['und'][0]['value'] = MODULENAME_get_product_display_sales_count($row->nid);
field_sql_storage_field_storage_write('node', $node, 'update', $fields);
}
cache_clear_all('field:node:', 'cache_field', TRUE);
}
variable_set('product_popularity_update_day', date('d'));
watchdog('modulename', 'Product popularity updated.');
}
}
/**
* http://xandeadx.ru/blog/drupal/804
*/
function MODULENAME_get_product_display_sales_count($product_display_nid) {
$query = db_select('node', 'n');
$query->addExpression('COUNT(*)');
$query->innerJoin('field_data_field_product', 'ffp', 'ffp.entity_id = n.nid');
$query->innerJoin('field_data_commerce_product', 'fcp', 'fcp.commerce_product_product_id = ffp.field_product_product_id');
$query->innerJoin('commerce_line_item', 'l', 'l.line_item_id = fcp.entity_id');
$query->innerJoin('commerce_order', 'o', 'o.order_id = l.order_id');
$query->condition('o.status', 'completed');
$query->condition('n.nid', $product_display_nid);
return $query->execute()->fetchField();
}
3. Сбросить кэш, запустить крон.
В MODULENAME_get_product_display_sales_count
можно добавить условие на дату заказа, чтобы например считать только заказы за последний месяц:
$query->condition('o.created', strtotime('-1 month'), '>');
По производительности — при 2000 товарах и 2000 заказов крон отрабатывает за 4-5 секунд. При значительно бОльших количествах или при необходимости использовать node_save()
(например для индексации в Search API) есть смысл переписать на Queue API.
Комментарии
Здравствуйте,
Создал view, отсортировал по полю field_sales_count.
Не подскажите как сделать разные выводы этой вьюхи: 1) за всё время 2) за месяц 3) за неделю?
Спасибо
создать три поля
Добавить комментарий