תיעוד סכמת מסד נתונים

תיעוד סכמת מסד נתונים

קהל יעד: מפתחים בכירים
גרסה: 1.0.0
עדכון אחרון: דצמבר 2024

סקירה כללית

WooAI Chatbot Pro מיישם אסטרטגיית שמירת נתונים היברידית המשלבת טבלאות MySQL מותאמות לנתוני עסקאות בנפח גבוה עם מנגנונים מקוריים של WordPress (options, transients, post meta) להגדרות ו-caching.

פילוסופיית ארכיטקטורה

סוג נתונים מנגנון אחסון נימוק
אירועים בתדירות גבוהה טבלאות מותאמות ביצועים, אינדוקס, פעולות bulk
מצב session טבלאות מותאמות שאילתות מורכבות, טיפול בפקיעת תוקף
embeddings וקטוריים טבלאות מותאמות + Supabase fallback מקומי, RAG חיצוני
הגדרות wp_options מקורי ל-WordPress, טעינה אוטומטית
Caching Transients תמיכה ב-TTL, אינטגרציית object cache
הגדרות Playbook Custom Post Type REST API, אינטגרציית WordPress UI

דיאגרמת ישויות-קשרים

                                    +------------------+
                                    |   wp_posts       |
                                    | (waa_playbook)   |
                                    +--------+---------+
                                             |
                                             | playbook_id
                                             v
+------------------+    session_id    +------------------+
|  wp_waa_events   |<---------------->| wp_waa_sessions  |
+------------------+                  +--------+---------+
| id (PK)          |                  | id (PK)          |
| session_id (FK)  |                  | session_id (UK)  |
| event_type       |                  | user_id (FK)     |
| event_data       |                  | ai_provider      |
| user_id (FK)     |                  | expires_at       |
| timestamp        |                  +------------------+
+------------------+                           |
                                               | session_id
                                               v
                                    +----------------------+
                                    | wp_waa_playbook_     |
                                    | sessions             |
                                    +----------------------+
                                    | id (PK)              |
                                    | session_id (FK)      |
                                    | playbook_id (FK)     |
                                    | current_step_index   |
                                    | status (ENUM)        |
                                    +----------------------+

+------------------+                  +------------------+
| wp_waa_vector_   |                  | wp_waa_rag_index |
| index            |                  +------------------+
+------------------+                  | id (PK)          |
| id (PK)          |                  | content_type     |
| product_id (FK)  |  sync/fallback   | content_id (FK)  |
| embedding_id     |<---------------->| embedding_vector |
| embedding_model  |                  | metadata_json    |
| metadata_json    |                  +------------------+
+------------------+

+------------------+
| wp_waa_overrides |
+------------------+
| id (PK)          |
| override_type    |
| entity_id        |
| settings_json    |
| created_by (FK)  |
+------------------+

טבלאות מותאמות

כל הטבלאות משתמשות בקידומת טבלאות של WordPress (בדרך כלל wp_) ונוצרות דרך dbDelta() למיגרציות בטוחות ו-idempotent.

wp_waa_events

מטרה: מעקב אחר אירועים בתדירות גבוהה לאנליטיקה של KPI וניתוח משפך המרה.

CREATE TABLE {prefix}waa_events (
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    session_id VARCHAR(255) NOT NULL,
    event_type VARCHAR(50) NOT NULL,
    event_data LONGTEXT,
    user_id BIGINT(20) UNSIGNED NULL,
    timestamp DATETIME NOT NULL,
    PRIMARY KEY (id),
    KEY idx_session (session_id),
    KEY idx_type (event_type),
    KEY idx_timestamp (timestamp),
    KEY idx_user (user_id)
) {charset_collate};

מפרטי עמודות

עמודה סוג Nullable תיאור
id BIGINT UNSIGNED לא מפתח ראשי אוטומטי
session_id VARCHAR(255) לא הפניה ל-chat session (פורמט UUID)
event_type VARCHAR(50) לא סיווג אירוע (ראו סוגי אירועים למטה)
event_data LONGTEXT כן payload של JSON עם נתונים ספציפיים לאירוע
user_id BIGINT UNSIGNED כן מזהה משתמש WordPress (NULL לאורחים)
timestamp DATETIME לא זמן התרחשות אירוע (פורמט MySQL)

סוגי אירועים

