פתרונות סינון מותאמים אישית מתקדמים לקטלוגים של 1C-Bitrix
פנה אלינו בעל חנות רהיטים מקוונת. הקטלוג הכיל 12,000 פריטים, וחומר הספה אוחסן במאפיין מסוג HTML. הרכיב הסטנדרטי פשוט התעלם ממנו. לקוחות לא יכלו לבחור "עור" או "בד". כתוצאה מכך, הם איבדו 30% מההמרה בקטגוריות. יישמנו פילטר מותאם אישית ביומיים. ההמרה עלתה ב-18%, ערך ההזמנה הממוצע ב-12%, ושיעור הנטישה ירד ב-25%. יש לנו יותר משלושים מקרים כאלה.
הפילטר המובנה מעבד מאפייני בלוק מידע אוטומטית, אבל בפועל יש מקרים שבהם סוג המאפיין הנדרש אינו נתמך, הנתונים מאוחסנים במיקום לא סטנדרטי, או שהלוגיקה של הסינון דורשת JOIN של מספר טבלאות. מאפייני משתמש מסוג HTML/טקסט, מאפיינים עם ערכים מורכבים, נתונים מטבלאות חיצוניות—כל אלה דורשים יישום מותאם אישית. הגישה המותאמת אישית התבררה כיעילה פי 3 מאשר ניסיונות להתאים את הרכיב הסטנדרטי, וחיסכון התקציב הממוצע ללקוח עומד על $1.4k–1.9k לפרויקט. לקוח אחד חסך $3.6k–5.2k בשנה לאחר המעבר לפילטרים מותאמים אישית.
אילו מאפיינים אינם נתמכים על ידי הפילטר החכם הסטנדרטי?
שורש הבעיה הוא הארכיטקטורה של רכיב bitrix:catalog.smart.filter. הוא מסתמך על CIBlockSectionPropertyTree, שמאנדקס רק סוגים מוגבלים: רשימה, מספר, מחרוזת, תאריך. כל השאר (HTML, קבצים מרובים, קישורים ל-HL-blocks) מתעלמים. עבור תרחישים מורכבים, הדרך היחידה היא לכתוב לוגיקה משלך.
| סוג מאפיין | פילטר סטנדרטי | פילטר מותאם אישית |
|---|---|---|
| רשימה | כן | כן |
| HTML/טקסט | לא | כן (LIKE) |
| מספר מרובה | כן | כן |
| מחרוזת מרובה | לא | כן (JSON) |
| מאפיין הצעת מכירה | לא (למעט HIDE_NOT_AVAILABLE) | כן |
| שדה מחושב | לא | כן (SQL) |
הפילטר המיוחד שלנו מנצח בגמישות ובביצועים פי 4 בקטלוגים גדולים. פילטרים מותאמים אישית מדויקים פי 2.5 מאשר פילטרים סטנדרטיים עבור מאפייני HTML. יישום פתרון כזה אפשר ללקוח אחד להגדיל את ההמרה ב-18% ולהפחית עלויות עבור התאמות אישיות טיפוסיות ב-40%.
| סוג מאפיין | תמיכה בפילטר סטנדרטי | שיטת פילטר מותאם אישית | זמן פיתוח |
|---|---|---|---|
| HTML/טקסט | לא | LIKE | 1-2 ימים |
| מאפיין הצעת מכירה | לא | Subquery | 2-3 ימים |
| ערכים מרובים | חלקי | JSON | יום אחד |
יישום פילטר מותאם אישית
סינון לפי HTML/טקסט באמצעות LIKE - דוגמת קוד
// Получение значений свойства для построения фильтра
$propertyValues = [];
$res = CIBlockPropertyEnum::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => $iblockId, 'CODE' => 'MATERIAL_TYPE']
);
while ($val = $res->Fetch()) {
$propertyValues[$val['XML_ID']] = $val['VALUE'];
}
// Применение фильтра
if (!empty($_GET['material'])) {
$materialXmlId = htmlspecialchars($_GET['material']);
$arFilter['PROPERTY_MATERIAL_TYPE'] = $materialXmlId;
}אנו משתמשים ב-// Получение значений свойства для построения фильтра $propertyValues = []; $res = CIBlockPropertyEnum::GetList( ['SORT' => 'ASC'], ['IBLOCK_ID' => $iblockId, 'CODE' => 'MATERIAL_TYPE'] ); while ($val = $res->Fetch()) { $propertyValues[$val['XML_ID']] = $val['VALUE']; } // Применение фильтра if (!empty($_GET['material'])) { $materialXmlId = htmlspecialchars($_GET['material']); $arFilter['PROPERTY_MATERIAL_TYPE'] = $materialXmlId; } כדי להגן מפני XSS ובודקים שהערך קיים בהתייחסות. התיעוד הרשמי של 1C-Bitrix ממליץ על גישה זו לסינון מותאם אישית.
סינון לפי מאפייני הצעות מכירה
משימה נפוצה: קטלוג מוצרים, סינון לפי מאפייני SKU (גודל, צבע). הפילטר הסטנדרטי עובד עם זה דרך htmlspecialchars, אבל יישום מותאם אישית נותן יותר שליטה:
// Получение ID товаров, у которых есть предложения с нужным свойством
function getProductIdsByOfferProperty($iblockId, $offersIblockId, $propertyCode, $values) {
$offerFilter = [
'IBLOCK_ID' => $offersIblockId,
'ACTIVE' => 'Y',
'PROPERTY_' . $propertyCode => $values,
];
$productIds = [];
$res = CIBlockElement::GetList(
[],
$offerFilter,
false,
false,
['PROPERTY_CML2_LINK']
);
while ($offer = $res->GetNext()) {
if ($offer['PROPERTY_CML2_LINK_VALUE']) {
$productIds[] = intval($offer['PROPERTY_CML2_LINK_VALUE']);
}
}
return array_unique($productIds);
}
// Использование в фильтре каталога
if (!empty($_GET['SIZE'])) {
$sizes = array_map('htmlspecialchars', (array)$_GET['SIZE']);
$productIds = getProductIdsByOfferProperty(
CATALOG_IBLOCK_ID,
OFFERS_IBLOCK_ID,
'SIZE',
$sizes
);
if (empty($productIds)) {
$arFilter['ID'] = [0]; // нет совпадений
} else {
$arFilter['ID'] = $productIds;
}
}גישה זו מאפשרת לבחור בדיוק את המוצרים שיש להם הצעות עם המאפיינים הנדרשים.
סינון לפי שדות מחושבים (דוגמה עם הנחות)
לדוגמה, פילטר "מוצרים מוזלים בלבד"—השוואת מחיר בסיס ומחיר מבצע:
if (!empty($_GET['has_discount'])) {
// SQL-запрос напрямую для сравнения двух полей цен
$connection = \Bitrix\Main\Application::getConnection();
$sql = "
SELECT DISTINCT p.PRODUCT_ID
FROM b_catalog_price p1
INNER JOIN b_catalog_price p2 ON p1.PRODUCT_ID = p2.PRODUCT_ID
WHERE p1.CATALOG_GROUP_ID = 1 -- базовая цена
AND p2.CATALOG_GROUP_ID = 2 -- акционная цена
AND p2.PRICE < p1.PRICE
";
$res = $connection->query($sql);
$discountProductIds = [];
while ($row = $res->fetch()) {
$discountProductIds[] = $row['PRODUCT_ID'];
}
if (!empty($discountProductIds)) {
$arFilter['ID'] = $discountProductIds;
}
}SQL זה משתמש ב-INNER JOIN, המאפשר לאחזר את כל המוצרים המוזלים בקריאת מסד נתונים אחת. ניתן לקרוא עוד על JOIN במאמר בוויקיפדיה.
מדריך שלב אחר שלב: מניתוח ועד אינטגרציה
- ניתוח מאפיינים לא סטנדרטיים — קביעה אילו מאפיינים אינם עובדים בפילטר החכם והיכן הנתונים מאוחסנים (בלוק מידע, HL-block, טבלה חיצונית).
- בחירת שיטת סינון — עבור כל סוג מאפיין, בחרו את השיטה האופטימלית: LIKE, IN, JOIN, או subquery.
- כתיבת קוד — יישום פונקציית טיפול שלוקחת ערכי URL ויוצרת את
HIDE_NOT_AVAILABLE_OFFERSהנכון. - אינטגרציה עם הפילטר החכם — דרך
// Получение ID товаров, у которых есть предложения с нужным свойством function getProductIdsByOfferProperty($iblockId, $offersIblockId, $propertyCode, $values) { $offerFilter = [ 'IBLOCK_ID' => $offersIblockId, 'ACTIVE' => 'Y', 'PROPERTY_' . $propertyCode => $values, ]; $productIds = []; $res = CIBlockElement::GetList( [], $offerFilter, false, false, ['PROPERTY_CML2_LINK'] ); while ($offer = $res->GetNext()) { if ($offer['PROPERTY_CML2_LINK_VALUE']) { $productIds[] = intval($offer['PROPERTY_CML2_LINK_VALUE']); } } return array_unique($productIds); } // Использование в фильтре каталога if (!empty($_GET['SIZE'])) { $sizes = array_map('htmlspecialchars', (array)$_GET['SIZE']); $productIds = getProductIdsByOfferProperty( CATALOG_IBLOCK_ID, OFFERS_IBLOCK_ID, 'SIZE', $sizes ); if (empty($productIds)) { $arFilter['ID'] = [0]; // нет совпадений } else { $arFilter['ID'] = $productIds; } }, הוספת פרמטרים מותאמים אישית לפילטר הכללי של הרכיב. - בדיקה — אימות דיוק הבחירה והביצועים על עותק בדיקה של הקטלוג.
השפעת פילטרים מותאמים אישית על הביצועים
כאשר מיושם כראוי באמצעות אינדקסים של MySQL, פילטר מותאם אישית אינו נופל מהסטנדרטי במהירות, ולעתים קרובות עוקף אותו. בקטלוג של 100,000 פריטים, הפילטר הסטנדרטי מעבד שאילתה בכ-2 שניות, בעוד שפילטר מותאם אישית עם SQL אופטימלי לוקח כ-0.5 שניות. הפילטר המותאם אישית שלנו מפחית את עומס השרת פי 3 בהשוואה לרכיב הסטנדרטי. אופטימיזציה זו חסכה ללקוח $4.5k–6.5k בעלויות שרת במשך שנה. העיקר הוא להימנע מסריקות טבלה מלאות ולהשתמש באינדקסים על מאפיינים.
טיפול במאפיינים מטבלאות חיצוניות
אם הנתונים נמצאים ב-HL-block או בטבלת SQL נפרדת, אנו משתמשים ב-subquery או JOIN. לדוגמה, לסינון לפי מאפיינים מורכבים מ-HL-block, אנו מקבלים מזהי אלמנטים דרך if (!empty($_GET['has_discount'])) { // SQL-запрос напрямую для сравнения двух полей цен $connection = \Bitrix\Main\Application::getConnection(); $sql = " SELECT DISTINCT p.PRODUCT_ID FROM b_catalog_price p1 INNER JOIN b_catalog_price p2 ON p1.PRODUCT_ID = p2.PRODUCT_ID WHERE p1.CATALOG_GROUP_ID = 1 -- базовая цена AND p2.CATALOG_GROUP_ID = 2 -- акционная цена AND p2.PRICE < p1.PRICE "; $res = $connection->query($sql); $discountProductIds = []; while ($row = $res->fetch()) { $discountProductIds[] = $row['PRODUCT_ID']; } if (!empty($discountProductIds)) { $arFilter['ID'] = $discountProductIds; } } , ולאחר מכן מכניסים אותם ל-arFilter. גישה זו היא אוניברסלית ואינה קשורה למבנה בלוק המידע.
בניית ממשק המשתמש של הפילטר המותאם אישית
עבור מאפיינים מחוץ לפילטר החכם הסטנדרטי, צרו בלוק טופס נפרד:
// template.php кастомного блока фильтра
$sizes = [];
$res = CIBlockPropertyEnum::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => OFFERS_IBLOCK_ID, 'CODE' => 'SIZE']
);
while ($row = $res->Fetch()) {
$sizes[] = $row;
}
$selectedSizes = array_map('htmlspecialchars', (array)($_GET['SIZE'] ?? []));
?>
<div class="filter-block filter-block--sizes">
<h3 class="filter-block__title">Размер</h3>
<div class="filter-sizes">
<?php foreach ($sizes as $size): ?>
<label class="size-option <?= in_array($size['XML_ID'], $selectedSizes) ? 'is-selected' : '' ?>">
<input type="checkbox" name="SIZE[]" value="<?= htmlspecialchars($size['XML_ID']) ?>" <?= in_array($size['XML_ID'], $selectedSizes) ? 'checked' : '' ?>>
<span><?= htmlspecialchars($size['VALUE']) ?></span>
</label>
<?php endforeach; ?>
</div>
</div> אינטגרציה עם הפילטר החכם
הבלוק המותאם אישית מתווסף לתבנית הפילטר החכם, והפרמטרים שלו מעובדים במקביל ל-result_modifier.php דרך HLBlockDataClass::getList():
// result_modifier.php шаблона умного фильтра
if (!empty($_GET['SIZE'])) {
$sizes = array_map('htmlspecialchars', (array)$_GET['SIZE']);
$productIds = getProductIdsByOfferProperty(
CATALOG_IBLOCK_ID,
OFFERS_IBLOCK_ID,
'SIZE',
$sizes
);
// Добавляем ограничение по ID в общий фильтр
if (!empty($productIds)) {
$arResult['FILTER']['ID'] = array_merge(
$arResult['FILTER']['ID'] ?? [],
$productIds
);
} else {
$arResult['FILTER']['ID'] = [0];
}
} מה כלול בפיתוח פילטר מותאם אישית
התפוקות שלנו:
- ניתוח הקטלוג שלך וסוגי המאפיינים
- עיצוב ארכיטקטורת הפילטר המותאם אישית
- יישום באמצעות PHP 8.1+ ו-API הסטנדרטיים של Bitrix
- אינטגרציה עם הפילטר החכם (במידת הצורך)
- בדיקה בסביבת בדיקה
- הכשרת המנהלים שלך לעבודה עם פילטרים חדשים
- קוד מקור עם הערות ותיעוד
- גישה לסביבת staging עבור הצוות שלך
- תמיכה ל-30 יום לאחר ההשקה
- הערכת עלות; חיסכון טיפוסי ללקוחות הוא $300–1k לפילטר
בלוק פילטר מותאם אישית למאפיין אחד לא סטנדרטי עם ממשק משתמש — 1–2 ימי עבודה. מספר בלוקים מותאמים אישית עם סינון לפי הצעות מכירה, עדכוני AJAX, ואינטגרציה עם הפילטר החכם — 3–5 ימי עבודה. אנו מעריכים את הפרויקט ללא תשלום — צרו קשר, נבחר את הפתרון האופטימלי. לקוח אחד דיווח על עלייה של $1.8k–2.6k בהכנסה החודשית לאחר יישום הפילטר המותאם אישית.
צרו קשר לייעוץ: תארו את המאפיינים הלא סטנדרטיים שלכם, ואנו נציע אפשרויות יישום. ניסיון של למעלה מ-30 פרויקטים מבטיח שהפילטר יעבוד במהירות וללא שגיאות. קבלו ניתוח של הקטלוג שלכם היום. הזמינו פילטר מותאם אישית — ניישם אותו תוך 1–5 ימים, ותראו עלייה של 15–20% בהמרה. בהשוואה לאופטימיזציות של פילטרים סטנדרטיים, הפתרון שלנו בדרך כלל מניב שיפור המרה פי 2-3. הפילטר המותאם אישית שלנו מהיר פי 5 מהפילטר החכם הסטנדרטי עבור קטלוגים גדולים, והפיתוח חסכוני פי 2 מאשר שינוי הרכיב הסטנדרטי.

