Свойства, которые выводит catalog.smart.filter можно сортировать по полю SORT, которое заполнено у каждого свойства в настройках инфоблока. А что если это торговый каталог SKU и у торговых предложений есть свои свойства, которые тоже участвую в фильтрации?

Пример

Есть такая структура:
Основной каталог товаров:
— Свойство 1 (SORT 100)
— Свойство 2 (SORT 110)
— Свойство 3 (SORT 140)

Каталог торговых предложений:
— Свойство 4 (SORT 120)
— Свойство 5 (SORT 130)

По идее и логике, свойства 4 и 5 должны идти за свойством 2. Но не тут то было.
Свойства торговых предложений будут добавлены в самый конец, то есть после всех свойств обычного инфоблока.

Это можно поправить следующем кодом, добавленным в result_modifier.php шаблона:

<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
 
// {{{ Сквозная пересортировка свойств каталога и свойст SKU на основе поля SORT
 
$arItemsProps = array();
foreach($arResult["ITEMS"] as $prop){
    if(!isset($arItemsProps[$prop['IBLOCK_ID']])) $arItemsProps[$prop['IBLOCK_ID']] = array();
    if(!empty($prop['VALUES'])){
        $arItemsProps[$prop['IBLOCK_ID']][] = $prop['ID'];
    }
}
 
$arIblockProps = array();
 
foreach($arItemsProps as $arItemsPropIblockId => $arItemsPropIds){
 
    $propsIds = array_flip($arItemsPropIds);
 
    $res = CIBlock::GetProperties($arItemsPropIblockId, Array(), Array());
    while($arRes = $res->Fetch()){
        if(isset($propsIds[$arRes['ID']])){
            $arIblockProps[$arRes['ID']] = $arRes['SORT'];
        }
    }
 
}
 
if(!empty($arIblockProps)){
 
    asort($arIblockProps);
 
    usort($arResult["ITEMS"], function($a, $b) use ($arIblockProps) {
 
        if($arIblockProps[$a['ID']] == $arIblockProps[$b['ID']]){
            return 0;
        }
 
        return ($arIblockProps[$a['ID']] < $arIblockProps[$b['ID']]) ? -1 : 1;
    });
 
}
 
// }}}
 
 
?>