// אירועי ליבה
'chat_started'      // אתחול Session
'message_sent'      // הודעת משתמש נשלחה
'message_received'  // תגובת AI נמסרה
'chat_ended'        // סיום Session

// אירועי המרה
'product_clicked'   // לחיצה על קישור מוצר
'product_viewed'    // צפייה בפרטי מוצר
'cart_added'        // מוצר נוסף לעגלה
'checkout_started'  // התחלת checkout
'order_completed'   // רכישה הושלמה

// אירועי engagement
'playbook_started'  // זרימה מודרכת התחילה
'playbook_completed'// זרימה מודרכת הסתיימה
'rating_submitted'  // משוב משתמש התקבל

אסטרטגיית אינדקס

אינדקס עמודות מטרה
PRIMARY id זיהוי שורה ייחודי
idx_session session_id שליפת אירועי session
idx_type event_type אגרגציה לפי סוג אירוע
idx_timestamp timestamp שאילתות טווח זמן, ניקוי
idx_user user_id ניתוח פעילות משתמש

מדיניות שמירה

אירועים ישנים מ-90 יום נמחקים אוטומטית דרך ניקוי מתוזמן:

// מבוצע יומית דרך wp-cron
$database->clear_old_events( 90 );

דוגמת נתונים

{
    "id": 12847,
    "session_id": "550e8400-e29b-41d4-a716-446655440000",
    "event_type": "product_clicked",
    "event_data": {
        "product_id": 1234,
        "product_name": "Wireless Headphones",
        "price": 79.99,
        "source": "ai_recommendation"
    },
    "user_id": 42,
    "timestamp": "2025-12-15 14:32:18"
}

wp_waa_sessions

מטרה: אחסון מתמיד עבור chat sessions עם היסטוריית שיחה מלאה ונתוני הקשר.

CREATE TABLE {prefix}waa_sessions (
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    session_id VARCHAR(255) NOT NULL,
    user_id BIGINT(20) UNSIGNED NULL,
    conversation_history LONGTEXT,
    context_data LONGTEXT,
    ai_provider VARCHAR(50),
    model_used VARCHAR(100),
    created_at DATETIME NOT NULL,
    updated_at DATETIME NOT NULL,
    expires_at DATETIME,
    PRIMARY KEY (id),
    UNIQUE KEY unique_session (session_id),
    KEY idx_user (user_id),
    KEY idx_created (created_at),
    KEY idx_expires (expires_at)
) {charset_collate};

מפרטי עמודות

עמודה סוג Nullable תיאור
id BIGINT UNSIGNED לא מפתח ראשי אוטומטי
session_id VARCHAR(255) לא מזהה session ייחודי (UUID)
user_id BIGINT UNSIGNED כן מזהה משתמש WordPress (NULL לאורחים)
conversation_history LONGTEXT כן מערך JSON של אובייקטי הודעות
context_data LONGTEXT כן אובייקט JSON עם עגלה, מוצרים שנצפו וכו’
ai_provider VARCHAR(50) כן ספק פעיל: gemini, claude, openai
model_used VARCHAR(100) כן מודל ספציפי: gemini-2.5-flash-lite
created_at DATETIME לא חותמת זמן יצירת session
updated_at DATETIME לא חותמת זמן פעילות אחרונה
expires_at DATETIME כן פקיעת תוקף session (NULL = ללא פקיעה)

מחזור חיי Session

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   CREATED   │────>│   ACTIVE    │────>│   EXPIRED   │
└─────────────┘     └─────────────┘     └─────────────┘
                          │
                          v
                    ┌─────────────┐
                    │   CLEANED   │
                    └─────────────┘
  1. Created: Session אותחל בהודעת משתמש ראשונה
  2. Active: הודעות מוחלפות, updated_at מתרענן
  3. Expired: expires_at עבר (ברירת מחדל: שעה של חוסר פעילות)
  4. Cleaned: הוסר על ידי משימת ניקוי מתוזמנת

טיפול בפקיעת תוקף

// משך session ברירת מחדל
$expires_at = gmdate( 'Y-m-d H:i:s', strtotime( '+1 hour' ) );

// ניקוי sessions שפג תוקפם
$deleted_count = $database->clear_expired_sessions();

מבנה נתוני הקשר

