קטלוג השירותים

כל שירות של Wizzo Market ואיפה הליבה נוגעת בו (מפתח, ספרייה, נקודת קצה), יחד עם ה-API של poolse_client וה-API של spam_filter

⏱ 7 דק' קריאה 1215 מילים ערוך דף זה ב-GitHub

הדף הזה הוא מפת הדרכים בין שירותי Wizzo Market לבין הקוד של הליבה שמשתמש בהם. לכל שירות מופיע השם שלו ב-market_service, הנקודה בליבה שקוראת אותו, ומה קורה כשהוא לא פעיל. בהמשך מתועדים שני ה-API שמפתח אתר מפעיל בעצמו: poolse_client (דיוור) ו-spam_filter (סינון ספאם בטפסים).

הכלל המשותף: כל שירות נבדק עם market_service::is_active("<service>"), והמפתח נלקח מ-market_service::api_key("<service>"). על המנגנון עצמו ראו סקירת Wizzo Market.

השירותים ונקודות המגע בליבה#

שם בקובץמוצרנקודות מגע בליבה
wizzoaiWizzoAI, מודלי שפה ומנוע הסוכניםwizzo_ai, ai_agents_lib, controllers/wizzoai_api.php, שדות ai() בטפסים, panel_table (הוספה בעזרת AI), העלאת תמונות מ-admin/storage. ראו AI בטפסים ו-סוכני AI
mcpשער ה-MCP של האתרcontrollers/mcp.php מחזיר 403 כשהשירות לא פעיל. ראו MCP, סקירה
seoadvisorSEOK, יועץ ה-SEO המאוחסןSeoHosted, controllers/connector.php, controllers/seo_runner.php. ראו SEO suite
olegאולג, שומר הבריאות והביצועיםOlegHosted, controllers/perf_runner.php, פעולת oleg_ready ב-connector. ראו בריאות וביצועים
wizzopoolsePOOLSE, דיוור ואוטומציותlibraries/poolse_client.php, libraries/mail_tpl.php (שליחה טרנזקציונית), וידג'ט בדף הבית של הפאנל, admin/poolse_media.php
pooshPOOSH, הודעות Pushוידג'ט בדף הבית של הפאנל, ה-service worker /poosh-sw.js (ב-ROUTER). בטבלת הכלים: services_poosh_stats
kamaKAMA (ברשימות ישנות: wizzoradar), מעקב תקשורת וטלמטריית גלישהpanel_table (radar_tracking, radar_api_key), וידג'ט בדף הבית של הפאנל
wizzonowWizzoNow, צ'אט ונוכחות מנהלים בזמן אמתadmin/admin_chat.php (פרסום אירועים), Form, panel_table (מעקב בזמן אמת), ערכת הנושא של הפאנל
wizzostreamWizzoStream, אירוח וידאוהשדה FormInput_WizzoStream (מפתח ברירת מחדל מהמרקט)
newpageNEWPAGE, דפי נחיתה מאוחסניםcontrollers/newpage_public.php (הכתובת /p/{slug}), admin/newpage_media.php, ו-ROUTER עבור pg.js/pg.css
pilotPilot, ווידג'ט צ'אטROUTER מגיש את /pjs.js כפרוקסי עם מטמון
targetTARGETadmin/target_media.php (העלאת קבצים ל-storage/target)
whatsappWhatsAppוידג'ט בדף הבית של הפאנל
enableENABLE, ווידג'ט נגישותmarket_service::enable_config ו-system/accessibility_config.json
spamguardSpamGuard, סינון ספאם גלובליlibraries/spam_filter.php
הערה

שירות אחד יכול להופיע בקובץ בשם ישן. market_service::ALIASES מתרגם בשני הכיוונים בין poosh ל-wizzopoosh, ובין kama ל-wizzoradar, והמרקט שולח את השם החדש רק לליבה 5.0.111 ומעלה (KAMA) או 5.0.53 ומעלה (POOSH). קוד שלכם צריך לקרוא דרך market_service ולא להשוות שמות בעצמו.

