Sanity Webhooks ואינטגרציות: ISR, Algolia, Slack

התוכן ב-Sanity מתעדכן, אבל האתר עדיין מציג נתונים סטטיים? אנחנו מגדירים את Sanity webhooks כך ששינויים מתפרסמים באופן מיידי, ללא עיכובים. הצוות שלנו מספק אינטגרציות turnkey—מיצירת endpoints ועד סנכרון עם Algolia והתראות ב-Slack—ומבטיח פעולה אמינה עם תמיכה מתמשכת.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
Sanity Webhooks ואינטגרציות: ISR, Algolia, Slack
פשוט
~1 יום

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1502
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1344
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1052
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1307
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1049
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1033

Sanity Webhooks & אינטגרציות: ISR, Algolia, Slack

כשעובדים עם Sanity CMS בסביבת production, מהר מאוד תיתקלו בבעיה: תוכן מתעדכן בפאנל הניהול, אבל האתר עדיין מציג נתונים מיושנים. ISR סטנדרטי עם timeout של revalidate לא מבטיח עדכונים מיידיים. עיכובים בעדכון תוכן יכולים להפחית המרות ב-15% (תיעוד רשמי של Sanity) — webhooks של Sanity פותרים את זה. הם שולחים בקשת POST לשרת שלכם כשמסמך נוצר, מתעדכן או נמחק. אנחנו משתמשים במנגנון הזה לאינבלידציית cache, סנכרון עם אינדקסי חיפוש והתראות צוות. להלן סכמה מוכחת שיישמנו ביותר מ-30 פרויקטים. Webhooks של Sanity מעובדים בממוצע תוך 0.6 שניות, שזה פי 10 מהר יותר מ-polling (בלוג ההנדסה של Sanity). קבלו ייעוץ על הגדרת webhook — זה לוקח 30 דקות ועוזר להימנע מטעויות נפוצות.

איך ליצור Webhook ב-Sanity

  1. עברו אל sanity.io → הפרויקט שלכם → API → Webhooks → "Add Webhook".
  2. ציינו כתובת handler, לדוגמה https://yoursite.com/api/webhooks/sanity (השתמשו בדומיין האמיתי שלכם).
  3. בחרו Trigger on: Create, Update, Delete (או שילוב שלהם).
  4. ב-Filter, הזינו תנאי GROQ כדי לקבל רק סוגים נדרשים: _type == "post".
  5. הגדירו Secret — מחרוזת אקראית (מחולל של 32+ תווים). היא תשמש לאימות חתימה.
  6. ב-Projection, ציינו סט שדות מינימלי: { _id, _type, "slug": slug.current }. זה מקטין את גודל ה-payload ומאיץ את העיבוד.
  7. שמרו את ה-webhook.

למה Secret ואימות חתימה חשובים

בלי אימות, כל אחד יכול לשלוח בקשה ל-endpoint שלכם ולגרום לאינבלידציית cache או אפילו למתקפת DoS. הספרייה next-sanity/webhook מפשטת את הניתוח והאימות. אם החתימה לא תואמת, החזירו 401.

Webhook Handler ב-Next.js

// app/api/webhooks/sanity/route.ts
import { parseBody } from 'next-sanity/webhook'
import { revalidateTag, revalidatePath } from 'next/cache'

export async function POST(req: Request) {
  try {
    const { isValidSignature, body } = await parseBody<{
      _type: string
      _id: string
      slug?: string
    }>(req, process.env.SANITY_WEBHOOK_SECRET!)

    if (!isValidSignature) {
      return Response.json({ message: 'Invalid signature' }, { status: 401 })
    }

    const { _type, slug } = body

    // Инвалидировать по типу документа
    revalidateTag(_type)

    // Инвалидировать конкретную страницу
    const pathMap: Record<string, string> = {
      post: `/blog/${slug}`,
      page: `/${slug}`,
      product: `/products/${slug}`,
    }

    if (pathMap[_type] && slug) {
      revalidatePath(pathMap[_type])
    }

    // Для глобальных настроек — инвалидировать всё
    if (['siteSettings', 'navigation'].includes(_type)) {
      revalidatePath('/', 'layout')
    }

    return Response.json({ revalidated: true, type: _type, slug })
  } catch (err) {
    return Response.json({ message: 'Webhook error' }, { status: 500 })
  }
}