{
    "cart_items": [
        {"product_id": 123, "quantity": 2, "price": 29.99}
    ],
    "viewed_products": [456, 789, 123],
    "current_page": "product",
    "current_product_id": 456,
    "user_preferences": {
        "language": "en",
        "currency": "USD"
    }
}

wp_waa_vector_index

מטרה: מיפוי מוצרי WooCommerce ל-vector embeddings חיצוניים המאוחסנים ב-Supabase pgvector.

CREATE TABLE {prefix}waa_vector_index (
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    product_id BIGINT(20) UNSIGNED NOT NULL,
    embedding_id VARCHAR(255),
    embedding_model VARCHAR(100),
    metadata_json LONGTEXT,
    indexed_at DATETIME NOT NULL,
    PRIMARY KEY (id),
    KEY idx_product (product_id),
    KEY idx_embedding (embedding_id),
    KEY idx_indexed (indexed_at)
) {charset_collate};

מפרטי עמודות

עמודה סוג Nullable תיאור
id BIGINT UNSIGNED לא מפתח ראשי אוטומטי
product_id BIGINT UNSIGNED לא מזהה מוצר WooCommerce
embedding_id VARCHAR(255) כן UUID של רשומת וקטור Supabase
embedding_model VARCHAR(100) כן מודל בשימוש: text-embedding-3-small
metadata_json LONGTEXT כן metadata מוצר ב-cache לחיפוש
indexed_at DATETIME לא חותמת זמן סנכרון אחרון

קשר עם Supabase

WordPress (wp_waa_vector_index)     Supabase (embeddings table)
+---------------------------+       +---------------------------+
| product_id: 123           |       | id: uuid-abc-123          |
| embedding_id: uuid-abc-123|<----->| embedding: [0.12, 0.34...]|
| metadata_json: {...}      |       | content: "Product desc"   |
+---------------------------+       +---------------------------+

wp_waa_overrides

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

CREATE TABLE {prefix}waa_overrides (
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    override_type VARCHAR(50) NOT NULL,
    entity_id VARCHAR(100) NOT NULL,
    settings_json LONGTEXT,
    created_by BIGINT(20) UNSIGNED,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NOT NULL,
    PRIMARY KEY (id),
    KEY idx_type (override_type),
    KEY idx_entity (entity_id),
    KEY idx_type_entity (override_type, entity_id),
    KEY idx_created_by (created_by)
) {charset_collate};

סוגי Override

סוג פורמט Entity ID מקרה שימוש
playbook מזהה post של Playbook התנהגות playbook מותאמת
topic slug נושא הוראות AI ספציפיות לנושא
promotion מזהה מוצר/קטגוריה הגדרות הגברת קידום
category מזהה קטגוריה WC הקשר AI ברמת קטגוריה

דוגמת Settings JSON

{
    "priority_boost": 10,
    "custom_prompt": "Always mention free shipping...",
    "enabled_pages": ["shop", "product"],
    "excluded_products": [123, 456]
}

wp_waa_rag_index

מטרה: fallback של vector embeddings מקומי כאשר Supabase לא זמין או להתקנות on-premise.

CREATE TABLE {prefix}waa_rag_index (
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    content_type VARCHAR(50) NOT NULL,
    content_id BIGINT(20) UNSIGNED NOT NULL,
    content_text LONGTEXT,
    embedding_vector LONGTEXT,
    metadata_json LONGTEXT,
    indexed_at DATETIME NOT NULL,
    PRIMARY KEY (id),
    KEY idx_content (content_type, content_id),
    KEY idx_type (content_type),
    KEY idx_indexed (indexed_at)
) {charset_collate};

סוגי תוכן

סוג תיאור
product מוצר WooCommerce
page עמוד WordPress
post פוסט WordPress
category קטגוריית מוצר
faq ערכי FAQ

אחסון Embedding Vector

וקטורים מאוחסנים כמערכי float מקודדי JSON:

{
    "embedding_vector": "[0.0123, -0.0456, 0.0789, ...]",
    "dimensions": 384
}

הערה: לפרודקשן עם יותר מ-10k מוצרים, Supabase pgvector מומלץ לחיפוש דמיון יעיל.


wp_waa_playbook_sessions

מטרה: ניהול מצב עבור זרימות שיחה מודרכות רב-שלביות (playbooks).

