مقدمة
إدارة منتجات التجارة الإلكترونية مع كتالوجات ديناميكية، وتصفية، وبحث.
مزيد من المعلومات حول الكتالوج في لوحة إدارة OneEntry: https://doc.oneentry.cloud/docs/category/catalog
🎯 ماذا يفعل هذا الموديل؟
يتيح لك موديل Products (الكتالوج) استرجاع، تصفية، بحث، وترتيب المنتجات في متجرك الإلكتروني أو مجموعات الوسائط المتعددة. تدير الكتالوج في لوحة إدارة OneEntry (الكتالوج > المنتجات)؛ يقوم تطبيقك بجلب المنتجات ديناميكيًا، لذا فإن تغيير سعر أو سمة في الإدارة يظهر مباشرة دون الحاجة لإعادة نشر.
بجانب التجارة الإلكترونية، يناسب الكتالوج أيضًا المعارض متعددة الوسائط، والمحافظ، ومكتبات الوثائق، ومجموعات المحتوى الأخرى.
🚀 بدء سريع
قم بتهيئة الموديل من defineOneEntry:
const { Products } = defineOneEntry( "your-project-url", { "token": "your-app-token" });
استرجع صفحة من المنتجات واقرأ حقولها:
// Fetch the first 20 products (empty body = no filters).
const { items, total } = await Products.getProducts([], "en_US", { limit: 20 });
console.log(`Loaded ${items.length} of ${total} products`);
items.forEach((product) => {
console.log(product.id, product.localizeInfos.title, product.price);
});
تشارك معظم طرق الإدراج نفس الشكل: فلتر اختياري body، وlangCode، و**userQuery** اختياري (ت pagination/ترتيب). انظر Parameters أدناه لمجموعة كاملة.
✨ المفاهيم الأساسية
ما هو المنتج؟
الـ منتج هو كيان كتالوجي (IProductsEntity) يتكون من:
- معلومات أساسية -
localizeInfos(العنوان، إلخ)،sku،price - صور - صور المنتج / المعرض (مخزنة كسمات)
- سمات مخصصة - أي حقول تحددها (
attributeValues): العلامة التجارية، المادة، الحجم، اللون، المتغيرات، المخزون، … - التعريب - محتوى لكل لغة
لا توجد أنواع منتجات ثابتة في SDK — أي هيكل (متغيرات، خيارات، تنزيلات، حزم) يتم نمذجته مع السمات المخصصة التي تقوم بتكوينها للكتالوج.
تنظيم المنتجات
تُنظم المنتجات من خلال عدة ميزات كتالوجية:
- الفئات - أقسام من الكتالوج (صفحات من نوع الكتالوج، تم إنشاؤها في وحدة الصفحات)
- حالات المنتجات - شروط تصفية إضافية تتجاوز فلاتر السمات (مثل "متوفر في المخزون"، "تخفيضات")
- روابط المنتجات - ربط المنتجات حسب معايير السمات (مثل جميع الهواتف السوداء معًا)
- فلاتر المنتجات - بحث سريع حسب معايير الفلترة المحددة
- سمات مخصصة - العلامة التجارية، الحجم، اللون، المادة، …
مثال على الهيكل:
📁 Electronics
├─ 📱 Smartphones
│ ├─ iPhone 15 Pro
│ └─ Samsung Galaxy S24
└─ 💻 Laptops
├─ MacBook Pro
└─ Dell XPS
📁 Clothing
├─ 👕 T-Shirts
└─ 👖 Jeans
📋 ما تحتاج لمعرفته
هيكل الكتالوج
فئات الكتالوج هي صفحات من نوع الكتالوج تم إنشاؤها من خلال وحدة الصفحات — قم بإنشائها قبل إضافة المنتجات:
- افتح وحدة الصفحات في لوحة الإدارة.
- أنشئ صفحات من نوع الكتالوج — هذه تصبح فئات منتجاتك.
- أضف المنتجات إلى تلك الفئات عبر الكتالوج > المنتجات.
توفر إدارة الكتالوج أيضًا تحميل الكتالوج بالجملة، فلاتر المنتجات، روابط المنتجات، حالات المنتجات، وإعدادات لكل كتالوج.
الترقيم
لا تقم بتحميل كل شيء دفعة واحدة — انتقل عبر النتائج باستخدام limit وoffset:
صيغة الإزاحة: offset = (pageNumber - 1) * limit
الحد الافتراضي: يمكنك استرجاع 10 كائنات بشكل افتراضي. للانتقال عبر المزيد، قم بتكوين أذونات الموديل حسب احتياجاتك.
الترتيب
مرر sortKey وsortOrder في userQuery:
| sortKey | ماذا يفعل | مثال على الاستخدام |
|---|---|---|
| price | ترتيب حسب السعر | عرض الأرخص أولاً |
| date | ترتيب حسب تاريخ الإنشاء | عرض أحدث المنتجات |
| title | ترتيب أبجدي | قائمة المنتجات من A-Z |
| position | ترتيب مخصص (افتراضي) | ترتيب مختار من الإدارة |
| id | ترتيب حسب المعرف | ترتيب تقني |
ترتيب: ASC (منخفض→مرتفع) أو DESC (مرتفع→منخفض، افتراضي).
التصفية
تتم التصفية من خلال body الطلب (مصفوفة من IFilterParams)، وليس userQuery. كل شرط يجمع بين attributeMarker، وconditionMarker (eq، neq، in، nin، mth، lth، exs، nexs)، وconditionValue. اجمع بين عدة شروط في المصفوفة لتصفية حسب معايير متعددة في وقت واحد. المرجع الكامل للشروط موجود في Parameters أدناه.
📊 جدول مرجعي سريع - الطرق الشائعة
| الطريقة | الوصف | حالة الاستخدام |
|---|---|---|
| getProducts() | الحصول على جميع المنتجات مع التصفية/الترتيب | الصفحة الرئيسية للكتالوج |
| getProductById() | الحصول على منتج واحد حسب المعرف | صفحة تفاصيل المنتج |
| getProductsByPageId() | الحصول على المنتجات من الفئة حسب معرف الصفحة | صفحة الفئة |
| getProductsByPageUrl() | الحصول على المنتجات من الفئة حسب عنوان الصفحة | صفحة الفئة حسب URL |
| getRelatedProductsById() | الحصول على منتجات ذات صلة/مشابهة | قسم "قد تعجبك أيضًا" |
| searchProduct() | البحث عن المنتجات حسب الاستعلام | وظيفة البحث |
| getProductsCount() | الحصول على إجمالي عدد المنتجات | معلومات الترقيم |
| getProductsCountByPageId() | الحصول على عدد المنتجات حسب معرف الفئة | ترقيم الفئة |
| getProductsCountByPageUrl() | الحصول على عدد المنتجات حسب عنوان الفئة | ترقيم الفئة |
| getProductBlockById() | الحصول على كتلة المنتج حسب المعرف | كتل محتوى المنتج |
| getProductsEmptyPage() | الحصول على هيكل صفحة المنتجات الفارغة | معالجة الحالة الفارغة |
| getProductsPriceByPageUrl() | الحصول على أسعار المنتجات حسب عنوان الصفحة | تصفية الأسعار |
| getProductsByIds() | الحصول على المنتجات من قائمة المعرفات | السلة، قائمة الرغبات، المقارنة |
| getProductsByVectorSearch() | البحث الدلالي (الفيكتوري) عن المنتجات | بحث مدعوم بالذكاء الاصطناعي |
Parameters
هذا الموديل يقبل مجموعة من معلمات المستخدم تسمى userQuery. إذا لم يتم تمرير معلمة، يتم تطبيق الافتراضي. بعض الطرق تقبل أيضًا body للتصفية — مرر مصفوفة فارغة (أو لا شيء) عندما لا تحتاج إلى فلاتر.
const userQuery = { offset: 0, limit: 30, sortOrder: 'DESC', sortKey: 'id', signPrice: 'orders',}
ملاحظة: شكل
userQueryيعتمد على الطريقة. الحقول أعلاه هي القاعدة الشائعة (IProductsQueryBase)، المستخدمة من قبلgetProducts،getProductsByPageId،getProductsByPageUrlوgetProductsEmptyPage. طرق أخرى تختلف:getRelatedProductsByIdتقبل أيضًاstatusMarkerوtemplateMarker؛getProductsPriceByPageUrlتقبل أيضًاstatusMarker(بدونsortKey)؛getProductsByIdsتقبل فقطsignPrice. يتم تنفيذ التصفية (attributeMarker/conditionMarker/conditionValue) من خلال body الطلب، وليسuserQuery— انظر أدناه.
المخطط
offset: number
معلمة الترقيم. الافتراضي 0
مثال: 0
limit: number
معلمة الترقيم. الافتراضي 30
مثال: 30
sortKey: string
حقل للفرز (الافتراضي غير محدد - الفرز حسب الموضع، القيم الممكنة: id، title، date، price، position)
القيم المتاحة: id، position، title، date، price
sortOrder: string
ترتيب الفرز DESC | ASC (الافتراضي DESC)
مثال: "DESC"
signPrice: string
علامة تخزين الطلب لتثبيت السعر. إذا تم تعيين المعلمة، يتم تثبيت السعر لفترة معينة (انظر قسم تثبيت السعر أدناه).
مثال: "orders"
حقول محددة للطرق: statusMarker (getRelatedProductsById، getProductsPriceByPageUrl) وtemplateMarker (getRelatedProductsById) — string | null، الافتراضي null.
استخدم الشروط للعثور على بيانات منتجات محددة:
attributeMarker: المعرف النصي للخاصية المفهرسة التي يتم تصفية القيم بناءً عليها. conditionMarker: نوع الشرط الذي سيتم تطبيقه على قيمة السمة.
| Marker | المعنى | مثال |
|---|---|---|
| eq | يساوي | statusId = 1 (نشط فقط) |
| neq | لا يساوي | category ≠ "أرشيف" |
| in | يحتوي (واحد من) | category in ["إلكترونيات"، "كتب"] |
| nin | لا يحتوي | brand not in ["علامة_تجارية_مزيفة"] |
| mth | أكبر من | price > 100 |
| lth | أقل من | stock < 10 |
| exs | موجود (له قيمة) | لديه وصف |
| nexs | غير موجود | لا توجد صورة |
conditionValue: القيمة للمقارنة معها.
تثبيت السعر (signPrice)
عند جلب المنتجات يمكنك تمرير معلمة signPrice اختيارية داخل userQuery (وهي أيضًا حجة في طرق التوصية من وحدة Blocks). تقبل علامة تخزين الطلب وتطلب من الخادم تأمين السعر المعاد لفترة محدودة.
signPrice— نوعstringعلامة تخزين الطلب لتثبيت السعر. إذا تم تعيين المعلمة، يتم تثبيت السعر لفترة معينة.
لماذا تستخدمه. يمكن أن تتغير الأسعار أثناء تسوق العميل — يبدأ خصم، أو يقوم مسؤول بتحرير السعر. يضمن signPrice أن السعر المعروض في الكتالوج أو السلة هو بالضبط السعر الذي يتم تحصيله عند الخروج، لذا لا يمكن أن يتغير بين التصفح والطلب.
كيف يعمل:
- جلب المنتجات مع تعيين
signPriceإلى علامة تخزين الطلب الخاصة بك (على سبيل المثال،"orders"). - كل منتج تم إرجاعه يحمل الآن حقل
signedPrice— رمز موقّع يشفر السعر المؤمّن. - أرسل رمز
signedPriceهذا عند إنشاء الطلب، حتى يلتزم الخادم بالسعر الثابت.
const { items } = await Products.getProducts([], "en_US", { signPrice: "orders"});
const signedPrice = items[0].signedPrice;
➡️ يتم استهلاك الرمز المعاد بواسطة createOrder(). انظر أين تأخذه وكيف تمرره في قسم سعر المنتج الثابت (signedPrice) من وحدة الطلبات.
❓ الأسئلة الشائعة (FAQ)
هل يمكنني التصفية حسب معايير متعددة في وقت واحد؟
نعم — مرر عدة شروط في مصفوفة body؛ يتم دمجها معًا:
const { items } = await Products.getProducts(
[
{ attributeMarker: "price", conditionMarker: "mth", conditionValue: 100 },
{ attributeMarker: "brand", conditionMarker: "in", conditionValue: ["apple", "samsung"] },
],
"en_US",
);
كيف أتعامل مع متغيرات المنتج (الأحجام، الألوان)؟
تُخزن المتغيرات في attributeValues للمنتج — اقرأها من كائن المنتج المسترجع. الهيكل هو أي مجموعة سمات قمت بتكوينها للكتالوج.
كيف أطبق زر "تحميل المزيد"؟
قم بزيادة offset بمقدار limit في كل نقرة وأضف العناصر الجديدة إلى قائمتك (استخدم total لمعرفة متى تتوقف).
هل يمكنني عرض منتجات من فئات متعددة؟
نعم — قم بالتصفية باستخدام سمة category وعلامة الشرط in، مع تمرير قائمة بقيم الفئات.
كيف أطبق قسم "الوافدين الجدد"؟
رتب حسب تاريخ الإنشاء: userQuery: { sortKey: "date", sortOrder: "DESC" }.
🎓 أفضل الممارسات
- قم دائمًا بالتصفية (
limit+offset) — لا تقم بجلب الكتالوج بالكامل دفعة واحدة. - قم بتخزين قوائم المنتجات للفئات التي يتم الوصول إليها بشكل متكرر لتقليل استدعاءات API.
- استخدم
signPriceعندما تتغذى الأسعار في سلة/خروج حتى لا يمكن أن يتغير السعر. - تعامل مع النتائج الفارغة (
total === 0) والحقول المفقودة (price، الصور) بشكل جيد.
🔗 الوثائق ذات الصلة
- لوحة إدارة OneEntry - الكتالوج - الوثائق الرسمية للوحة الإدارة
- وحدة الصفحات - إنشاء فئات الكتالوج (صفحات من نوع الكتالوج)
- وحدة AttributesSets - حقول وسمات المنتجات المخصصة
- وحدة القوالب - قوالب عرض المنتجات
- وحدة Blocks - كتل محتوى المنتجات القابلة لإعادة الاستخدام
- وحدة الطلبات - التعامل مع طلبات المنتجات