נקודות קצה ציבוריות ושירותים#

נקודת קצהקובץמה היא עושה
/p/{slug}controllers/newpage_public.phpמושכת את הדף מ-NEWPAGE לפי המפתח הציבורי של האתר, עם מטמון של דקה. ?_npprv=<token> היא תצוגה מקדימה שלא נשמרת במטמון
/pg.js, /pg.csscollections/ROUTER.phpפרוקסי עם מטמון לנכסי NEWPAGE
/pjs.jscollections/ROUTER.phpפרוקסי עם מטמון לווידג'ט של Pilot. כישלון בשליפה לא נשמר כגוף ריק
/poosh-sw.jscollections/ROUTER.phpה-service worker של POOSH מ-assets/wizzo_poosh/
טיפ

שתי הכתובות NEWPAGE_BASE ו-PILOT_BASE אפשר להגדיר כקבועים (define) לפני טעינת הליבה, למשל ב-CONFIG_USER, כדי להפנות סביבת בדיקה לשרת אחר. בלי הגדרה, ברירות המחדל הן https://newpage.wizzo.media ו-https://pilot.wizzo.media.

שימו לב

וידג'טים בדף הבית של הפאנל (KAMA, POOLSE, POOSH, WhatsApp) מדפיסים את המפתח של השירות לתוך JavaScript בצד הלקוח, כך שכל מנהל עם הרשאת צפייה בווידג'ט רואה אותו. ב-POOLSE זה מפתח שמאפשר פעולות בשם האתר. אל תתנו הרשאת ווידג'טים למי שלא אמור להחזיק את המפתח (SVC-09).

poolse_client: דיוור מהקוד#

הקובץ: libraries/poolse_client.php. כל הקריאות הן best-effort: תקלה ב-POOLSE לא שוברת את תהליך האתר. התוצאות הן false (השירות לא נגיש או שגיאת שרת) או ["error" => ..., "http" => ...] (סירוב של השרת, קוד 4xx), ולא חריגה.

מפתח ו-URL נקבעים כך: הפרמטרים poolse_api_key ו-poolse_api_url ב-CRM_params גוברים על ההפעלה במרקט (כך אתר יכול להצביע על tenant משלו). בלי פרמטר, המפתח מגיע מהשירות wizzopoolse.

מתודהחתימההערות
activepoolse_client::active()true אם יש פרמטר poolse_api_key או שהשירות wizzopoolse פעיל
api_keypoolse_client::api_key()מחרוזת ריקה כשאין מפתח
base_urlpoolse_client::base_url()כתובת ה-API כולל סיומת /api/
subscribepoolse_client::subscribe($data)$data["email"] חובה, אחרת false. שדות: first_name, last_name, phone, attributes, list_ids, tag_ids, consent, evidence. מוסיפה אוטומטית source, ip, user_agent ו-evidence.page
eventpoolse_client::event($email, $event_name, $data = [])מפעיל אוטומציה מסוג api_event
contactpoolse_client::contact($email)מערך איש הקשר או false
unsubscribepoolse_client::unsubscribe($email, $source = "site")מסיר מכל השיווק. true אם כבר היה מוסר
list_idpoolse_client::list_id($name)מזהה הרשימה לפי שם, ונוצרת אם אין. 0 כשהשירות לא נגיש. המטמון הוא לבקשה אחת בלבד
transactionalpoolse_client::transactional($to, $subject, $html, $opts = [])הודעה אחת לכתובת אחת, מיד. מחזירה ["status"=>"sent","message_id"=>...] או ["error"=>...]
campaignpoolse_client::campaign($subject, $html, $list_ids, $opts = [])יוצרת קמפיין ושולחת לרשימות. מחזירה ["campaign_id","recipients"] או ["error"]
postpoolse_client::post($path, $body)קיצור ל-req("POST", ...)
reqpoolse_client::req($method, $path, $body = null, $timeout = 6)הקריאה הגולמית. false כשאין מפתח, כשאין חיבור או בקוד 5xx