CREATE TABLE {prefix}waa_playbook_sessions (
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    session_id VARCHAR(64) NOT NULL,
    playbook_id BIGINT(20) UNSIGNED NOT NULL,
    current_step_index INT(11) NOT NULL DEFAULT 0,
    step_responses LONGTEXT DEFAULT NULL,
    collected_variables LONGTEXT DEFAULT NULL,
    status ENUM('active','paused','completed','expired','abandoned') NOT NULL DEFAULT 'active',
    started_at DATETIME NOT NULL,
    expires_at DATETIME NOT NULL,
    last_activity_at DATETIME NOT NULL,
    PRIMARY KEY (id),
    KEY idx_session_status (session_id, status),
    KEY idx_expires (expires_at),
    KEY idx_playbook_id (playbook_id),
    KEY idx_last_activity (last_activity_at)
) {charset_collate};

מצבי Status

Status תיאור
active משתמש כרגע בזרימת playbook
paused משתמש עזב זמנית באמצע הזרימה
completed כל הצעדים הושלמו בהצלחה
expired timeout של 24 שעות נחרג
abandoned משתמש יצא במפורש או סגר את הצ’אט

דוגמת ניהול מצב

{
    "session_id": "abc-123",
    "playbook_id": 42,
    "current_step_index": 2,
    "step_responses": [
        {"step": 0, "response": "Blue", "timestamp": "2025-12-15T10:00:00Z"},
        {"step": 1, "response": "Large", "timestamp": "2025-12-15T10:01:00Z"}
    ],
    "collected_variables": {
        "color": "Blue",
        "size": "Large",
        "email": "user@example.com"
    },
    "status": "active"
}

WordPress Options

הגדרות תוסף מאוחסנות בטבלת wp_options באמצעות WordPress Options API.

woo_ai_chatbot_settings

סוג: מחרוזת JSON
Autoload: כן

$settings = json_decode( get_option( 'woo_ai_chatbot_settings', '{}' ), true );

מבנה

{
    "ai_provider": "gemini",
    "model": "gemini-2.5-flash-lite",
    "chat_enabled": true,
    "widget_position": "bottom-right",
    "max_session_duration": 3600,
    "max_conversation_history": 50,
    "enable_rag": true,
    "enable_analytics": true,
    "license_status": "active",
    "trial_expires": 1735689600
}

woo_ai_chatbot_version

סוג: String
דוגמה: "0.1.0"

עוקב אחר גרסת התוסף המותקנת עבור שגרות שדרוג.

woo_ai_chatbot_license

סוג: Array (serialized)

[
    'key'          => 'encrypted_key_data',
    'key_hash'     => 'sha256_hash',
    'status'       => 'active',
    'type'         => 'remote',
    'plan'         => 'pro',
    'expires_at'   => '2026-12-31',
    'domain'       => 'domain_hash',
    'activated_at' => '2025-01-15 10:30:00',
    'checksum'     => 'integrity_checksum'
]

אפשרויות Widget

אפשרויות בודדות לתאימות לאחור:

מפתח Option סוג ברירת מחדל תיאור
woo_ai_chat_enabled bool true נראות widget
woo_ai_chat_position string bottom-right מיקום widget
woo_ai_chat_welcome_message string מותאם לשפה ברכה ראשונית
woo_ai_chat_show_mobile bool true תצוגה במובייל
woo_ai_chat_show_desktop bool true תצוגה בדסקטופ
woo_ai_chat_disable_cart_checkout bool false הסתרה בעגלה/checkout
woo_ai_chat_excluded_pages array [] מזהי עמודים להחרגה

Transients ו-Caching

Transients מספקים caching מבוסס TTL עם אינטגרציית object cache אוטומטית.

Cache סטטיסטיקות שימוש

// Key: woo_ai_chatbot_stats_{period}
// TTL: שעה אחת
$stats = get_transient( 'woo_ai_chatbot_stats_daily' );

Cache עדיפות ספקים

// Key: woo_ai_priority_order
// TTL: שעה אחת
// Structure: ['gemini', 'claude', 'openai']
set_transient( self::PRIORITY_CACHE_KEY, $priority, HOUR_IN_SECONDS );

Cache סטטוס רישיון

// Key: woo_ai_license_status
// TTL: 72 שעות
// Values: 'active', 'inactive', 'trial'
set_transient( self::CACHE_KEY, 'active', 72 * HOUR_IN_SECONDS );

