По умолчанию фильтр сортирует подобные значение "до 2 м" > "до 1000 м" как строки
Проблема возникает из-за того, sql запрос "до 2м" + 0 возвращает 0
Задача найти блоки фильтра в которых все значения содержат числа и отсортировать их в правильном порядке
Написал скрипт, который находит фильтры имеющие только числовые значения и проставляет им необходимую сортировку
Перед тестирование скрипта делайте бекап таблицы oc_ocfilter_filter_value
function sort_ocfilter()
{
$pattern = '/\-?\d+([.,]\d+)?/';
$final_groups = [];
$groups = [];
$batchSize = 5500;
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "ocfilter_filter_value fv
LEFT JOIN " . DB_PREFIX . "ocfilter_filter_value_description fvd
ON (fv.value_id = fvd.value_id AND fv.source = fvd.source)
WHERE fvd.language_id = '" . (int)$this->config->get('config_language_id') . "'");
foreach ($query->rows as $row)
{
if (array_search($row['filter_id'], $exclude_filter_id) === FALSE)
{
$groups[$row['filter_id']][] = $row;
}
}
foreach ($groups as $key => $group)
{
$numeric = 0;
$alphabet = 0;
foreach ($group as $val)
{
if (preg_match($pattern, $val['name'], $matches1))
{
$numeric++;
} else
{
$alphabet++;
}
}
if ($alphabet != 0)
{
continue;
}
uasort($groups[$key], function ($a, $b) use ($pattern)
{
if (preg_match($pattern, $a['name'], $matches1) && preg_match($pattern, $b['name'], $matches2))
{
return (float)str_replace(',', '.', $matches1[0]) <=> (float)str_replace(',', '.', $matches2[0]);
} else
{
return $a['name'] <=> $b['name'];
}
});
$final_groups[$key] = $groups[$key];
}
foreach ($final_groups as $group)
{
$counter = 0;
foreach ($group as $val)
{
$counter++;
$sqlQueries[] = "WHEN value_id = " . $val['value_id'] . " THEN " . $counter . " ";
//$this->db->query($sql);
}
}
$chunks = array_chunk($sqlQueries, $batchSize);
foreach ($chunks as $batch)
{
$combinedQuery = implode(" ", $batch);
$combinedQuery = "UPDATE " . DB_PREFIX . "ocfilter_filter_value SET sort_order = (CASE " . $combinedQuery . " ELSE sort_order END)";
$this->db->query($combinedQuery);
}
echo "<PRE>";var_dump($final_groups);
}