Just a quick snippet of code today, it grabs all the products in a certain category (given in category_id), sorts them by age and stock availability (you can adjust the relative weighting of these using $stock_weight) and then updates the category. The end result is a nice mix of newer products, and products with loads of stock towards the top of the category, older / lower stocked products further down.
This uses the external database script access script from: here
I should probably bundle this up into an extension, with a cron job and so on but…. I’ll leave that as an exercise for the reader!
$category_id = 8; $stock_weight = 10; $sql = "select ccp.*, DATEDIFF(Now(),cpe.created_at) as age, (select sum(qty) from cataloginventory_stock_item as csi join catalog_product_super_link as cpsl on csi.product_id = cpsl.product_id where cpsl.parent_id = cpe.entity_id) as stock_qty, ((select DATEDIFF(Now(),MIN(created_at)) from catalog_product_entity) - (select age)) as age_factor, (select stock_qty) * $stock_weight as stock_factor, (select age_factor) + (select stock_factor) as sortby from catalog_category_product as ccp join catalog_product_entity as cpe on cpe.entity_id = ccp.product_id where ccp.category_id = $category_id and cpe.type_id = 'configurable' ORDER BY sortby DESC"; function build_query($results){ $update_sql = "Insert into catalog_category_product (`category_id`,`product_id`,`position`) VALUES "; $pos = 0; foreach($results as $result){ $pos++; $update_sql .= "('".$result['category_id']."','".$result['product_id']."','".$pos."'),"; } $update_sql = rtrim($update_sql,','); return $update_sql; } require_once "include/db.php"; $db = new db(); $results = $db->query($sql); $db->query("delete from catalog_category_product where category_id = $category_id"); $db->query(build_query($results));