הגבלת קצב

// Key: woo_ai_chatbot_rate_{session_id}
// TTL: 60 שניות
// עוקב אחר ספירת בקשות לכל session
$count = (int) get_transient( $cache_key );
set_transient( $cache_key, $count + 1, 60 );

נעילת אינדוקס

// Key: woo_ai_chatbot_indexing
// TTL: 30 דקות
// מונע פעולות אינדוקס בו-זמניות
set_transient( 'woo_ai_chatbot_indexing', true, 30 * MINUTE_IN_SECONDS );

Cache Playbook

// Key: woo_ai_playbooks_cache
// TTL: שעה אחת
// Caches הגדרות playbook פעילות
set_transient( self::CACHE_KEY, $playbooks, HOUR_IN_SECONDS );

Custom Post Types

waa_playbook

Post Type Slug: waa_playbook
REST Base: /wp-json/wp/v2/waa-playbooks

register_post_type( 'waa_playbook', [
    'public'       => false,
    'show_in_rest' => true,
    'rest_base'    => 'waa-playbooks',
    'supports'     => ['title', 'custom-fields'],
    'capabilities' => ['manage_woocommerce'],
] );

שדות Meta רשומים

מפתח Meta סוג תיאור
_waa_intent string ביטוי/intent הפעלה
_waa_priority integer עדיפות 0-100 (ברירת מחדל: 50)
_waa_steps string (JSON) מערך הגדרות צעדים
_waa_conditions string (JSON) תנאי הפעלה
_waa_trigger string auto או manual
_waa_status string draft או active

מבנה JSON של צעדים

[
    {
        "id": "step_1",
        "type": "question",
        "message": "What color do you prefer?",
        "options": ["Red", "Blue", "Green"],
        "variable": "color",
        "required": true
    },
    {
        "id": "step_2",
        "type": "action",
        "action": "show_products",
        "filters": {"color": "{{color}}"}
    }
]

מיגרציית נתונים

מעקב גרסאות

גרסת סכמת מסד נתונים נעקבת בנפרד מגרסת התוסף:

private const DB_VERSION = '1.0.0';
private const DB_VERSION_OPTION = 'woo_ai_chatbot_db_version';

זרימת מיגרציה

public function create_tables() {
    $current = get_option( self::DB_VERSION_OPTION, '0.0.0' );

    if ( version_compare( $current, '1.0.0', '<' ) ) {
        // יצירת סכמה ראשונית
        $this->create_events_table();
        $this->create_sessions_table();
        // ...
    }

    if ( version_compare( $current, '1.1.0', '<' ) ) {
        // הוספת עמודה חדשה
        $this->migrate_to_1_1_0();
    }

    update_option( self::DB_VERSION_OPTION, self::DB_VERSION );
}

הוספת עמודות חדשות

private function migrate_to_1_1_0() {
    global $wpdb;

    $table = $wpdb->prefix . 'waa_sessions';

    // בדיקה אם העמודה קיימת
    $column_exists = $wpdb->get_var(
        "SHOW COLUMNS FROM {$table} LIKE 'sentiment_score'"
    );

    if ( ! $column_exists ) {
        $wpdb->query(
            "ALTER TABLE {$table}
             ADD COLUMN sentiment_score FLOAT NULL
             AFTER model_used"
        );
    }
}

דוגמאות שאילתות

שליפת Session עם אירועים

global $wpdb;
$prefix = $wpdb->prefix;

$session = $wpdb->get_row(
    $wpdb->prepare(
        "SELECT s.*,
                COUNT(e.id) as event_count,
                MAX(e.timestamp) as last_event
         FROM {$prefix}waa_sessions s
         LEFT JOIN {$prefix}waa_events e ON s.session_id = e.session_id
         WHERE s.session_id = %s
         GROUP BY s.id",
        $session_id
    ),
    ARRAY_A
);

אנליטיקה: משפך המרה

$funnel = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT
            event_type,
            COUNT(*) as count,
            COUNT(DISTINCT session_id) as unique_sessions
         FROM {$prefix}waa_events
         WHERE timestamp >= %s
           AND event_type IN ('chat_started', 'product_clicked', 'cart_added', 'order_completed')
         GROUP BY event_type
         ORDER BY FIELD(event_type, 'chat_started', 'product_clicked', 'cart_added', 'order_completed')",
        $start_date
    ),
    ARRAY_A
);

