מדריך Liquid המלא
Joryio מתאימה הודעות באופן אישי באמצעות Liquid - אתם כותבים
מצייני מקום כמו {{ user.firstName }} ומסננים כמו {{ price | currency }}, והם נפתרים
לערך המתאים לכל נמען בזמן השליחה. העמוד הזה הוא המדריך המלא: כל מרחבי השמות של המשתנים וכל
המסננים המותאמים של Joryio, עם דוגמאות.
חדשים ב‑Liquid של Joryio? התחילו מתבניות Liquid ליסודות, וחזרו לכאן כשתצטרכו את הפרטים.
כל המסננים שלמטה רשומים במנוע Liquid משותף אחד שמשרת את כל נתיבי העיבוד, ולכן אותה תבנית מעובדת באופן זהה בתבניות אימייל, SMS, WhatsApp, פוש, בתוך האפליקציה ו‑webhook - בקמפיינים, במסעות ובתצוגה המקדימה כאחד. מה שרואים בתצוגה המקדימה הוא בדיוק מה שכל ערוץ שולח.
שתי התנהגויות מקלות שכדאי להכיר:
- משתנה ללא ערך מוצג כטקסט ריק - לעולם לא כשגיאה.
- מסנן לא מוכר משאיר את הערך ללא שינוי במקום להיכשל.
משתנים
מרחבי השמות הזמינים, במבט אחד. עקבו אחרי הקישורים לפרטים המלאים של כל אחד.
| מרחב שמות | מה הוא מכיל | פרטים |
|---|---|---|
user.firstName, user.lastName, user.email, user.phone, user.id, user.externalId, user.whatsappName | מאפייני ברירת המחדל של איש הקשר | משתני הודעה |
user.custom.<attribute> | כל מאפיין מותאם של איש הקשר (למשל user.custom.plan) | משתני הודעה |
trigger.properties.<field> | איך הם נכנסו למסע - אירוע הכניסה, קבוע לכל הריצה | משתני הודעה |
event.properties.<field>, event.name | הדבר האחרון שהם עשו - האירוע האחרון שקידם את המסע | משתני הודעה |
reply.text, reply.type, reply.profile.name | קיצורים ידידותיים לתשובה הנכנסת האחרונה של איש הקשר ב‑WhatsApp או ב‑SMS | משתני הודעה |
blocks.<slug> | בלוק תוכן לשימוש חוזר, המעובד במקומו | בלוקי תוכן |
unsubscribe_url, preferences_url, resubscribe_url | קישורי הרשמה ייחודיים לכל נמען (אימייל, SMS, סשן WhatsApp) | תבניות Liquid |
cart.items, cart.value, cart.subtotal, cart.currency, cart.checkoutUrl | עגלת החנות המסונכרנת של איש הקשר - פריטים עם name, quantity, price, total, imageUrl, url, sku value הוא הסכום שהחנות שלחה (יכול לכלול משלוח); subtotal הוא סכום הפריטים, לפני משלוח ומס. | מוצרים |
last_order.items, last_order.total, last_order.currency, last_order.placedAt, last_order.orderUrl | ההזמנה האחרונה שלהם שלא בוטלה ולא זוכתה - אותם שדות פריט כמו בעגלה | מוצרים |
top_products | המוצרים שהם מזמינים הכי הרבה - עד 5 עם name, sku, imageUrl, url, timesOrdered, lastOrderedAt, הנפוץ ביותר ראשון | מוצרים |
המסננים products ו‑entity | רשומות מקטלוג המוצרים או מישות מותאמת מתוך סינון שמור | הזנות קטלוג למטה |
trigger.*, event.* ו‑reply.* זמינים רק בתוך מסע; כל השאר פועלים בכל מקום.
cart, last_order ו-top_products ריקים לאיש קשר ללא הזמנות בחנות - עטפו אותם ב-{% if %}.
מסננים
משרשרים מסננים עם | ומעבירים ארגומנטים אחרי :. למשל:
{{ user.firstName | capitalize | default: "חבר" }}
{{ order.total | currency: "EUR" }}
טקסט
| מסנן | מה הוא עושה | דוגמה ← פלט |
|---|---|---|
capitalize | הופך את האות הראשונה לגדולה ואת שאר המחרוזת לקטנה | {{ "mAYA" | capitalize }} ← Maya |
uppercase | ממיר את כל המחרוזת לאותיות גדולות | {{ "sale" | uppercase }} ← SALE |
lowercase | ממיר את כל המחרוזת לאותיות קטנות | {{ "SALE" | lowercase }} ← sale |
truncate | חותך מחרוזת לאורך נתון (ברירת מחדל 50) ומוסיף סיומת (ברירת מחדל ...). הסיומת מתווספת אחרי החיתוך, מעבר לאורך | {{ "The quick brown fox jumps" | truncate: 9 }} ← The quick... |
strip_html | מסיר תגי HTML | {{ "<b>Sale</b> today" | strip_html }} ← Sale today |
url_encode | מקודד מחרוזת ל‑URL (לבניית קישורים) | {{ "red shoes" | url_encode }} ← red%20shoes |
pluralize | מקבל מספר ומחזיר את צורת היחיד או הרבים של המילה. הרבים כברירת מחדל הוא היחיד + s; ארגומנט שלישי לצורות רבים חריגות | 3 {{ 3 | pluralize: "item" }} ← 3 items |
default | ערך גיבוי כשהערך הוא null, לא מוגדר או מחרוזת ריקה | {{ user.firstName | default: "חבר" }} ← חבר (כשהמאפיין ריק) |
landing_page_url | קישור לדף נחיתה מפורסם לפי ה-slug שלו. נושא את הטוקן של הנמען, כך שהדף יודע מי הגיע; ארגומנט אופציונלי מוסיף מחרוזת שאילתה. הקישור נבנה תמיד; slug שלא פורסם (או שאינו קיים) מקבל 404 בהפניה. ריק רק כשה-slug אינו תקין או כשלעיבוד אין מרחב עבודה | {{ "spring-sale" | landing_page_url: "utm_campaign=spring" }} ← https://api-eu1.joryio.com/api/p/go/<workspace>/spring-sale?jp=…&utm_campaign=spring |
מספרים וכסף
| מסנן | מה הוא עושה | דוגמה ← פלט |
|---|---|---|
currency | מעצב מספר כסכום כסף. קוד המטבע כברירת מחדל הוא USD; אפשר להעביר כל קוד ISO. העיצוב לפי en-US (סימן המטבע לפני, פסיקים לאלפים) | {{ 1249.5 | currency }} ← $1,249.50 · {{ order.total | currency: "EUR" }} ← €49.90 |
תאריכים
| מסנן | מה הוא עושה | דוגמה ← פלט |
|---|---|---|
date_format | מעצב תאריך. סגנונות: short (ברירת מחדל), long, full. כשמתקבל סגנון לא מוכר, נעשה שימוש ב‑short. שמות החודשים והימים באנגלית (en-US). התאריך מוצג באזור הזמן של סביבת העבודה, גם בתצוגה המקדימה וגם בשליחה; ערך של תאריך בלבד, כמו יום הולדת (1990-05-01), לעולם לא זז. אפשר גם תבנית strftime ("%d %b %H:%M"), וארגומנט שני אופציונלי מציין אזור זמן IANA אחר - אזור לא מוכר חוזר לאזור הזמן של סביבת העבודה | {{ order.createdAt | date_format }} ← Jul 12, 2026 · {{ order.createdAt | date_format: "long" }} ← July 12, 2026 · "full" ← Sunday, July 12, 2026 · {{ order.createdAt | date_format: "%d %b %H:%M", "America/New_York" }} → 12 Jul 05:30 |
add_days | מוסיף N ימים לתאריך (מספר שלילי מחסיר). מחזיר חותמת זמן ISO - שרשרו date_format כדי להפוך אותה לקריאה | {{ order.createdAt | add_days: 7 | date_format }} ← Jul 19, 2026 |
time_ago | זמן יחסי בשפה אנושית (ברזולוציית שנה/חודש/שבוע/יום/שעה/דקה/שנייה) | {{ user.custom.lastOrderAt | time_ago }} ← 3 days ago |
תאריכים ושעות בתוכן ההודעה מוצגים באזור הזמן של סביבת העבודה, אותו אזור שבו משתמשת שאר האפליקציה. זה חל על date_format ועל המסנן הסטנדרטי date ({{ order.createdAt | date: "%H:%M" }}); כדי להשתמש באזור אחר, העבירו אותו כארגומנט האחרון.
מערכים
| מסנן | מה הוא עושה | דוגמה ← פלט |
|---|---|---|
join | מאחד פריטי מערך למחרוזת. המפריד כברירת מחדל הוא , | {{ names | join }} ← Ana, Ben, Gal · {{ names | join: " / " }} ← Ana / Ben / Gal |
map | שולף מאפיין אחד מכל פריט ומחזיר מערך חדש | {{ items | map: "name" | join }} ← Mug, Tee |
first | הפריט הראשון | {{ items | first }} |
last | הפריט האחרון | {{ items | last }} |
size | אורך של מערך או של מחרוזת (0 לכל דבר אחר) | {{ cart.items | size }} ← 3 |
count | מספר הפריטים במערך (0 אם זה לא מערך) | {{ cart.items | count }} ← 3 |
צבירה וסינון
המסננים האלה פועלים על מערכים של רשומות - פריטי עגלה, הזמנות או הזנות קטלוג. כל ארגומנט
field תומך בנתיבי נקודה לתוך אובייקטים מקוננים (למשל "price.amount").
| מסנן | מה הוא עושה | דוגמה ← פלט |
|---|---|---|
sum | מסכם שדה מספרי בכל פריטי המערך (ערכים חסרים נספרים כ‑0) | {{ orders | sum: "totalAmount" }} ← 540 |
avg | ממוצע של שדה מספרי (0 למערך ריק) | {{ orders | avg: "totalAmount" }} ← 180 |
max | הערך המספרי הגדול ביותר של שדה (ערכים לא מספריים מדולגים; 0 אם אין) | {{ products | max: "price" }} ← 129.9 |
min | הערך המספרי הקטן ביותר של שדה | {{ products | min: "price" }} ← 19.9 |
where | מסנן את המערך. שלוש צורות קריאה: where: "featured" משאיר פריטים שהערך שלהם נחשב true; where: "category", "shoes" משאיר פריטים שערכם שווה לערך הנתון; where: "price", "gt", 100 משווה באמצעות אופרטור: eq, neq, gt, gte, lt, lte, contains, in (גם צורות הסימנים ==, !=, >, >=, <, <= פועלות) | {{ items | where: "category", "shoes" | count }} ← 2 |
sort | ממיין לפי שדה, בסדר asc (ברירת מחדל) או desc. בלי שדה - ממיין את הערכים עצמם | {{ products | sort: "price", "desc" | first }} ← המוצר היקר ביותר |
דוגמה מלאה - שלוש ההזמנות האחרונות של הנמען:
{% assign recent = orders | sort: 'createdAt', 'desc' %}
{% for order in recent limit: 3 %}
- {{ order.createdAt | date_format }}: {{ order.totalAmount | currency }}
{% endfor %}
סך הקניות: {{ orders | sum: 'totalAmount' | currency }}
הזנות קטלוג
שני מסננים מושכים אוספי רשומות לתוך הודעה, וכל אחד מהם מגובה בסינון שמור
בסביבת העבודה שלכם. שניהם מחזירים מערך - משתמשים בהם בתג assign ואז עוברים על התוצאה בלולאה.
products - קטלוג המוצרים של החנות
מושך מקטלוג המוצרים המסונכרן (Shopify / WooCommerce / Magento) דרך סינון מוצרים. יש קטלוג מוצרים אחד, ולכן הארגומנט הוא שם הסינון:
{% assign products = 'featured' | products %}
{% for item in products %}
- {{ item.name }}: {{ item.price | currency }}
{% endfor %}
entity - הזנת ישות מותאמת
מושך רשומות מישות מותאמת. הארגומנט הראשון הוא שם הישות, והשני (אופציונלי) הוא שם הסינון:
{% assign episodes = 'tv_series' | entity: 'latest' %}
{% for item in episodes %}
- {{ item.name }}
{% endfor %}
אפשר להעביר משתנים לסינון ישות שמקבל פרמטרים - למשל להעביר אליו את אירוע הכניסה של המסע:
{% assign items = 'products' | entity: 'product_by_id', trigger %}
הערות על ההתנהגות:
- סינונים שזהים לכל הנמענים (ללא מסנני מאפייני משתמש או הקשר) נשמרים במטמון - כ‑5 דקות בתצוגה המקדימה בעורך, כדקה בשליחה - כך ששליחות המוניות אינן מריצות שאילתה מחדש לכל נמען. סינוני ישויות מותאמים אישית מחושבים מחדש לכל נמען.
- אם סינון הישות או המוצרים לא נמצא (או שהשאילתה נכשלה), המסנן מחזיר מערך ריק -
לולאת ה‑
forשלכם פשוט לא מציגה כלום, לעולם לא שגיאה. - שלושת המסננים (
products,entityוהשם החלופיcatalog) פועלים בכל מסלול עיבוד ובאותם שמות: התצוגה המקדימה בעורך, שליחת קמפיינים, שליחה ממסעות וכל worker של ערוץ. מה שהתצוגה המקדימה מציגה הוא מה שהנמען מקבל. - האפשרויות Product catalog ו־Custom entity בבורר ההתאמה האישית בונות עבורכם את קטע
ה‑
assign(ראו משתני הודעה).
catalogהמסנן הישן catalog הוא שם חלופי שהוצא משימוש עבור entity, אך הוא עדיין פועל כדי
שתבניות קיימות לא יישברו. מעתה העדיפו entity לישויות מותאמות ו‑products לקטלוג החנות.
המלצות
recommendations.<slot> הוא מערך של מוצרים מומלצים לנמען, מתוך
מודל המלצות. המשבצת היא שם המודל כמפתח
(For you הופך ל-for_you); recommendations.default הוא מודל ברירת המחדל של סביבת העבודה. לכל פריט
יש name, price (מעוצב), compareAtPrice, discountPercent, url, image, description
ו-id. הוא עובד בכל ערוץ - אימייל (קמפיינים ומסעות), SMS, WhatsApp, Viber, Push, in-app ודפי נחיתה - וגם
בתצוגות מקדימות ובשליחות בדיקה:
{% for item in recommendations.for_you limit: 3 %}
{{ item.name }} - {{ item.price }} {{ item.url }}
{% endfor %}
ראו משבצות Liquid לשמות המשבצות ושדות הפריט, ואת רשימת החסימה למוצרים שלעולם אינם מומלצים.
במה Joryio שונה מ‑Liquid סטנדרטי
כמה מסננים מתנהגים בכוונה אחרת מהמסננים המקבילים ב‑Shopify/LiquidJS:
capitalizeגם הופך את שאר המחרוזת לאותיות קטנות ("mAYA"הופך ל‑Maya, לא ל‑MAYA).defaultמתייחס למחרוזת ריקה כאל ערך חסר, כך ש‑{{ user.firstName | default: "חבר" }}משתמש בערך הגיבוי גם כשהמאפיין קיים אך ריק.truncateמוסיף את הסיומת אחרי אורך החיתוך (Liquid סטנדרטי סופר את שלוש הנקודות בתוך האורך).whereו‑sortמרחיבים את המסננים המובנים: הם מקבלים את צורות הקריאה הסטנדרטיות וגם מוסיפים אופרטורים להשוואה, כיוון מיון ונתיבי נקודה בשדות.
Liquid סטנדרטי ממשיך לעבוד
כל מה שלמעלה נוסף על גבי LiquidJS הסטנדרטי: התגים המובנים -
{% if %} / {% elsif %} / {% else %}, {% for %}, {% assign %}, {% case %}
וחבריהם - והמסננים המובנים (upcase, downcase, date, replace, split, plus,
times ועוד רבים) עובדים בכל תבנית של Joryio. כשמסנן של Joryio חולק שם עם מסנן מובנה
(capitalize, default, where, sort, join, map, first, last, size),
הגרסה של Joryio המתוארת בעמוד הזה היא זו שרצה. הרשימה המלאה של המסננים המובנים נמצאת
בכתובת liquidjs.com/filters/overview.html.
קישורים קשורים
- תבניות Liquid - מבוא ובורר ההתאמה האישית
- משתני הודעה -
trigger.*,event.*ו‑reply.*במסעות - בלוקי תוכן - קטעים לשימוש חוזר דרך
blocks.slug - המלצות מוצרים - מודלים, סוגים ומשבצות
recommendations.*