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));