Sessions Playbook פעילים

$active_sessions = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT ps.*, p.post_title as playbook_name
         FROM {$prefix}waa_playbook_sessions ps
         JOIN {$prefix}posts p ON ps.playbook_id = p.ID
         WHERE ps.status = 'active'
           AND ps.expires_at > %s
         ORDER BY ps.last_activity_at DESC
         LIMIT %d",
        current_time( 'mysql' ),
        100
    ),
    ARRAY_A
);

ביצועים: הכנסת אירועים ב-bulk

// שימוש ב-INSERT בודד עם ערכים מרובים לפעולות bulk
$values = [];
$placeholders = [];

foreach ( $events as $event ) {
    $placeholders[] = '(%s, %s, %s, %d, %s)';
    $values[] = $event['session_id'];
    $values[] = $event['event_type'];
    $values[] = wp_json_encode( $event['data'] );
    $values[] = $event['user_id'];
    $values[] = $event['timestamp'];
}

$sql = "INSERT INTO {$prefix}waa_events
        (session_id, event_type, event_data, user_id, timestamp)
        VALUES " . implode( ', ', $placeholders );

$wpdb->query( $wpdb->prepare( $sql, $values ) );

ניקוי: הסרת נתונים ישנים

// הסרת sessions שפג תוקפם והאירועים שלהם באופן אטומי
$wpdb->query( 'START TRANSACTION' );

try {
    // קבלת מזהי session שפג תוקפם
    $expired = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT session_id FROM {$prefix}waa_sessions
             WHERE expires_at < %s",
            current_time( 'mysql' )
        )
    );

    if ( ! empty( $expired ) ) {
        $placeholders = implode( ',', array_fill( 0, count( $expired ), '%s' ) );

        // מחיקת אירועים קשורים
        $wpdb->query(
            $wpdb->prepare(
                "DELETE FROM {$prefix}waa_events
                 WHERE session_id IN ({$placeholders})",
                $expired
            )
        );

        // מחיקת sessions
        $wpdb->query(
            $wpdb->prepare(
                "DELETE FROM {$prefix}waa_sessions
                 WHERE session_id IN ({$placeholders})",
                $expired
            )
        );
    }

    $wpdb->query( 'COMMIT' );
} catch ( Exception $e ) {
    $wpdb->query( 'ROLLBACK' );
    throw $e;
}

שיקולי ביצועים

שימוש באינדקסים

תמיד אמתו ששאילתות משתמשות באינדקסים מתאימים:

EXPLAIN SELECT * FROM wp_waa_events
WHERE event_type = 'product_clicked'
AND timestamp > '2025-12-01';

טיפים לאופטימיזציית שאילתות

  1. השתמשו ב-LIMIT: תמיד עשו pagination לקבוצות תוצאות גדולות
  2. הימנעו מ-SELECT *: בקשו רק עמודות נדרשות
  3. Prepared Statements: תמיד השתמשו ב-$wpdb->prepare()
  4. פעולות Batch: השתמשו ב-INSERT/DELETE רב-שורתי
  5. מודעות לאינדקס: מבנו סעיפי WHERE להתאמה לאינדקסים

גדלי טבלה מומלצים

טבלה מקסימום שורות מומלץ פעולה בסף
waa_events 1,000,000 ניקוי אגרסיבי של 30 יום
waa_sessions 100,000 הפעלת ניקוי שעתי
waa_playbook_sessions 50,000 שמירה של 7 ימים

אבטחה

מניעת SQL Injection

// תמיד השתמשו ב-prepared statements
$result = $wpdb->get_var(
    $wpdb->prepare(
        "SELECT COUNT(*) FROM {$table} WHERE user_id = %d",
        $user_id
    )
);

// לעולם אל תעשו את זה
$wpdb->query( "DELETE FROM {$table} WHERE id = {$id}" ); // לא בטוח

סניטציית נתונים

$session_id = sanitize_text_field( $_POST['session_id'] );
$user_id    = absint( $_POST['user_id'] );
$event_data = wp_json_encode( $data ); // מבצע escape אוטומטי

תיעוד קשור


מחבר: צוות פיתוח WooAI
צור קשר: leowebmark@gmail.com