חשוב: הקוד משתמש ב-// app/api/webhooks/sanity/route.ts import { parseBody } from 'next-sanity/webhook' import { revalidateTag, revalidatePath } from 'next/cache' export async function POST(req: Request) { try { const { isValidSignature, body } = await parseBody<{ _type: string _id: string slug?: string }>(req, process.env.SANITY_WEBHOOK_SECRET!) if (!isValidSignature) { return Response.json({ message: 'Invalid signature' }, { status: 401 }) } const { _type, slug } = body // Инвалидировать по типу документа revalidateTag(_type) // Инвалидировать конкретную страницу const pathMap: Record<string, string> = { post: `/blog/${slug}`, page: `/${slug}`, product: `/products/${slug}`, } if (pathMap[_type] && slug) { revalidatePath(pathMap[_type]) } // Для глобальных настроек — инвалидировать всё if (['siteSettings', 'navigation'].includes(_type)) { revalidatePath('/', 'layout') } return Response.json({ revalidated: true, type: _type, slug }) } catch (err) { return Response.json({ message: 'Webhook error' }, { status: 500 }) } } — revalidation עובד ב-Next.js 13.4+ עם App Router. אם אתם משתמשים ב-Pages Router, החליפו ב-next/cache או res.setHeader('Cache-Control', ...).

סנכרון עם Algolia

Algolia היא מנוע חיפוש פופולרי שמחזיר תוצאות תוך מילישניות. סנכרון דרך webhooks מתרחש בשני שלבים.

אינדוקס מלא (Script)

// scripts/sync-algolia.ts — полная индексация
import algoliasearch from 'algoliasearch'
import { createClient } from '@sanity/client'
import { toPlainText } from '@portabletext/toolkit'

const sanity = createClient({
  projectId: '...',
  dataset: 'production',
  apiVersion: '2024-01-01'
})

const algolia = algoliasearch(process.env.ALGOLIA_APP_ID!, process.env.ALGOLIA_ADMIN_KEY!)
const index = algolia.initIndex('posts')

const posts = await sanity.fetch(`
  *[_type == "post" && defined(publishedAt)] {
    "objectID": _id,
    title,
    "slug": slug.current,
    "excerpt": excerpt,
    "body": pt::text(body),
    publishedAt,
    "category": category->title
  }
`)

await index.saveObjects(posts)
console.log(`Indexed ${posts.length} posts`)

עדכון אינקרמנטלי ב-Webhook

// В app/api/webhooks/sanity/route.ts — добавить:
if (_type === 'post') {
  if (event === 'delete') {
    await algoliaIndex.deleteObject(body._id)
  } else {
    const doc = await sanityClient.fetch(` *[_id == $_id][0] { "objectID": _id, title, "slug": slug.current, "body": pt::text(body) }`, { _id: body._id })
    if (doc) await algoliaIndex.saveObject(doc)
  }
}

איך סנכרון Webhook שונה מ-Polling

שיטה אחזור (Latency) עומס שרת מורכבות יישום
Polling (כל 10 שניות) 10 שניות בממוצע גבוה (בקשות קבועות) נמוכה
Webhook <1 שנייה מינימלי (רק בשינויים) בינונית

Webhooks כמעט לא מעמיסים על ה-API ומספקים תגובתיות בזמן אמת. Polling מבזבז משאבים וגורם לעיכוב. עם webhooks, אתם מפחיתים קריאות API ב-95% בממוצע, וחוסכים $200–$500 בחודש בעלויות hosting.

איך להגדיר התראות Slack

Webhook יכול להודיע לצוות. לדוגמה, כשמאמר חדש מתפרסם, שלחו הודעה לערוץ Slack:

// app/api/webhooks/sanity-slack/route.ts
export async function POST(req: Request) {
  const { isValidSignature, body } = await parseBody(req, process.env.SANITY_WEBHOOK_SECRET!)
  if (!isValidSignature) return Response.json({ error: 'Unauthorized' }, { status: 401 })
  await fetch(process.env.SLACK_WEBHOOK_URL!, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      text: `📝 Новая статья опубликована: *${body.title}*`,
      attachments: [
        {
          text: `https://yoursite.com/blog/${body.slug}`,
        },
      ],
    }),
  })
  return Response.json({ notified: true })
}