אפשרויות ל-transactional ($opts): reply_to, first_name, last_name, external_id, sender_id, vars, attachments (רשימה של filename ו-content ב-base64) ו-calendar (content ו-filename של קובץ .ics). אפשרויות ל-campaign: name, is_advertisement (ברירת מחדל true), sender_id, reply_to, preheader, created_by.

$this->load->library("poolse_client");

if (poolse_client::active())
{
    $list = poolse_client::list_id("newsletter");
    poolse_client::subscribe([
        "email"      => $email,
        "first_name" => $name,
        "list_ids"   => [$list],
    ]);

    $r = poolse_client::transactional($email, "Your code", "<p>Code: 123456</p>");
    if (isset($r["error"])) error_log("poolse refused: " . $r["error"]);
}
שימו לב
transactional מיועדת להודעות שהמשתמש ביקש (קוד כניסה, אישור הזמנה). היא מגיעה גם למי שלא אישר דיוור שיווקי, ולכן אסור להשתמש בה לתוכן פרסומי. תוכן כזה עובר ב-campaign, ורק אל רשימות של מי שנתן הסכמה.

אזהרה
campaign יוצרת ושולחת בפועל, באותה קריאה, לכל הנמענים ברשימות. אל תריצו אותה בבדיקות על רשימה אמיתית. גוף ה-HTML חייב להכיל {{unsubscribe_url}} או {{footer_html}}, אחרת POOLSE מסרבת. כששליחה נכשלת הקמפיין נשאר טיוטה ב-POOLSE ומזהה הקמפיין חוזר ב-campaign_id של התשובה. ב-subscribe העבירו consent => null כשאתם מסנכרנים קהל קיים, כדי לא להחזיר לרשימה מי שביטל הרשמה.

spam_filter: סינון ספאם בטפסים#

הקובץ: libraries/spam_filter.php. הלקוח של SpamGuard, שירות גלובלי עם מאגר מוניטין משותף (https://spamdetector.wizzo.media). המפתח נלקח מהשירות spamguard, או מ-spam_filter::$api_key אם הגדרתם אותו ידנית. הספרייה פותחת כברירת מחדל: בכל תקלת רשת, חריגת זמן (1500ms), או היעדר מפתח, התוצאה היא verdict => "allow" עם ok => false, כך שליד אמיתי לא הולך לאיבוד כשהשירות למטה.

מתודהחתימההערות
is_activespam_filter::is_active()true אם יש מפתח
checkspam_filter::check($fields, $m_settings = [])מחזירה ["ok","verdict","score","check_id","reasons"]. הגדרות: js (האם הטופס כולל spamguard.js) ו-lang
feedbackspam_filter::feedback($check_id, $is_spam)משוב "זה ספאם / לא ספאם" לשירות. bool
get_checksspam_filter::get_checks($verdict = null, $limit = 50, $after = 0)הבדיקות של האתר לתיקיית הספאם ב-CRM. $verdict: quarantine, spam או null לכולן
get_api_keyspam_filter::get_api_key()המפתח הפעיל
site_slugspam_filter::site_slug()הדומיין בלי www., מזהה את האתר בשירות
$this->load->library("spam_filter");

$res = spam_filter::check([
    "name"    => $_POST["name"],
    "email"   => $_POST["email"],
    "phone"   => $_POST["phone"],
    "message" => $_POST["message"],
], ["js" => true]);

if ($res["verdict"] != "allow")
{
    // save the lead with an is_spam flag and skip the notification mail
}
הערה

תוכן הטופס (שם, אימייל, טלפון, הודעה) ופרטי הבקשה (כתובת IP, User-Agent, Referer) נשלחים לשירות הסינון. אם הפרטיות אצלכם מחייבת הצהרה על כך, ראו מארחים חיצוניים.

ראו גם#

מצאתם טעות או חוסר? תקנו את הדף או פתחו Issue בריפו. התיעוד נכתב מתוך הקוד של ליבה 5.0.115.