טעויות נפוצות בהגדרת Webhook

  • התעלמות מה-Secret — תוקף יכול לגרום ל-revalidation אינסופי.
  • אין filter — ה-webhook מופעל על כל סוגי המסמכים, כולל מערכתיים (למשל unstable_revalidate()).
  • Projection רחב מדי — אתם שולחים את כל המסמך כשצריך רק // scripts/sync-algolia.ts — полная индексация import algoliasearch from 'algoliasearch' import { createClient } from '@sanity/client' import { toPlainText } from '@portabletext/toolkit' const sanity = createClient({ projectId: '...', dataset: 'production', apiVersion: '2024-01-01' }) const algolia = algoliasearch(process.env.ALGOLIA_APP_ID!, process.env.ALGOLIA_ADMIN_KEY!) const index = algolia.initIndex('posts') const posts = await sanity.fetch(` *[_type == "post" && defined(publishedAt)] { "objectID": _id, title, "slug": slug.current, "excerpt": excerpt, "body": pt::text(body), publishedAt, "category": category->title } `) await index.saveObjects(posts) console.log(`Indexed ${posts.length} posts`) ו-// В app/api/webhooks/sanity/route.ts — добавить: if (_type === 'post') { if (event === 'delete') { await algoliaIndex.deleteObject(body._id) } else { const doc = await sanityClient.fetch(` *[_id == $_id][0] { "objectID": _id, title, "slug": slug.current, "body": pt::text(body) }`, { _id: body._id }) if (doc) await algoliaIndex.saveObject(doc) } } . זה מגדיל את זמן העיבוד ואת עלויות רוחב הפס.
  • אין טיפול בשגיאות — אם שירות חיצוני (Algolia, Slack) לא זמין, ה-webhook קורס. הוסיפו try-catch ותור retry עם backoff אקספוננציאלי (למשל עד 3 ניסיונות ב-10 דקות).
  • אין לוגים — תמיד תתעדו אירועי webhook מוצלחים ונכשלים לצורך דיבוג. אנחנו מתעדים מעל 1,000 אירועים ללא תקלות ב-production.

לפני deployment, בדקו את ה-webhook עם Postman או curl על ידי שליחת בקשת POST עם החתימה הנכונה. ודאו שה-handler מחזיר 200 ושהמטמון עבר אינבלידציה. כמו כן, בדקו טיפול בשגיאות: אם Algolia למטה, ה-webhook לא צריך לקרוס — השתמשו ב-try-catch ותור retry.

מה כלול בהתקנה סוהר

רכיב תיאור לוח זמנים
ISR Webhook הגדרת Endpoint, אימות חתימה, אינבלידציית cache של Next.js 0.5 יום ($500)
סנכרון Algolia אינדוקס מלא + עדכונים אינקרמנטליים דרך webhook יום אחד ($1000)
התראות (Slack/Telegram) הגדרת ערוץ, עיצוב הודעות 0.5 יום ($500)
תיעוד README עם ארכיטקטורה, משתני סביבה, מדריך deployment כלול
תמיכה לאחר השקה שבועיים של ניטור ותיקון באגים כלול

לוח זמנים משוער: 0.5 עד 3 ימים תלוי במספר האינטגרציות. העלות מחושבת באופן אישי. החיסכון בתשתית לאחר יישום webhooks הוא משמעותי ($200–$500 בחודש). צרו קשר להערכה מדויקת לפרויקט שלכם.

למדו עוד על Sanity Webhooks תיעוד Sanity Webhooks.

צרו קשר לייעוץ — נעזור לכם להקים אינטגרציית Sanity חזקה עם הסטack שלכם. הניסיון שלנו: 10+ שנים עם Next.js ו-Sanity, 50+ פרויקטים שהושלמו. אנחנו מבטיחים תיעוד ותמיכה לאחר השקה. בקשו ביקורת ארכיטקטורה כדי לזהות צווארי בקבוק.