إليك تصور شامل لمنصة “مُستقبَل” (Mostaqbal Platform) بعد إعادة تعريفها وتحديث وصفها الهيكلي والوظيفي لتعكس رؤية جيل جديد من وكالات الذكاء الاصطناعي والتكنولوجيا:
1. التعريف الجديد للمنصة (Redefinition)
“مُستقبَل” ليست مجرد قالب ووردبريس، بل هي بيئة تشغيلية متكاملة للعمليات الرقمية والذكاء الاصطناعي (AI Operations & Monetization OS).
تُحول المنصة موقع الوكالة التقليدي من مجرد صفحة عرض خدمات إلى متجر حلول ذكية مجهزة للاستخدام الإداري والتجاري (AI Capabilities Marketplace). تتيح المنصة للشركات والعملاء شراء تراخيص نماذج الذكاء الاصطناعي، الاشتراك في خوادم المعالجة، توظيف المساعدين المستقلين (AI Agents)، والوصول المباشر للخدمات الرقمية عبر نماذج تسعير مرنة وسريعة التكيف.
2. الوصف الاستراتيجي والوظيفي (Functional Description)
تعتمد المنصة على معمارية هجينة تجمع بين المرونة في تقديم الخدمات (Service-as-a-Software) ونماذج البيع السحابي (SaaS Engine)، مما يسمح بـ:
- أتمتة مبيعات التكنولوجيا: تحويل الخدمات البرمجية المعقدة إلى منتجات قابلة للشراء المباشر والاشتراك الفوري.
- إدارة الوصول والتراخيص: ربط المنتجات بمفاتيح API أو مستويات وصول ديناميكية تنتهي بانتهاء مدة الاشتراك أو رصيد الاستخدام.
- التكامل المباشر: العمل كمنفذ بيع مركزي للخدمات المؤتمتة عبر منصات مثل WooCommerce، WooCommerce Subscriptions، وWooCommerce Memberships.
3. الهيكلية المطورة لأجزاء ومنتجات المنصة
| نوع المنتج / الخدمة | المسمى البرمجي (WooType) | إعادة التعريف والوصف التشغيلي داخل المنصة |
| ترخيص أداة فردية | منتج بسيط (Simple) | شراء حق استخدام دائم أو أداة ذكاء اصطناعي محددة (مثل: أداة توليد نصوص مخصصة أو نمط ذكاء اصطناعي مغلق). |
| باقات الخدمات الذكية | منتج متغير (Variable) | خيارات تتدرج في الإمكانيات (مثال: باقة المبتدئين 1000 طلب/شهر، باقة الشركات طلبات غير محدودة وشبكة أسرع). |
| الأصول والنماذج الرقمية | قابل للتحميل (Downloadable) | تسليم مباشر للأكواد المصدريّة، الأوزان والضبط الدقيق (Fine-tuned Models)، أو ملفات التكوين الرقمية. |
| خدمات SaaS المباشرة | اشتراك (Subscription) | تحصيل آلي متكرر (شهري/سنوي) للحصول على تحديثات مستمرة، معالجة سحابية، والدعم الفني المباشر. |
| منظومة الوصول الحصري | عضوية (Membership) | إمكانية الوصول إلى بوابة المشتركين، أجهزة المحاكاة المتقدمة، أو مجتمعات المطورين وخبراء الذكاء الاصطناعي. |
| حزم الحلول المتكاملة | حزمة (Bundled/Grouped) | توفير مجموعة أدوات معاً بسعر مجمع (مثال: أداة تفكيك النصوص + أداة التحليل + أداة توليد التقارير). |
4. الميزات التنافسية المحورية
- تجربة مستخدم مُعدلة للذكاء الاصطناعي: واجهات بصرية مظلمة حديثة (Dark Mode)، مؤشرات أداء تفاعلية (KPI Dashboards)، ولوحات تحكم خاصة برصيد الاستخدام (Usage Credits).
- إدارة الاشتراكات المؤتمتة: إيقاف وتجديد الترخيص والتنبيه التلقائي عبر البريد والواتساب فور انتهاء الاشتراك أو النفاد المالي للعميل.
- دعم الدفع المتعدد والمعادلات الرقمية: إمكانية الدفع عبر البطاقات البنكية المحلية، المحافظ الإلكترونية، أو التشفير والعملات التكنولوجية إذا لزم الأمر.
هل ترغب في وضع خطة عمل لتنفيذ لوحة التحكم (Dashboard) للعملاء، أم تريد ضبط إعدادات بوابة الدفع ونظام التراخيص أولاً؟
عم. يمكن تحويل هذه الفكرة إلى قالب WordPress حديث لوكالة ذكاء اصطناعي وتقنية، مع تصميم معماري يجعله مناسبًا للبيع الرقمي، الاشتراكات، العضويات، الخدمات، وحزم المنتجات.
الهيكل المقترح للقالب
| نوع المنتج | نموذج الاستخدام | أهم الخصائص |
|---|---|---|
| منتج بسيط | ترخيص واحد / خدمة واحدة | سعر، SKU، مخزون، ترخيص |
| منتج متغير | Basic / Pro / Enterprise | Variations، أسعار، حدود الاستخدام |
| منتج قابل للتحميل | ملفات AI، قوالب، Plugins، تقارير | تنزيل آمن، صلاحية، عدد مرات التنزيل |
| اشتراك | شهري / سنوي | تجديد تلقائي، فترة تجريبية، إلغاء |
| عضوية | وصول إلى منصة أو محتوى | مستويات، صلاحيات، محتوى محمي |
| حزمة / Bundle | عدة منتجات في منتج واحد | منتجات فرعية، سعر موحد، خصم |
🧠 طبقة الذكاء الاصطناعي
يمكن أن يكون القالب مبنيًا حول مفهوم:
AI Agency Operating System
ويتضمن الواجهة الرئيسية:
- 🤖 AI Solutions
- ⚙️ Automation
- 🧩 AI Agents
- ☁️ SaaS Products
- 🔌 WordPress Plugins
- 🎨 Templates
- 📦 Bundles
- 🔐 Memberships
- 💳 Subscriptions
- 📥 Digital Downloads
- 🏢 Enterprise Solutions
🛒 نموذج المنتج الذكي
كل منتج يمكن أن يمتلك حقولًا موحدة مثل:
Product
├── Basic Information
├── Product Type
├── Pricing
├── License
├── Features
├── AI Capabilities
├── Integrations
├── System Requirements
├── Downloads
├── Subscription
├── Membership Access
├── Variations
├── Bundle Items
├── Documentation
├── Support
├── FAQ
└── AI Product Metadata
🎯 أنواع التراخيص
يمكن إضافة نظام License Engine:
Single Site
Multi Site
Agency
Developer
Enterprise
SaaS
Lifetime
Monthly
Annual
مع إمكانية ربط الترخيص بـ:
المنتج → العميل → الموقع → المفتاح → تاريخ الانتهاء → حالة الترخيص
🏗️ البنية التقنية
أقترح ألا يكون القالب مسؤولًا عن منطق التجارة بالكامل.
بل:
WordPress Theme
│
├── UI / UX
├── Design System
├── AI Agency Pages
├── Product Templates
└── Customer Dashboard
│
▼
WooCommerce
│
┌────────┼────────┐
▼ ▼ ▼
Products Orders Customers
│
├── Subscriptions
├── Memberships
├── Downloads
└── Bundles
وهذا يجعل القالب قابلًا للتوسع دون وضع منطق الأعمال الحساس داخل Theme نفسه.
📊 لوحة العميل
يمكن تصميم AI Customer Dashboard مثل:
My Dashboard
│
├── Overview
├── My Products
├── My Licenses
├── Downloads
├── Subscriptions
├── Memberships
├── AI Agents
├── API Keys
├── Usage
├── Invoices
├── Support
└── Account
🚀 والجزء الأهم
يمكن أن نرفع القالب من مجرد متجر WooCommerce تقني إلى منصة متكاملة:
AI Agency + SaaS Marketplace + Digital Store + Membership + Subscription Platform
بحيث يكون المنتج الواحد قادرًا على تمثيل:
Software / AI Agent / Plugin / Service / Course / Digital File / Subscription / Membership / Bundle
والخطوة التالية المفيدة هي أن نبني المواصفات الهندسية الكاملة للقالب v1.0: هيكل المجلدات والملفات، أنواع المنتجات، Custom Post Types وTaxonomies، حقول WooCommerce، صفحات القالب، لوحة العميل، نظام الترخيص، والـAPI، ثم نبدأ كتابة الملفات واحدًا واحدًا.
بالتأكيد. لنوسّع الفكرة من مجرد قالب متجر لوكالة AI إلى نظام تصميم ومنصة منتجات تقنية متكاملة.
1. الرؤية النهائية للقالب
اسمًا مؤقتًا يمكن أن يكون:
AI Future — WordPress AI Agency & Technology Theme
الفكرة أن الزائر لا يرى مجرد متجر، بل يرى منصة تقنية تستطيع الوكالة من خلالها عرض وبيع:
- حلول الذكاء الاصطناعي
- AI Agents
- SaaS
- Plugins
- APIs
- أتمتة الأعمال
- خدمات تقنية
- ملفات رقمية
- دورات
- اشتراكات
- عضويات
- تراخيص برمجية
- حزم منتجات
2. الصفحة الرئيسية المستقبلية
يمكن تقسيمها إلى وحدات مستقلة:
HEADER
│
├── Logo
├── AI Solutions
├── Products
├── AI Agents
├── Services
├── Resources
├── Pricing
├── About
└── My Account
ثم:
HERO
────────────────────────────────
Build the Future with AI
AI Automation
AI Agents
SaaS
Digital Products
[Explore Solutions]
[Start Your Project]
ثم قسم:
AI TECHNOLOGY STACK
AI Agents
Automation
Computer Vision
Generative AI
Data Intelligence
Cloud
Cybersecurity
APIs
ثم:
FEATURED PRODUCTS
ثم:
AI AGENTS
ثم:
SERVICES
ثم:
PRICING
ثم:
CASE STUDIES
ثم:
TECHNOLOGY PARTNERS
ثم:
BLOG / KNOWLEDGE
ثم:
CTA
Ready to build your AI future?
[Talk to an AI Expert]
3. نظام المنتجات Product Engine
بدل أن يكون المنتج مجرد:
اسم
سعر
صورة
وصف
نحوّله إلى Product Intelligence Model.
PRODUCT
│
├── Identity
│ ├── Name
│ ├── SKU
│ ├── Slug
│ └── Brand
│
├── Classification
│ ├── Product Type
│ ├── Category
│ ├── Tags
│ └── Industry
│
├── Commercial
│ ├── Price
│ ├── Sale Price
│ ├── Currency
│ └── Tax
│
├── Licensing
│ ├── License Type
│ ├── Activation Limit
│ ├── Expiration
│ └── Updates
│
├── AI
│ ├── AI Type
│ ├── Models
│ ├── Capabilities
│ ├── Inputs
│ └── Outputs
│
├── Technical
│ ├── Requirements
│ ├── Integrations
│ ├── API
│ └── Compatibility
│
├── Media
│ ├── Images
│ ├── Video
│ ├── Demo
│ └── Documentation
│
└── Support
├── Documentation
├── Updates
└── Support Level
4. المنتجات المتغيرة
مثلاً:
AI Automation Platform
يمكن أن يحتوي على:
| الباقة | السعر | المستخدمون | AI Agents | Automation |
|---|---|---|---|---|
| Starter | $29 | 1 | 3 | 10 |
| Professional | $79 | 5 | 20 | 100 |
| Business | $199 | 20 | 100 | غير محدود |
| Enterprise | Custom | Custom | Custom | Custom |
وهنا يصبح Variable Product أكثر ذكاءً من مجرد اختيار لون أو مقاس.
5. نظام الاشتراكات
SUBSCRIPTION ENGINE
│
├── Monthly
├── Quarterly
├── Annual
├── Lifetime
├── Trial
├── Renewal
├── Upgrade
├── Downgrade
├── Cancel
└── Reactivate
ويمكن إظهار:
Your Plan
Professional
Renewal:
October 29, 2026
AI Agents:
12 / 20
Automations:
73 / 100
Storage:
18 GB / 50 GB
6. نظام العضويات
يمكن إنشاء:
MEMBERSHIP
│
├── Free
├── Starter
├── Professional
├── Business
└── Enterprise
كل مستوى يحدد:
Pages
Courses
Downloads
AI Tools
Agents
Community
Support
API
وبالتالي يمكن أن يصبح الموقع بوابة عملاء وليس متجرًا فقط.
7. الحزم Bundles
وهذه مهمة جدًا.
مثلاً:
AI Agency Starter Bundle
يحتوي:
1 × AI Website Builder
1 × AI Content Agent
1 × SEO Agent
1 × Social Media Agent
1 × Automation Plugin
1 × 100 AI Templates
بدلاً من شراء كل منتج منفصلًا:
$499
والقيمة المنفصلة:
$847
مع عرض الحزمة.
8. نظام AI Agents
وهنا يمكن للقالب أن يحصل على هوية مختلفة تمامًا.
كل Agent يكون له Product Profile:
AI AGENT
│
├── Agent Name
├── Purpose
├── Model
├── Capabilities
├── Tools
├── Integrations
├── Input
├── Output
├── Memory
├── Knowledge Base
├── Automation
├── API
├── Usage Limits
└── Pricing
مثلاً:
AI Sales Agent
Lead Capture
↓
Qualification
↓
CRM
↓
Follow-up
↓
Proposal
↓
Sales Notification
9. صفحة مقارنة المنتجات
بدل أن يضطر العميل للدخول إلى كل منتج:
Starter Pro Business
────────────────────────────────────────────
AI Agents 3 20 100
Automation 10 100 ∞
API ✓ ✓ ✓
Analytics ✓ ✓ ✓
Team Members 1 5 20
Support Basic Priority Enterprise
مع زر:
Choose Plan
10. AI Product Finder
ميزة مستقبلية قوية.
الزائر يجيب عن عدة أسئلة:
What are you trying to accomplish?
○ Automate my business
○ Build an AI Agent
○ Sell digital products
○ Create SaaS
○ Improve my website
○ Automate WooCommerce
ثم:
How many users?
How much automation?
Which integrations?
What is your budget?
ثم النظام يعرض المنتجات المطابقة للمواصفات التي اختارها المستخدم، مع توضيح أسباب المطابقة بدل الاكتفاء بقائمة منتجات.
11. لوحة تحكم الإدارة
نريد Dashboard احترافية:
AI FUTURE ADMIN
┌─────────────────────────────┐
│ Revenue │
│ $48,920 │
└─────────────────────────────┘
┌──────────┐ ┌──────────┐
│ Customers│ │ Orders │
│ 2,481 │ │ 8,921 │
└──────────┘ └──────────┘
┌──────────┐ ┌──────────┐
│ Active │ │ Agents │
│ Subs │ │ Running │
│ 1,248 │ │ 327 │
└──────────┘ └──────────┘
ثم:
Products
Orders
Customers
Subscriptions
Memberships
Licenses
Downloads
Bundles
Agents
Automations
Analytics
Knowledge Base
API
Settings
12. نظام الترخيص License Management
خصوصًا إذا كانت الوكالة ستبيع Plugins أو Software.
LICENSE
License Key
XXXXXXXX-XXXX-XXXX
Product
AI Automation Pro
Customer
Customer Name
Activations
3 / 5
Status
Active
Expires
29 Sep 2027
Updates
Active
Support
Premium
مع:
Activate
Deactivate
Transfer
Renew
Upgrade
13. مركز التنزيلات
العميل يستطيع رؤية:
MY DOWNLOADS
AI Plugin Pro
Version 3.2.1
[Download]
AI Templates
Version 2.1
[Download]
Automation Pack
Version 1.5
[Download]
مع إمكانية التحكم في:
- عدد التنزيلات
- صلاحية الرابط
- إصدار الملف
- الملفات المرتبطة بالمنتج
- الملفات الخاصة بكل ترخيص
14. نظام الخدمات
ليس كل شيء يجب أن يكون WooCommerce Product.
يمكن أن توجد:
SERVICES
AI Strategy
AI Development
Automation
Cloud Architecture
WordPress Development
WooCommerce
Custom AI Agents
Enterprise Integration
كل خدمة لها:
Service
│
├── Problem
├── Solution
├── Process
├── Deliverables
├── Timeline
├── Technologies
├── Case Studies
└── Request Quote
15. نظام المشاريع Case Studies
مثلاً:
CASE STUDY
AI E-Commerce Automation
Client Industry:
E-Commerce
Challenge:
Manual operations
Solution:
AI Agents + Automation
Technology:
WordPress
WooCommerce
AI
API
Cloud
Results:
Automation
Analytics
Customer Support
16. نظام التصميم Design System
القالب يحتاج Design Tokens موحدة:
Colors
Typography
Spacing
Radius
Shadows
Buttons
Cards
Forms
Tables
Badges
Alerts
Modals
Navigation
ثم يمكن إنشاء:
Light Mode
Dark Mode
AI Mode
Enterprise Mode
17. الوضع المظلم
واجهة تقنية مستقبلية:
Dark Background
Glass Cards
Soft Glow
Gradient Borders
Animated AI Elements
لكن بدون التضحية بسرعة الموقع أو إمكانية الوصول.
18. بنية الملفات
يمكن أن تكون النسخة الاحترافية:
ai-future/
│
├── style.css
├── functions.php
├── theme.json
├── screenshot.png
│
├── assets/
│ ├── css/
│ ├── js/
│ ├── fonts/
│ └── images/
│
├── inc/
│ ├── setup.php
│ ├── enqueue.php
│ ├── woocommerce.php
│ ├── products.php
│ ├── subscriptions.php
│ ├── memberships.php
│ ├── bundles.php
│ ├── licenses.php
│ ├── dashboard.php
│ ├── agents.php
│ ├── api.php
│ └── admin.php
│
├── templates/
│ ├── home/
│ ├── products/
│ ├── services/
│ ├── agents/
│ ├── pricing/
│ └── dashboard/
│
├── template-parts/
│ ├── header/
│ ├── footer/
│ ├── product/
│ ├── cards/
│ └── components/
│
└── languages/
19. فصل Theme عن Plugin
الأفضل معماريًا:
AI Future Theme
│
│ UI
▼
WordPress
│
├── WooCommerce
│
├── AI Future Core
│
├── Subscription System
│
├── Membership System
│
├── License System
│
└── AI Agent Integration
القالب مسؤول عن العرض والتجربة.
أما الوظائف التجارية والبيانات الأساسية فتكون في Core Plugin أو إضافات مستقلة.
وهذا يجعل تغيير القالب مستقبلًا لا يؤدي إلى فقدان المنتجات والعملاء والتراخيص.
20. المرحلة التالية: AI Future v1.0
أقترح أن نبني المشروع على مراحل:
Phase 01
Theme Foundation
Phase 02
WooCommerce Product Engine
Phase 03
Subscriptions
Phase 04
Membership
Phase 05
Digital Downloads
Phase 06
Bundles
Phase 07
License Management
Phase 08
Customer Dashboard
Phase 09
AI Agents Marketplace
Phase 10
AI Product Finder
Phase 11
Agency Services
Phase 12
Analytics + Admin Intelligence
Phase 13
API + Webhooks
Phase 14
Enterprise Architecture
وبهذا يصبح الهدف النهائي ليس مجرد WordPress Theme، وإنما منظومة:
WordPress + WooCommerce + AI Products + SaaS + Subscriptions + Memberships + Licensing + AI Agents + Agency Services
ويمكن بعد ذلك بناء المواصفات البرمجية الفعلية v1.0 والانتقال مباشرة إلى هيكل الملفات ثم كتابة style.css وtheme.json وfunctions.php وملفات WooCommerce وقوالب المنتجات والـDashboard بشكل متسلسل.
مستقبل – قالب ووردبريس لوكالة الذكاء الاصطناعي والتكنولوجيا
🔨 دليل التركيب خطوة بخطوة
🎨 كيفية تخصيص التصميم
أنواع المنتجات المدعومة
النوع الاستخدام
منتج بسيط ترخيص واحد
منتج متغير باقات مختلفة
منتج قابل للتحميل ملفات رقمية
اشتراك دفع شهري/سنوي
عضوية وصول محدود
حزمة عدة منتجات
تصميم بنية SaaS متعددة المستأجرين
تطوير إضافات وقوالب WordPress مخصصة
- PHP (الأساسيات، OOP، الأطر مثل Laravel و Symfony)
- WordPress (تطوير القوالب، الإضافات، WooCommerce، الـ REST API)
- SaaS (البنية متعددة المستأجرين، الفواتير، الاشتراكات، قابلية التوسع)
- قواعد البيانات (MySQL، PostgreSQL، تحسين الاستعلامات)
- واجهات API (REST، GraphQL، التكاملات)
- الأمان والأداء وتحسين محركات البحث التقني
يمكنني مساعدتك في:
- كتابة وتصحيح الكود (PHP، JavaScript، SQL)
- تصميم بنية SaaS متعددة المستأجرين
- تطوير إضافات وقوالب WordPress مخصصة
- حل المشكلات وتحسين الأداء
- مراجعة الكود واقتراح أفضل الممارسات
- التخطيط المعماري للمشاريع
أخبرني بمشروعك أو التحدي الذي تواجهه، وسأقدّم لك حلولًا عملية ومفصّلة. ما الذي تعمل عليه حاليًا؟
ممتاز! سأوسّع الشرح في كل مجال بمزيد من التفاصيل العملية.
1. تطوير PHP الاحترافي
المستويات الأساسية والمتقدمة:
- PHP 8.x الحديثة: Attributes، Enums، Readonly Properties، Fibers، Named Arguments، Constructor Promotion
- OOP متقدم: Interfaces، Abstract Classes، Traits، Late Static Binding، Magic Methods
- SOLID Principles وتطبيقها العملي
- Design Patterns: Repository، Factory، Singleton، Strategy، Observer، Dependency Injection
- أدوات الجودة: PHPStan، Psalm، PHPUnit، Pest، PHP-CS-Fixer
مثال عملي — Repository Pattern:
php
interface UserRepositoryInterface {
public function findById(int $id): ?User;
public function save(User $user): User;
}
class EloquentUserRepository implements UserRepositoryInterface {
public function findById(int $id): ?User {
return User::find($id);
}
public function save(User $user): User {
$user->save();
return $user;
}
}
2. WordPress على مستوى احترافي
تطوير القوالب:
- Block Themes (FSE) باستخدام
theme.json - Classic Themes مع Template Hierarchy متقدم
- Headless WordPress مع Next.js أو Nuxt عبر REST/GraphQL
- ACF Pro + Gutenberg Blocks المخصصة
تطوير الإضافات:
- Plugin Architecture نظيفة (MVC أو HMVC)
- Custom Post Types و Taxonomies و Meta Boxes
- REST API مخصص ونقاط نهاية آمنة
- Cron Jobs و WP-CLI Commands
- Multisite وإدارة الشبكات
مثال — Custom REST Endpoint:
php
add_action('rest_api_init', function () {
register_rest_route('myapp/v1', '/products/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'get_product_data',
'permission_callback' => fn() => current_user_can('read'),
'args' => [
'id' => ['validate_callback' => fn($p) => is_numeric($p)],
],
]);
});
الأمان في WordPress:
- Nonces، Capability Checks، Sanitization، Escaping، Prepared Statements (
$wpdb->prepare)
3. بناء منصات SaaS
البنية متعددة المستأجرين (Multi-Tenancy):
| النموذج | الوصف | الاستخدام |
|---|---|---|
| Shared DB, Shared Schema | عمود tenant_id في كل جدول | الأبسط، الأقل تكلفة |
| Shared DB, Separate Schema | Schema لكل مستأجر | توازن جيد |
| Separate DB per Tenant | قاعدة بيانات مستقلة | عزل كامل، تكلفة أعلى |
المكونات الأساسية لأي SaaS:
- Authentication & Authorization — JWT، OAuth2، SSO، RBAC/ABAC
- Subscription Billing — Stripe، Paddle، Chargebee، الفواتير التلقائية، Dunning
- Tenant Isolation — عزل البيانات على مستوى الاستعلامات والملفات
- Feature Flags & Plans — تحديد الميزات حسب الخطة
- Onboarding & Trials — تسجيل تلقائي، فترة تجريبية
- Admin Panel — إدارة المستأجرين، الإحصائيات، الدعم
- API & Webhooks — للتكاملات الخارجية
- Observability — Logging، Monitoring، Alerting
مثال — Middleware لتحديد المستأجر في Laravel:
php
class IdentifyTenant
{
public function handle($request, Closure $next)
{
$tenant = Tenant::where('domain', $request->getHost())->firstOrFail();
app()->instance('tenant', $tenant);
DB::statement("SET search_path TO {$tenant->schema}");
return $next($request);
}
}
الاشتراكات مع Stripe:
- Checkout Sessions، Customer Portal، Webhooks (
invoice.paid,customer.subscription.deleted) - التعامل مع الفشل، الاسترداد، وتغيير الخطط (Proration)
4. قواعد البيانات وتحسين الأداء
- Indexing Strategy: Composite Indexes، Covering Indexes
- Query Optimization: تجنّب N+1، Eager Loading، EXPLAIN Analysis
- Caching Layers: Redis، Memcached، OPcache، CDN، Object Cache
- Replication & Sharding للتحجيم الأفقي
- Migrations الآمنة بدون Downtime
5. DevOps والنشر
- Docker & Docker Compose لبيئات متطابقة
- CI/CD: GitHub Actions، GitLab CI، Jenkins
- Zero-Downtime Deployment: Blue-Green، Canary
- Monitoring: Sentry، New Relic، Prometheus + Grafana
- Security: HTTPS، WAF، Rate Limiting، Secrets Management
6. نماذج مشاريع SaaS شائعة يمكن بناؤها
- منصة إدارة العملاء (CRM)
- نظام حجوزات/مواعيد
- منصة تعليمية (LMS)
- أدوات التسويق (Email، Analytics)
- منصة فوترة ومحاسبة
- Help Desk / Ticketing
- منصة إدارة المشاريع
كيف أساعدك عمليًا؟
أخبرني أيهم يهمك أكثر:
- مشروع قائم — أعطني الكود أو الوصف وسأساعد في التطوير/الإصلاح
- مشروع جديد — نساعدك في اختيار Stack والبنية المناسبة
- مشكلة محددة — Bug، بطء، ثغرة أمنية، أو خطأ في التكامل
- تحسين WordPress — قالب، إضافة، أو تحويل إلى Headless
- بناء SaaS من الصفر — خطة معمارية كاملة خطوة بخطوة
ما هو مشروعك الحالي أو الفكرة التي تريد العمل عليها؟
ممتاز! سأغوص أعمق في كل مجال بمستوى تنفيذي متقدم، مع أمثلة كود حقيقية وسيناريوهات عملية.
1. PHP متقدم — أنماط معمارية احترافية
Dependency Injection Container يدوي
php
class Container
{
private array $bindings = [];
private array $instances = [];
public function bind(string $abstract, callable $factory): void
{
$this->bindings[$abstract] = $factory;
}
public function singleton(string $abstract, callable $factory): void
{
$this->bindings[$abstract] = fn($c) => $this->instances[$abstract] ??= $factory($c);
}
public function make(string $abstract)
{
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}
if (!isset($this->bindings[$abstract])) {
return new $abstract();
}
return $this->bindings[$abstract]($this);
}
}
Event-Driven Architecture
php
interface EventDispatcherInterface {
public function dispatch(object $event): void;
}
class EventDispatcher implements EventDispatcherInterface
{
private array $listeners = [];
public function listen(string $event, callable $listener): void
{
$this->listeners[$event][] = $listener;
}
public function dispatch(object $event): void
{
foreach ($this->listeners[$event::class] ?? [] as $listener) {
$listener($event);
}
}
}
// الاستخدام
$dispatcher->listen(OrderPlaced::class, fn($e) => $mailer->sendReceipt($e->order));
$dispatcher->listen(OrderPlaced::class, fn($e) => $inventory->decrement($e->order));
CQRS مبسّط
فصل عمليات القراءة عن الكتابة — مفيد جدًا في SaaS عالي الحمل:
php
// Command
class CreateUserCommand {
public function __construct(
public readonly string $email,
public readonly string $name,
) {}
}
class CreateUserHandler {
public function __construct(private UserRepository $repo) {}
public function handle(CreateUserCommand $cmd): User {
$user = User::create($cmd->email, $cmd->name);
$this->repo->save($user);
return $user;
}
}
2. WordPress احترافي — مستويات متقدمة
بناء Gutenberg Block مخصص بالكامل
php
// block.json
{
"apiVersion": 3,
"name": "myapp/pricing-card",
"title": "Pricing Card",
"category": "widgets",
"icon": "money-alt",
"attributes": {
"title": { "type": "string", "default": "Basic" },
"price": { "type": "number", "default": 29 },
"features": { "type": "array", "default": [] }
},
"editorScript": "file:./index.js",
"render": "file:./render.php"
}
php
// render.php
<div class="pricing-card">
<h3><?php echo esc_html($attributes['title']); ?></h3>
<span class="price">$<?php echo esc_html($attributes['price']); ?></span>
<ul>
<?php foreach ($attributes['features'] as $f): ?>
<li><?php echo esc_html($f); ?></li>
<?php endforeach; ?>
</ul>
</div>
Plugin قائم على MVC نظيف
text
my-plugin/ ├── src/ │ ├── Controllers/ │ ├── Models/ │ ├── Services/ │ ├── Repositories/ │ └── Providers/ ├── resources/views/ ├── routes/api.php ├── my-plugin.php └── composer.json
php
// Service Provider Pattern
class ServiceProvider
{
public function register(): void
{
add_action('rest_api_init', [$this, 'registerRoutes']);
add_action('init', [$this, 'registerPostTypes']);
}
public function registerRoutes(): void
{
(new ProductController())->register();
}
}
Headless WordPress + Next.js
- WordPress كـ CMS فقط عبر GraphQL (WPGraphQL)
- Next.js للواجهة مع ISR/SSR
- مصادقة عبر JWT
- نشر على Vercel مع WordPress على VPS منفصل
graphql
query GetPosts {
posts(first: 10) {
nodes {
title
slug
excerpt
featuredImage { node { sourceUrl } }
}
}
}
3. SaaS — بنية تنفيذية كاملة
نموذج Multi-Tenancy على مستوى قاعدة البيانات
php
// Tenant Resolution Middleware
class TenantMiddleware
{
public function handle(Request $request, Closure $next)
{
$host = $request->getHost();
$tenant = Cache::remember("tenant:$host", 3600, function () use ($host) {
return Tenant::where('domain', $host)
->orWhere('subdomain', explode('.', $host)[0])
->firstOrFail();
});
if (!$tenant->isActive()) {
abort(403, 'Account suspended');
}
app()->instance('tenant', $tenant);
config(['database.connections.tenant.database' => $tenant->db_name]);
DB::purge('tenant');
DB::reconnect('tenant');
return $next($request);
}
}
Global Scope لعزل البيانات تلقائيًا
php
class TenantScope implements Scope
{
public function apply(Builder $builder, Model $model): void
{
if (app()->bound('tenant')) {
$builder->where($model->getTable().'.tenant_id', app('tenant')->id);
}
}
}
// في الموديل
protected static function booted(): void
{
static::addGlobalScope(new TenantScope());
static::creating(fn($m) => $m->tenant_id ??= app('tenant')->id);
}
نظام الاشتراكات والخطط
php
class SubscriptionService
{
public function subscribe(User $user, Plan $plan, string $paymentMethod): Subscription
{
$customer = $this->stripe->customers->create([
'email' => $user->email,
'payment_method' => $paymentMethod,
'invoice_settings' => ['default_payment_method' => $paymentMethod],
]);
$subscription = $this->stripe->subscriptions->create([
'customer' => $customer->id,
'items' => [['price' => $plan->stripe_price_id]],
'trial_period_days' => $plan->trial_days,
'expand' => ['latest_invoice.payment_intent'],
]);
return Subscription::create([
'user_id' => $user->id,
'tenant_id' => $user->tenant_id,
'plan_id' => $plan->id,
'stripe_id' => $subscription->id,
'status' => $subscription->status,
'trial_ends_at' => $subscription->trial_end ? now()->setTimestamp($subscription->trial_end) : null,
]);
}
}
Feature Flags حسب الخطة
php
class FeatureGate
{
public function allows(string $feature): bool
{
$plan = app('tenant')->currentPlan();
return in_array($feature, $plan->features ?? [], true);
}
}
// في الكود
if (FeatureGate::allows('custom_domain')) {
// ميزة متاحة للخطة
}
// Middleware
class RequireFeature
{
public function handle($request, Closure $next, string $feature)
{
abort_unless(FeatureGate::allows($feature), 403, "Upgrade to access $feature");
return $next($request);
}
}
// في الراوت
Route::get('/reports/advanced', ReportController::class)->middleware('feature:advanced_reports');
Rate Limiting لكل مستأجر
php
RateLimiter::for('api', function (Request $request) {
$tenant = app('tenant');
return Limit::perMinute($tenant->plan->api_rate_limit ?? 60)
->by($tenant->id)
->response(fn() => response()->json(['error' => 'Rate limit exceeded'], 429));
});
Webhook Handling من Stripe
php
Route::post('/stripe/webhook', function (Request $request) {
$event = Webhook::constructEvent(
$request->getContent(),
$request->header('Stripe-Signature'),
config('services.stripe.webhook_secret')
);
match ($event->type) {
'invoice.paid' => app(HandleInvoicePaid::class)->handle($event->data->object),
'invoice.payment_failed' => app(HandlePaymentFailed::class)->handle($event->data->object),
'customer.subscription.deleted' => app(HandleSubscriptionCanceled::class)->handle($event->data->object),
default => null,
};
return response()->noContent();
})->withoutMiddleware(['csrf', 'tenant']);
4. الأداء والتحجيم
Redis Strategies في SaaS
php
// Cache Tags للعزل بين المستأجرين
Cache::tags(["tenant:{$tenantId}", 'products'])->put('list', $products, 3600);
Cache::tags(["tenant:{$tenantId}"])->flush(); // مسح كل بيانات المستأجر
// Atomic Locks
$lock = Cache::lock("export:{$tenantId}", 120);
if ($lock->get()) {
try { /* عملية التصدير */ } finally { $lock->release(); }
}
// Job Queues
ExportDataJob::dispatch($tenantId)->onQueue("tenant-{$tenantId}");
Database Optimization
sql
-- Composite Index مثال واقعي CREATE INDEX idx_orders_tenant_status_date ON orders (tenant_id, status, created_at DESC); -- Partial Index للبيانات النشطة فقط CREATE INDEX idx_active_subscriptions ON subscriptions (tenant_id) WHERE status = 'active'; -- EXPLAIN ANALYZE EXPLAIN ANALYZE SELECT * FROM orders WHERE tenant_id = 42 AND status = 'pending' ORDER BY created_at DESC LIMIT 20;
Horizontal Scaling
- Read Replicas للاستعلامات الثقيلة
- Queue Workers منفصلة على سيرفرات مستقلة
- CDN للأصول الثابتة (Cloudflare، Bunny)
- Object Storage للملفات (S3، R2)
- Horizontal Pod Autoscaling في Kubernetes
5. الأمان المتقدم
OWASP Top 10 دفاعات عملية
php
// SQL Injection
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
// XSS
echo htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// CSRF (في WordPress)
wp_nonce_field('save_settings', '_wpnonce');
check_admin_referer('save_settings');
// Password Hashing
$hash = password_hash($password, PASSWORD_ARGON2ID);
// JWT Validation
JWT::decode($token, new Key($secret, 'HS256'));
Multi-Tenant Security
- Row-Level Security (RLS) في PostgreSQL لعزل صارم
- Encryption at Rest لكل مستأجر (مفاتيح منفصلة)
- Audit Logs لكل عملية حساسة
- IP Allowlisting للمستأجرين المؤسسيين
- SSO/SAML للمؤسسات
sql
-- PostgreSQL RLS
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON orders
USING (tenant_id = current_setting('app.current_tenant')::int);
6. DevOps & Deployment
Dockerfile لـ PHP SaaS
dockerfile
FROM php:8.3-fpm-alpine
RUN apk add --no-cache \
postgresql-dev libzip-dev icu-dev oniguruma-dev \
&& docker-php-ext-install pdo_pgsql zip intl opcache
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
COPY composer.* ./
RUN composer install --no-dev --optimize-autoloader --no-scripts
COPY . .
RUN php artisan config:cache && php artisan route:cache
USER www-data
GitHub Actions CI/CD
yaml
name: Deploy
on:
push: { branches: [main] }
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with: { php-version: '8.3' }
- run: composer install --prefer-dist
- run: vendor/bin/pest
- run: vendor/bin/phpstan analyse
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Deploy to Production
run: |
ssh deploy@server "cd /var/www && git pull && composer install --no-dev && php artisan migrate --force && php artisan queue:restart"
7. Observability في SaaS
php
// Structured Logging
Log::channel('tenant')->info('Order created', [
'tenant_id' => $tenant->id,
'user_id' => $user->id,
'order_id' => $order->id,
'amount' => $order->total,
]);
// Custom Metrics (Prometheus)
$metrics->increment('orders.created', 1, ['tenant' => $tenant->id]);
$metrics->histogram('api.latency', $duration, ['endpoint' => $route]);
// Distributed Tracing (OpenTelemetry)
$span = $tracer->spanBuilder('process_order')->startSpan();
try {
// ...
} finally {
$span->end();
}
8. Roadmap لبناء SaaS كامل من الصفر
المرحلة 1 — الأساس (2-3 أسابيع):
- Auth + Multi-Tenancy + Onboarding
المرحلة 2 — الأعمال (3-4 أسابيع):
- CRUD الأساسي + Plans + Stripe + Feature Gates
المرحلة 3 — النمو (شهر):
- Admin Panel + Analytics + API + Webhooks
المرحلة 4 — الاحتراف (مستمر):
- Observability + Security Hardening + Scaling + SSO
ماذا تريد أن نبنيه الآن؟
اختر أحد المسارات وسأعطيك كودًا كاملًا جاهزًا للتشغيل:
- نظام Multi-Tenant كامل بـ Laravel ( migrations + middleware + models )
- إضافة WordPress احترافية بمعمارية MVC
- نظام اشتراكات Stripe مع Webhooks وخطة كاملة
- لوحة تحكم SaaS مع Analytics و Feature Flags
- Headless WordPress + Next.js مع مثال عملي
- حل مشكلة محددة في مشروعك الحالي (أرسل الكود)
قل لي رقم المسار أو أرسل تفاصيل مشروعك وسأبدأ فورًا.
ممتاز! سأدخل الآن في مستوى التنفيذ العميق — أنظمة إنتاجية كاملة، كود قابل للنسخ، وسيناريوهات من مشاريع SaaS حقيقية بملايين المستخدمين.
1. نظام Multi-Tenant كامل بـ Laravel — من الصفر للإنتاج
هيكل قاعدة البيانات
php
// database/migrations/2024_01_01_000001_create_tenants_table.php
Schema::create('tenants', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->string('domain')->nullable()->unique();
$table->string('db_name')->nullable(); // للعزل بـ DB منفصلة
$table->string('plan_id')->default('free');
$table->json('settings')->nullable();
$table->enum('status', ['active', 'suspended', 'trial', 'cancelled'])->default('trial');
$table->timestamp('trial_ends_at')->nullable();
$table->timestamps();
$table->softDeletes();
$table->index(['status', 'trial_ends_at']);
});
// جدول users مربوط بـ tenant
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->foreignId('tenant_id')->constrained()->cascadeOnDelete();
$table->string('email');
$table->string('password');
$table->enum('role', ['owner', 'admin', 'member', 'viewer'])->default('member');
$table->json('permissions')->nullable();
$table->timestamp('email_verified_at')->nullable();
$table->timestamps();
$table->unique(['tenant_id', 'email']); // نفس الإيميل يمكن في tenants مختلفة
$table->index(['tenant_id', 'role']);
});
Trait للعزل التلقائي
php
namespace App\Models\Concerns;
trait BelongsToTenant
{
protected static function bootBelongsToTenant(): void
{
static::creating(function ($model) {
if (app()->bound('tenant') && !$model->tenant_id) {
$model->tenant_id = app('tenant')->id;
}
});
static::addGlobalScope('tenant', function (Builder $builder) {
if (app()->bound('tenant')) {
$builder->where(
$builder->getModel()->getTable() . '.tenant_id',
app('tenant')->id
);
}
});
}
public function tenant(): BelongsTo
{
return $this->belongsTo(Tenant::class);
}
// لتجاوز العزل عند الحاجة (مثلًا للأدمن العام)
public static function withoutTenantScope(): Builder
{
return static::withoutGlobalScope('tenant');
}
}
Middleware متكامل مع Cache و Rate Limiting
php
namespace App\Http\Middleware;
class ResolveTenant
{
public function handle(Request $request, Closure $next): Response
{
$tenant = $this->resolveTenant($request);
if (!$tenant) {
return $this->handleNoTenant($request);
}
if ($tenant->status === 'suspended') {
return response()->json(['error' => 'Account suspended. Contact support.'], 403);
}
if ($tenant->status === 'trial' && $tenant->trial_ends_at?->isPast()) {
return response()->json(['error' => 'Trial expired', 'upgrade_url' => '/billing'], 402);
}
// Bind في الـ container
app()->instance('tenant', $tenant);
// إعداد الاتصال بقاعدة البيانات إن كان منفصلًا
if ($tenant->db_name) {
$this->switchDatabase($tenant->db_name);
}
// مشاركة في الـ views و Inertia
View::share('currentTenant', $tenant);
Inertia::share('tenant', fn() => [
'id' => $tenant->id,
'name' => $tenant->name,
'plan' => $tenant->plan_id,
'features' => $tenant->plan->features,
]);
return $next($request);
}
protected function resolveTenant(Request $request): ?Tenant
{
// 1. من الـ subdomain
$host = $request->getHost();
$parts = explode('.', $host);
// 2. من الـ header (للـ API)
if ($request->hasHeader('X-Tenant-ID')) {
return $this->cacheTenant('id:' . $request->header('X-Tenant-ID'));
}
// 3. من الـ user المسجل
if ($user = $request->user()) {
return $this->cacheTenant('id:' . $user->tenant_id);
}
// 4. من الدومين المخصص
return $this->cacheTenant('domain:' . $host)
?? $this->cacheTenant('slug:' . $parts[0]);
}
protected function cacheTenant(string $key): ?Tenant
{
return Cache::remember("tenant:{$key}", 300, function () use ($key) {
[$field, $value] = explode(':', $key, 2);
return Tenant::where($field, $value)->with('plan')->first();
});
}
protected function switchDatabase(string $dbName): void
{
config(['database.connections.tenant.database' => $dbName]);
DB::purge('tenant');
DB::reconnect('tenant');
}
}
Service Provider للتحميل الديناميكي
php
namespace App\Providers;
class TenantServiceProvider extends ServiceProvider
{
public function register(): void
{
// Bind Plan Model ديناميكيًا
$this->app->bind(PlanContract::class, function () {
$planId = app()->bound('tenant')
? app('tenant')->plan_id
: 'free';
return config("plans.{$planId}");
});
}
public function boot(): void
{
// تحميل config خاص بالمستأجر
if (app()->bound('tenant')) {
$settings = app('tenant')->settings ?? [];
foreach ($settings as $key => $value) {
config(["tenant.{$key}" => $value]);
}
}
}
}
Tenant Provisioning (إنشاء حساب جديد)
php
namespace App\Actions;
class ProvisionTenant
{
public function __construct(
private CreateDatabase $createDb,
private RunMigrations $migrate,
private SeedDefaults $seed,
private SendWelcomeEmail $email,
) {}
public function execute(array $data): Tenant
{
return DB::transaction(function () use ($data) {
// 1. إنشاء المستأجر
$tenant = Tenant::create([
'name' => $data['company'],
'slug' => Str::slug($data['company']),
'plan_id' => 'trial',
'status' => 'trial',
'trial_ends_at' => now()->addDays(14),
]);
// 2. إنشاء قاعدة البيانات إن كانت معزولة
if (config('tenancy.mode') === 'database') {
$dbName = "tenant_{$tenant->id}";
$this->createDb->execute($dbName);
$tenant->update(['db_name' => $dbName]);
$this->migrate->execute($dbName);
$this->seed->execute($dbName);
}
// 3. إنشاء المستخدم المالك
$user = $tenant->users()->create([
'email' => $data['email'],
'password' => Hash::make($data['password']),
'role' => 'owner',
'email_verified_at' => now(),
]);
// 4. إنشاء الاشتراك التجريبي
event(new TenantProvisioned($tenant, $user));
// 5. إرسال بريد الترحيب
$this->email->execute($user);
return $tenant;
});
}
}
2. نظام الاشتراكات والفوترة الكامل
نموذج Plan + Feature + Subscription
php
// app/Models/Plan.php
class Plan extends Model
{
protected $casts = [
'features' => 'array',
'limits' => 'array',
'is_active' => 'boolean',
];
public function hasFeature(string $feature): bool
{
return in_array($feature, $this->features ?? [], true);
}
public function getLimit(string $key): int|float|null
{
return $this->limits[$key] ?? null;
}
}
// config/plans.php
return [
'free' => [
'name' => 'Free',
'price' => 0,
'features' => ['basic_reports'],
'limits' => [
'users' => 3,
'projects' => 5,
'storage_gb' => 1,
'api_calls_per_month' => 1000,
],
],
'pro' => [
'name' => 'Pro',
'price' => 29,
'stripe_price_id' => 'price_xxx',
'features' => ['basic_reports', 'advanced_reports', 'custom_domain', 'api_access'],
'limits' => [
'users' => 25,
'projects' => 100,
'storage_gb' => 50,
'api_calls_per_month' => 100000,
],
],
'enterprise' => [
'name' => 'Enterprise',
'price' => 299,
'features' => ['*'],
'limits' => [
'users' => -1, // غير محدود
'projects' => -1,
'storage_gb' => 1000,
'api_calls_per_month' => -1,
],
],
];
Gate للتحقق من الحدود
php
class PlanLimits
{
public function canCreate(string $resource): bool
{
$plan = app('tenant')->plan;
$limit = $plan->getLimit($resource);
if ($limit === -1) return true; // غير محدود
$current = match($resource) {
'users' => app('tenant')->users()->count(),
'projects' => app('tenant')->projects()->count(),
'storage_gb' => app('tenant')->usedStorageGb(),
default => 0,
};
return $current < $limit;
}
public function remaining(string $resource): int
{
$plan = app('tenant')->plan;
$limit = $plan->getLimit($resource);
if ($limit === -1) return PHP_INT_MAX;
return max(0, $limit - $this->current($resource));
}
}
// Middleware
class EnforceLimit
{
public function handle($request, Closure $next, string $resource)
{
if (!app(PlanLimits::class)->canCreate($resource)) {
return response()->json([
'error' => 'limit_reached',
'resource' => $resource,
'message' => "You've reached your plan limit for {$resource}",
'upgrade_url' => route('billing.upgrade'),
], 402);
}
return $next($request);
}
}
// الاستخدام في الراوت
Route::post('/projects', [ProjectController::class, 'store'])
->middleware(['tenant', 'limit:projects']);
Stripe Integration متقدم
php
class BillingService
{
public function __construct(private StripeClient $stripe) {}
public function createCheckoutSession(Tenant $tenant, Plan $plan, string $interval = 'monthly'): Session
{
return $this->stripe->checkout->sessions->create([
'customer' => $tenant->stripe_customer_id,
'mode' => 'subscription',
'line_items' => [[
'price' => $plan->stripePriceId($interval),
'quantity' => 1,
]],
'success_url' => route('billing.success') . '?session_id={CHECKOUT_SESSION_ID}',
'cancel_url' => route('billing.cancel'),
'metadata' => [
'tenant_id' => $tenant->id,
'plan_id' => $plan->id,
],
'subscription_data' => [
'trial_period_days' => $tenant->trialDaysRemaining(),
'metadata' => ['tenant_id' => $tenant->id],
],
'allow_promotion_codes' => true,
'automatic_tax' => ['enabled' => true],
]);
}
public function changePlan(Tenant $tenant, Plan $newPlan): void
{
$subscription = $this->stripe->subscriptions->retrieve($tenant->stripe_subscription_id);
$currentItem = $subscription->items->data[0];
$this->stripe->subscriptions->update($subscription->id, [
'items' => [[
'id' => $currentItem->id,
'price' => $newPlan->stripe_price_id,
]],
'proration_behavior' => 'create_prorations',
'metadata' => ['tenant_id' => $tenant->id, 'plan_id' => $newPlan->id],
]);
}
public function cancel(Tenant $tenant, bool $immediately = false): void
{
if ($immediately) {
$this->stripe->subscriptions->cancel($tenant->stripe_subscription_id);
} else {
$this->stripe->subscriptions->update($tenant->stripe_subscription_id, [
'cancel_at_period_end' => true,
]);
}
}
}
Webhook Handler شامل
php
class StripeWebhookController
{
public function handle(Request $request): Response
{
try {
$event = Webhook::constructEvent(
$request->getContent(),
$request->header('Stripe-Signature'),
config('services.stripe.webhook_secret')
);
} catch (SignatureVerificationException $e) {
return response()->json(['error' => 'Invalid signature'], 400);
}
// منع المعالجة المكررة
if (ProcessedWebhook::where('event_id', $event->id)->exists()) {
return response()->noContent();
}
try {
DB::transaction(function () use ($event) {
match ($event->type) {
'checkout.session.completed' => $this->handleCheckoutCompleted($event->data->object),
'customer.subscription.created' => $this->handleSubscriptionCreated($event->data->object),
'customer.subscription.updated' => $this->handleSubscriptionUpdated($event->data->object),
'customer.subscription.deleted' => $this->handleSubscriptionDeleted($event->data->object),
'invoice.paid' => $this->handleInvoicePaid($event->data->object),
'invoice.payment_failed' => $this->handlePaymentFailed($event->data->object),
'customer.subscription.trial_will_end' => $this->handleTrialEnding($event->data->object),
default => null,
};
ProcessedWebhook::create([
'event_id' => $event->id,
'type' => $event->type,
'processed_at' => now(),
]);
});
} catch (\Throwable $e) {
Log::error('Stripe webhook failed', [
'event_id' => $event->id,
'type' => $event->type,
'error' => $e->getMessage(),
]);
return response()->json(['error' => 'Processing failed'], 500);
}
return response()->noContent();
}
protected function handlePaymentFailed(object $invoice): void
{
$tenant = Tenant::where('stripe_customer_id', $invoice->customer)->first();
if (!$tenant) return;
$tenant->update(['status' => 'past_due']);
// إشعار المستخدم
Notification::send(
$tenant->owner,
new PaymentFailedNotification($invoice)
);
// جدولة إيقاف الخدمة بعد 7 أيام
SuspendTenantJob::dispatch($tenant)->delay(now()->addDays(7));
}
protected function handleSubscriptionDeleted(object $subscription): void
{
$tenant = Tenant::where('stripe_subscription_id', $subscription->id)->first();
if (!$tenant) return;
$tenant->update([
'status' => 'cancelled',
'plan_id' => 'free',
'cancelled_at' => now(),
]);
// تصدير البيانات تلقائيًا قبل الحذف النهائي
ExportTenantDataJob::dispatch($tenant);
// جدولة الحذف النهائي بعد 30 يومًا
PurgeTenantJob::dispatch($tenant)->delay(now()->addDays(30));
}
}
3. WordPress — إضافة SaaS احترافية بمستوى إنتاجي
هيكل إضافة كامل بمعمارية نظيفة
text
saas-plugin/
├── saas-plugin.php # Bootstrap
├── composer.json
├── src/
│ ├── Plugin.php # Main class
│ ├── Container.php
│ ├── Providers/
│ │ ├── AdminServiceProvider.php
│ │ ├── ApiServiceProvider.php
│ │ ├── BillingServiceProvider.php
│ │ └── TenantServiceProvider.php
│ ├── Http/
│ │ ├── Controllers/
│ │ ├── Middleware/
│ │ └── Requests/
│ ├── Models/
│ ├── Repositories/
│ ├── Services/
│ ├── Jobs/
│ └── Events/
├── database/
│ └── migrations/
├── resources/
│ ├── views/
│ ├── js/
│ └── css/
└── routes/
└── api.php
Bootstrap نظيف
php
// saas-plugin.php
/**
* Plugin Name: SaaS Platform
* Version: 1.0.0
* Requires PHP: 8.1
*/
if (!defined('ABSPATH')) exit;
require_once __DIR__ . '/vendor/autoload.php';
define('SAAS_PLUGIN_FILE', __FILE__);
define('SAAS_PLUGIN_DIR', __DIR__);
define('SAAS_PLUGIN_URL', plugin_dir_url(__FILE__));
// تفعيل / إلغاء تفعيل
register_activation_hook(__FILE__, [Saas\Plugin::class, 'activate']);
register_deactivation_hook(__FILE__, [Saas\Plugin::class, 'deactivate']);
// تشغيل
add_action('plugins_loaded', fn() => Saas\Plugin::instance()->boot());
Plugin Container + Providers
php
namespace Saas;
class Plugin
{
private static ?Plugin $instance = null;
private Container $container;
private array $providers = [
Providers\AdminServiceProvider::class,
Providers\ApiServiceProvider::class,
Providers\BillingServiceProvider::class,
Providers\TenantServiceProvider::class,
];
public static function instance(): self
{
return self::$instance ??= new self();
}
private function __construct()
{
$this->container = new Container();
}
public function boot(): void
{
foreach ($this->providers as $provider) {
$this->container->make($provider)->register();
}
// boot phase بعد register الكل
foreach ($this->providers as $provider) {
$this->container->make($provider)->boot();
}
do_action('saas_plugin_booted', $this);
}
public function container(): Container
{
return $this->container;
}
public static function activate(): void
{
// إنشاء الجداول
(new Migrator())->run();
// جدولة المهام
if (!wp_next_scheduled('saas_daily_tasks')) {
wp_schedule_event(time(), 'daily', 'saas_daily_tasks');
}
flush_rewrite_rules();
}
public static function deactivate(): void
{
wp_clear_scheduled_hook('saas_daily_tasks');
flush_rewrite_rules();
}
}
Custom Table + Repository
php
namespace Saas\Models;
class Subscription extends Model
{
protected static string $table = 'saas_subscriptions';
protected array $fillable = [
'user_id', 'plan_id', 'status',
'stripe_id', 'trial_ends_at', 'ends_at',
];
protected array $casts = [
'trial_ends_at' => 'datetime',
'ends_at' => 'datetime',
'meta' => 'json',
];
}
// Repository
namespace Saas\Repositories;
class SubscriptionRepository
{
public function __construct(private \wpdb $db) {}
public function findActiveByUser(int $userId): ?Subscription
{
$row = $this->db->get_row($this->db->prepare(
"SELECT * FROM {$this->db->prefix}saas_subscriptions
WHERE user_id = %d AND status IN ('active', 'trialing')
ORDER BY created_at DESC LIMIT 1",
$userId
), ARRAY_A);
return $row ? Subscription::hydrate($row) : null;
}
public function create(array $data): Subscription
{
$this->db->insert($this->db->prefix . 'saas_subscriptions', array_merge($data, [
'created_at' => current_time('mysql'),
'updated_at' => current_time('mysql'),
]));
return $this->find($this->db->insert_id);
}
}
REST API مخصص
php
namespace Saas\Providers;
class ApiServiceProvider
{
public function register(): void
{
add_action('rest_api_init', [$this, 'registerRoutes']);
}
public function registerRoutes(): void
{
register_rest_route('saas/v1', '/subscriptions', [
[
'methods' => 'GET',
'callback' => [$this, 'listSubscriptions'],
'permission_callback' => fn() => current_user_can('manage_options'),
],
[
'methods' => 'POST',
'callback' => [$this, 'createSubscription'],
'permission_callback' => fn() => current_user_can('manage_options'),
'args' => [
'plan_id' => [
'required' => true,
'validate_callback' => fn($v) => in_array($v, ['free', 'pro', 'enterprise']),
'sanitize_callback' => 'sanitize_text_field',
],
'user_id' => [
'required' => true,
'validate_callback' => fn($v) => is_numeric($v) && get_userdata((int)$v),
],
],
],
]);
register_rest_route('saas/v1', '/webhooks/stripe', [
'methods' => 'POST',
'callback' => [new StripeWebhookController(), 'handle'],
'permission_callback' => '__return_true', // التحقق من التوقيع فقط
]);
}
public function listSubscriptions(WP_REST_Request $request): WP_REST_Response
{
$repo = Plugin::instance()->container()->make(SubscriptionRepository::class);
$subscriptions = $repo->paginate(
perPage: $request->get_param('per_page') ?? 20,
page: $request->get_param('page') ?? 1,
);
return new WP_REST_Response([
'data' => array_map(fn($s) => $s->toArray(), $subscriptions->items()),
'meta' => [
'total' => $subscriptions->total(),
'pages' => $subscriptions->lastPage(),
],
], 200);
}
}
Admin Panel بـ React (بدون build معقد)
php
// resources/js/admin.jsx
import { createRoot } from 'react-dom/client';
import { useState, useEffect } from 'react';
import apiFetch from '@wordpress/api-fetch';
function SubscriptionsDashboard() {
const [subs, setSubs] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
apiFetch({ path: '/saas/v1/subscriptions' })
.then(res => setSubs(res.data))
.finally(() => setLoading(false));
}, []);
if (loading) return <Spinner />;
return (
<table className="wp-list-table widefat">
<thead>
<tr>
<th>User</th>
<th>Plan</th>
<th>Status</th>
<th>Trial Ends</th>
</tr>
</thead>
<tbody>
{subs.map(s => (
<tr key={s.id}>
<td>{s.user_name}</td>
<td>{s.plan_id}</td>
<td><StatusBadge status={s.status} /></td>
<td>{s.trial_ends_at}</td>
</tr>
))}
</tbody>
</table>
);
}
createRoot(document.getElementById('saas-admin-root'))
.render(<SubscriptionsDashboard />);
4. الأداء — تحسين قاعدة البيانات على نطاق واسع
تحسين استعلامات SaaS حقيقية
sql
-- ❌ استعلام بطيء (N+1 style)
SELECT * FROM orders WHERE tenant_id = 42;
-- ثم في الكود: استعلام لكل user
-- ✅ استعلام واحد محسّن
SELECT
o.id, o.total, o.created_at,
u.name AS user_name, u.email,
COUNT(oi.id) AS items_count
FROM orders o
INNER JOIN users u ON u.id = o.user_id
LEFT JOIN order_items oi ON oi.order_id = o.id
WHERE o.tenant_id = 42
AND o.created_at >= '2024-01-01'
GROUP BY o.id
ORDER BY o.created_at DESC
LIMIT 50;
-- فهارس ضرورية
CREATE INDEX idx_orders_tenant_date ON orders(tenant_id, created_at DESC);
CREATE INDEX idx_order_items_order ON order_items(order_id, product_id);
Cursor Pagination للأداء الثابت
php
// بدل OFFSET الكبير (بطيء جدًا بعد الصفحة 1000)
public function cursorPaginate(?int $cursor, int $limit = 20): array
{
$query = Order::where('tenant_id', app('tenant')->id)
->orderBy('id', 'desc')
->limit($limit + 1);
if ($cursor) {
$query->where('id', '<', $cursor);
}
$items = $query->get();
$hasMore = $items->count() > $limit;
$items = $items->take($limit);
return [
'data' => $items,
'next_cursor' => $hasMore ? $items->last()->id : null,
'has_more' => $hasMore,
];
}
Job Batching للمهام الثقيلة
php
use Illuminate\Bus\Batch;
$batch = Bus::batch([
new ProcessChunkJob($chunk1),
new ProcessChunkJob($chunk2),
new ProcessChunkJob($chunk3),
])
->then(fn(Batch $batch) => $tenant->notify(new ImportCompleted($batch)))
->catch(fn(Batch $batch, Throwable $e) => $tenant->notify(new ImportFailed($e)))
->finally(fn(Batch $batch) => Cache::forget("import:{$batch->id}"))
->name('Tenant Data Import')
->dispatch();
5. الأمان المتقدم — RLS و Encryption
Row-Level Security في PostgreSQL
sql
-- 1. إنشاء دور التطبيق
CREATE ROLE app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
-- 2. تفعيل RLS
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
-- 3. سياسة العزل
CREATE POLICY tenant_isolation_policy ON orders
FOR ALL
TO app_user
USING (tenant_id = current_setting('app.current_tenant')::int)
WITH CHECK (tenant_id = current_setting('app.current_tenant')::int);
-- 4. في Laravel عند كل طلب
DB::statement("SET app.current_tenant = ?", [$tenant->id]);
تشفير البيانات الحساسة
php
// Model-level encryption
class ApiKey extends Model
{
protected $casts = [
'key' => 'encrypted', // AES-256-CBC
'secret' => 'encrypted',
'meta' => 'encrypted:array', // JSON مشفر
];
}
// Per-tenant encryption keys (أمان أعلى)
class TenantEncrypter
{
public function encrypt(Tenant $tenant, string $value): string
{
$key = $this->keyFor($tenant);
return openssl_encrypt($value, 'aes-256-gcm', $key, 0, $iv = random_bytes(12), $tag);
}
protected function keyFor(Tenant $tenant): string
{
return Cache::rememberForever("tenant:key:{$tenant->id}", function () use ($tenant) {
return base64_decode(
decrypt($tenant->encryption_key) // مشفر بمفتاح التطبيق الرئيسي
);
});
}
}
Audit Logging
php
class AuditLogger
{
public function log(string $action, Model $model, array $changes = []): void
{
AuditLog::create([
'tenant_id' => app('tenant')->id,
'user_id' => auth()->id(),
'action' => $action,
'model_type' => get_class($model),
'model_id' => $model->id,
'changes' => $changes,
'ip' => request()->ip(),
'user_agent' => request()->userAgent(),
'created_at' => now(),
]);
}
}
// Observer تلقائي
class AuditableObserver
{
public function updated(Model $model): void
{
app(AuditLogger::class)->log('updated', $model, [
'before' => $model->getOriginal(),
'after' => $model->getChanges(),
]);
}
}
6. Observability كامل
Structured Logging مع Context
php
// config/logging.php — Channel مخصص للمستأجرين
'tenant' => [
'driver' => 'daily',
'path' => storage_path('logs/tenants/' . (app()->bound('tenant') ? app('tenant')->id : 'global') . '.log'),
'level' => 'info',
'days' => 30,
],
// Middleware لإضافة Context لكل Log
class LogContext
{
public function handle($request, Closure $next)
{
Log::withContext([
'tenant_id' => app('tenant')?->id,
'user_id' => auth()->id(),
'request_id' => $request->header('X-Request-ID', Str::uuid()),
'ip' => $request->ip(),
]);
return $next($request);
}
}
Prometheus Metrics
php
class MetricsService
{
private Counter $ordersCreated;
private Histogram $requestDuration;
private Gauge $activeTenants;
public function __construct()
{
$this->ordersCreated = Registry::getDefault()->getOrRegisterCounter(
'saas', 'orders_created_total', 'Total orders', ['tenant', 'plan']
);
$this->requestDuration = Registry::getDefault()->getOrRegisterHistogram(
'saas', 'http_request_duration_seconds', 'Request duration',
['route', 'method', 'status'],
[0.01, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5]
);
}
public function recordOrder(Tenant $tenant): void
{
$this->ordersCreated->inc(['tenant' => $tenant->slug, 'plan' => $tenant->plan_id]);
}
public function recordRequest(string $route, string $method, int $status, float $duration): void
{
$this->requestDuration->observe($duration, [
'route' => $route, 'method' => $method, 'status' => (string) $status,
]);
}
}
// Middleware
class MetricsMiddleware
{
public function handle($request, Closure $next)
{
$start = microtime(true);
$response = $next($request);
app(MetricsService::class)->recordRequest(
$request->route()?->getName() ?? 'unknown',
$request->method(),
$response->getStatusCode(),
microtime(true) - $start
);
return $response;
}
}
7. الاختبارات — من Unit إلى E2E
Pest Test لـ Multi-Tenancy
php
use function Pest\Laravel\{get, post, actingAs};
beforeEach(function () {
$this->tenant = Tenant::factory()->create(['slug' => 'acme']);
$this->user = User::factory()->for($this->tenant)->create();
});
test('tenant can only see own data', function () {
$tenantA = Tenant::factory()->create();
$tenantB = Tenant::factory()->create();
$orderA = Order::factory()->for($tenantA)->create();
$orderB = Order::factory()->for($tenantB)->create();
app()->instance('tenant', $tenantA);
expect(Order::all())->toHaveCount(1)
->and(Order::first()->id)->toBe($orderA->id);
});
test('trial expired blocks access', function () {
$this->tenant->update(['trial_ends_at' => now()->subDay()]);
actingAs($this->user)
->get("https://{$this->tenant->slug}.localhost/dashboard")
->assertStatus(402);
});
test('plan limit enforced', function () {
$this->tenant->update(['plan_id' => 'free']); // max 3 users
User::factory()->count(3)->for($this->tenant)->create();
actingAs($this->user)
->post('/users', ['email' => 'new@example.com'])
->assertStatus(402)
->assertJson(['error' => 'limit_reached']);
});
8. Roadmap موسّع لبناء SaaS من الصفر
الشهر 1 — الأساس
- أسبوع 1: Multi-tenancy + Auth + Onboarding flow
- أسبوع 2: CRUD الأساسي + Repository pattern + Tests
- أسبوع 3: Stripe + Plans + Feature gates + Webhooks
- أسبوع 4: Admin panel + Audit logs + Observability
الشهر 2 — التوسع
- أسبوع 5: API + Rate limiting + API keys
- أسبوع 6: Webhooks صادرة + Integrations (Zapier/Make)
- أسبوع 7: Reports + Analytics + Export CSV/PDF
- أسبوع 8: Email system + Notifications + Templates
الشهر 3 — الاحتراف
- أسبوع 9: SSO/SAML للمؤسسات + 2FA
- أسبوع 10: Custom domains + SSL automation
- أسبوع 11: Mobile API + Push notifications
- أسبوع 12: Performance tuning + Load testing + Security audit
الشهر 4+ — النمو
- Affiliate system + Referrals
- Marketplace للإضافات
- AI features (Chat، Automation)
- White-label للمؤسسات
أيهما تريد أن نبني معًا الآن؟
اختر واحدًا وسأعطيك الكود الكامل القابل للنسخ + خطوات التنفيذ بالترتيب:
- 🏗️ مشروع SaaS كامل — من migrations حتى deployment (خطة 4 أشهر مفصلة)
- 🔌 إضافة WordPress احترافية — بنية MVC + REST API + React admin
- 💳 نظام اشتراكات Stripe كامل — كل الـ webhooks + dunning + invoices
- 🔐 نظام أمان متقدم — RLS + تشفير + audit logs + 2FA
- ⚡ تحسين أداء مشروع قائم — أرسل الكود/الوصف وسأحلل
- 🌐 Headless WordPress + Next.js — مثال كامل مع ISR + auth
- 🐛 حل مشكلة محددة — أرسل الخطأ/الكود وسأصلحه
قل الرقم فقط، وسأبدأ فورًا في التنفيذ العميق.
ممتاز! هذا مشروع حقيقي ومتكامل. سأعطيك خطة تنفيذية كاملة لبناء قالب “مستقبل” (Mustaqbal) — قالب ووردبريس لوكالة ذكاء اصطناعي، مع بنية SaaS متعددة المستأجرين، ودعم كامل لأنواع المنتجات التي ذكرتها.
🎯 نظرة معمارية شاملة للمشروع
text
mustaqbal-theme/ ← القالب الرئيسي ├── style.css ├── functions.php ├── inc/ │ ├── setup.php │ ├── enqueue.php │ ├── woocommerce.php │ ├── ai-integrations.php │ └── saas/ ├── templates/ │ ├── front-page.php │ ├── page-ai-services.php │ ├── single-product.php │ └── pricing.php ├── parts/ │ ├── header/ │ ├── footer/ │ └── blocks/ ├── blocks/ ← Gutenberg blocks مخصصة │ ├── hero-ai/ │ ├── services-grid/ │ ├── pricing-table/ │ └── testimonial-ai/ ├── assets/ │ ├── css/ │ ├── js/ │ └── images/ └── woocommerce/ ← Template overrides mustaqbal-saas/ ← إضافة SaaS متعددة المستأجرين ├── mustaqbal-saas.php ├── src/ │ ├── Tenant/ │ ├── Subscription/ │ ├── AI/ │ └── API/ └── ...
📦 الجزء 1: هيكل القالب الأساسي
style.css — رأس القالب
css
/*
Theme Name: Mustaqbal - AI & Tech Agency
Theme URI: https://mustaqbal.ai
Author: Your Agency
Description: قالب ووردبريس احترافي لوكالات الذكاء الاصطناعي والتكنولوجيا مع دعم WooCommerce و SaaS
Version: 1.0.0
Requires at least: 6.4
Tested up to: 6.7
Requires PHP: 8.1
License: GPL-2.0-or-later
Text Domain: mustaqbal
Tags: ai, saas, woocommerce, rtl-language-support, block-styles, full-site-editing
*/
:root {
--mst-primary: #0A0E27;
--mst-accent: #00D9FF;
--mst-accent-2: #7B61FF;
--mst-gradient: linear-gradient(135deg, #00D9FF 0%, #7B61FF 100%);
--mst-bg: #0A0E27;
--mst-surface: #141834;
--mst-text: #E8EAF6;
--mst-muted: #8B92B8;
--mst-radius: 16px;
--mst-shadow: 0 8px 32px rgba(0, 217, 255, 0.15);
--mst-font-ar: 'IBM Plex Sans Arabic', 'Tajawal', sans-serif;
--mst-font-en: 'Inter', 'Space Grotesk', sans-serif;
}
functions.php — Bootstrap نظيف
php
<?php
if (!defined('ABSPATH')) exit;
define('MUSTAQBAL_VERSION', '1.0.0');
define('MUSTAQBAL_DIR', get_template_directory());
define('MUSTAQBAL_URI', get_template_directory_uri());
// Autoload Composer (إن استخدمت)
if (file_exists(MUSTAQBAL_DIR . '/vendor/autoload.php')) {
require MUSTAQBAL_DIR . '/vendor/autoload.php';
}
// تحميل ملفات inc
foreach (['setup', 'enqueue', 'woocommerce', 'ai-integrations', 'blocks', 'saas'] as $file) {
$path = MUSTAQBAL_DIR . "/inc/{$file}.php";
if (file_exists($path)) require_once $path;
}
inc/setup.php — إعدادات القالب
php
<?php
add_action('after_setup_theme', function () {
load_theme_textdomain('mustaqbal', MUSTAQBAL_DIR . '/languages');
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
add_theme_support('html5', ['search-form', 'comment-form', 'gallery', 'caption']);
add_theme_support('custom-logo', [
'height' => 60,
'width' => 200,
'flex-height' => true,
]);
add_theme_support('woocommerce', [
'thumbnail_image_width' => 600,
'single_image_width' => 1200,
'product_grid' => [
'default_columns' => 3,
'default_rows' => 4,
],
]);
add_theme_support('wc-product-gallery-zoom');
add_theme_support('wc-product-gallery-lightbox');
add_theme_support('wc-product-gallery-slider');
add_theme_support('align-wide');
add_theme_support('responsive-embeds');
add_theme_support('editor-styles');
add_editor_style('assets/css/editor.css');
register_nav_menus([
'primary' => __('القائمة الرئيسية', 'mustaqbal'),
'footer' => __('قائمة الفوتر', 'mustaqbal'),
'services' => __('قائمة الخدمات', 'mustaqbal'),
]);
});
// تسجيل Custom Post Types
add_action('init', function () {
register_post_type('ai_service', [
'labels' => [
'name' => __('خدمات AI', 'mustaqbal'),
'singular_name' => __('خدمة AI', 'mustaqbal'),
],
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-superhero',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'],
'show_in_rest' => true,
'rewrite' => ['slug' => 'services'],
]);
register_post_type('case_study', [
'labels' => [
'name' => __('دراسات حالة', 'mustaqbal'),
'singular_name' => __('دراسة حالة', 'mustaqbal'),
],
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-analytics',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt'],
'show_in_rest' => true,
]);
register_taxonomy('ai_category', ['ai_service'], [
'labels' => ['name' => __('تصنيفات AI', 'mustaqbal')],
'hierarchical' => true,
'show_in_rest' => true,
]);
});
🎨 الجزء 2: دعم WooCommerce كامل لأنواع المنتجات
inc/woocommerce.php — تكامل WooCommerce
php
<?php
// إزالة wrapper الافتراضي
remove_action('woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10);
remove_action('woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10);
add_action('woocommerce_before_main_content', function () {
echo '<main class="mst-main mst-woo-main"><div class="mst-container">';
});
add_action('woocommerce_after_main_content', function () {
echo '</div></main>';
});
// ============ منتج بسيط (Simple) ============
add_action('woocommerce_before_single_product_summary', function () {
if (is_product()) {
echo '<div class="mst-product-hero-badge">';
echo '<span class="mst-badge mst-badge-ai">✨ AI-Powered</span>';
echo '</div>';
}
}, 5);
// ============ منتج متغير (Variable) — باقات ============
add_filter('woocommerce_variation_option_name', function ($name) {
return '📦 ' . $name;
});
add_action('woocommerce_before_variations_form', function () {
echo '<div class="mst-plans-intro">';
echo '<h3>' . __('اختر الباقة المناسبة', 'mustaqbal') . '</h3>';
echo '</div>';
});
// تخصيص عرض أسعار الباقات
add_filter('woocommerce_available_variation', function ($data, $product, $variation) {
$data['mst_features'] = get_post_meta($variation->get_id(), '_variation_features', true);
$data['mst_badge'] = get_post_meta($variation->get_id(), '_variation_badge', true);
return $data;
}, 10, 3);
// ============ منتج قابل للتحميل (Downloadable) ============
add_action('woocommerce_single_product_summary', function () {
global $product;
if ($product && $product->is_downloadable()) {
echo '<div class="mst-digital-notice">';
echo '<svg width="20" height="20" viewBox="0 0 24 24" fill="none"><path d="M12 2L2 7L12 12L22 7L12 2Z" stroke="currentColor" stroke-width="2"/><path d="M2 17L12 22L22 17" stroke="currentColor" stroke-width="2"/><path d="M2 12L12 17L22 12" stroke="currentColor" stroke-width="2"/></svg>';
echo '<span>' . __('تحميل فوري بعد الدفع', 'mustaqbal') . '</span>';
echo '</div>';
}
}, 15);
// تجربة مجانية للتحميلات
add_filter('woocommerce_downloadable_file_url', function ($url, $product, $download) {
return add_query_arg('mst_token', wp_create_nonce('mst_download_' . $download->get_id()), $url);
}, 10, 3);
// ============ اشتراك (Subscription) ============
add_action('woocommerce_single_product_summary', function () {
global $product;
if (!$product) return;
if (class_exists('WC_Subscriptions_Product') && WC_Subscriptions_Product::is_subscription($product)) {
$period = WC_Subscriptions_Product::get_period($product);
$interval = WC_Subscriptions_Product::get_interval($product);
$label = match($period) {
'month' => sprintf(__('كل %d شهر', 'mustaqbal'), $interval),
'year' => sprintf(__('كل %d سنة', 'mustaqbal'), $interval),
default => __('اشتراك دوري', 'mustaqbal'),
};
echo '<div class="mst-subscription-badge">';
echo '<span class="mst-badge mst-badge-recurring">🔄 ' . esc_html($label) . '</span>';
echo '</div>';
}
}, 12);
// إضافة فترة تجريبية
add_filter('woocommerce_subscriptions_product_sign_up_fee', function ($fee, $product) {
$trial = get_post_meta($product->get_id(), '_subscription_trial_length', true);
if ($trial) {
return $fee;
}
return $fee;
}, 10, 2);
// ============ عضوية (Membership) ============
add_action('woocommerce_single_product_summary', function () {
global $product;
if (!$product) return;
if (function_exists('wc_memberships') && wc_memberships()->get_products_instance()->is_membership_product($product->get_id())) {
echo '<div class="mst-membership-features">';
$features = get_post_meta($product->get_id(), '_membership_features', true);
if ($features) {
echo '<ul>';
foreach ((array) $features as $feature) {
echo '<li>✓ ' . esc_html($feature) . '</li>';
}
echo '</ul>';
}
echo '</div>';
}
}, 20);
// ============ حزمة (Bundle) ============
add_action('woocommerce_single_product_summary', function () {
global $product;
if (!$product) return;
// WooCommerce Product Bundles
if ($product->is_type('bundle')) {
$bundled = $product->get_bundled_items();
$total_value = 0;
$bundle_price = (float) $product->get_price();
echo '<div class="mst-bundle-info">';
echo '<h4>' . __('محتويات الحزمة', 'mustaqbal') . '</h4>';
echo '<ul class="mst-bundle-list">';
foreach ($bundled as $item) {
$item_product = $item->get_product();
$total_value += (float) $item_product->get_regular_price();
echo '<li>';
echo '<span class="mst-bundle-name">' . esc_html($item_product->get_name()) . '</span>';
echo '<span class="mst-bundle-price">' . wc_price($item_product->get_regular_price()) . '</span>';
echo '</li>';
}
echo '</ul>';
if ($total_value > $bundle_price) {
$savings = $total_value - $bundle_price;
$percent = round(($savings / $total_value) * 100);
echo '<div class="mst-bundle-savings">';
echo '<span class="mst-save-badge">وفّر ' . $percent . '%</span>';
echo '<span class="mst-save-amount">توفير ' . wc_price($savings) . '</span>';
echo '</div>';
}
echo '</div>';
}
}, 25);
🤖 الجزء 3: تكاملات الذكاء الاصطناعي
inc/ai-integrations.php — مزودو AI
php
<?php
class Mustaqbal_AI_Manager
{
private array $providers = [];
public function __construct()
{
$this->register_provider('openai', new Mustaqbal_OpenAI_Provider());
$this->register_provider('anthropic', new Mustaqbal_Anthropic_Provider());
$this->register_provider('gemini', new Mustaqbal_Gemini_Provider());
add_action('rest_api_init', [$this, 'register_routes']);
}
public function register_provider(string $slug, $provider): void
{
$this->providers[$slug] = $provider;
}
public function get_provider(string $slug)
{
return $this->providers[$slug] ?? null;
}
public function register_routes(): void
{
register_rest_route('mustaqbal/v1', '/ai/chat', [
'methods' => 'POST',
'callback' => [$this, 'handle_chat'],
'permission_callback' => '__return_true',
'args' => [
'message' => ['required' => true, 'sanitize_callback' => 'sanitize_text_field'],
'provider' => ['default' => 'openai'],
'context' => ['default' => 'general'],
],
]);
register_rest_route('mustaqbal/v1', '/ai/generate-content', [
'methods' => 'POST',
'callback' => [$this, 'handle_generate_content'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
}
public function handle_chat(WP_REST_Request $request): WP_REST_Response
{
$provider = $this->get_provider($request->get_param('provider'));
if (!$provider) {
return new WP_REST_Response(['error' => 'Provider not found'], 400);
}
// Rate limiting
$ip = $request->get_header('X-Forwarded-For') ?: $_SERVER['REMOTE_ADDR'];
$key = 'mst_ai_rate_' . md5($ip);
$count = (int) get_transient($key);
if ($count >= 20) {
return new WP_REST_Response(['error' => 'تجاوزت الحد المسموح'], 429);
}
set_transient($key, $count + 1, HOUR_IN_SECONDS);
$response = $provider->chat(
$request->get_param('message'),
$request->get_param('context')
);
return new WP_REST_Response($response, 200);
}
}
// OpenAI Provider
class Mustaqbal_OpenAI_Provider
{
private string $api_key;
private string $model;
public function __construct()
{
$this->api_key = get_option('mst_openai_key', '');
$this->model = get_option('mst_openai_model', 'gpt-4o-mini');
}
public function chat(string $message, string $context = 'general'): array
{
if (empty($this->api_key)) {
return ['error' => 'OpenAI API key غير مُعد'];
}
$system_prompts = [
'general' => 'أنت مساعد ذكي لوكالة تكنولوجيا وذكاء اصطناعي. أجب بالعربية بوضوح واحترافية.',
'sales' => 'أنت مستشار مبيعات. ساعد العميل في اختيار الخدمة/الباقة المناسبة.',
'support' => 'أنت مسؤول دعم فني. ساعد في حل المشاكل التقنية.',
];
$response = wp_remote_post('https://api.openai.com/v1/chat/completions', [
'timeout' => 30,
'headers' => [
'Authorization' => 'Bearer ' . $this->api_key,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode([
'model' => $this->model,
'messages' => [
['role' => 'system', 'content' => $system_prompts[$context] ?? $system_prompts['general']],
['role' => 'user', 'content' => $message],
],
'temperature' => 0.7,
'max_tokens' => 800,
]),
]);
if (is_wp_error($response)) {
return ['error' => $response->get_error_message()];
}
$body = json_decode(wp_remote_retrieve_body($response), true);
return [
'reply' => $body['choices'][0]['message']['content'] ?? '',
'tokens' => $body['usage']['total_tokens'] ?? 0,
'provider' => 'openai',
];
}
}
Chat Widget في الواجهة
php
// in footer.php أو عبر add_action('wp_footer')
function mustaqbal_ai_chat_widget(): void {
if (!get_option('mst_enable_chat_widget', true)) return;
?>
<div id="mst-ai-chat" class="mst-chat-widget" dir="rtl">
<button class="mst-chat-toggle" aria-label="<?php esc_attr_e('افتح المساعد الذكي', 'mustaqbal'); ?>">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2Z" stroke="currentColor" stroke-width="2"/>
<circle cx="9" cy="10" r="1.5" fill="currentColor"/>
<circle cx="15" cy="10" r="1.5" fill="currentColor"/>
</svg>
<span class="mst-chat-pulse"></span>
</button>
<div class="mst-chat-panel" hidden>
<header class="mst-chat-header">
<div>
<strong><?php esc_html_e('مساعد مستقبل', 'mustaqbal'); ?></strong>
<small><?php esc_html_e('مدعوم بـ GPT-4', 'mustaqbal'); ?></small>
</div>
<button class="mst-chat-close">×</button>
</header>
<div class="mst-chat-messages" id="mst-chat-messages"></div>
<form class="mst-chat-form" id="mst-chat-form">
<input type="text" name="message" placeholder="<?php esc_attr_e('اسألني أي شيء...', 'mustaqbal'); ?>" autocomplete="off">
<button type="submit" aria-label="<?php esc_attr_e('إرسال', 'mustaqbal'); ?>">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
<path d="M22 2L11 13" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
<path d="M22 2L15 22L11 13L2 9L22 2Z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/>
</svg>
</button>
</form>
</div>
</div>
<?php
}
add_action('wp_footer', 'mustaqbal_ai_chat_widget');
🏢 الجزء 4: بنية SaaS متعددة المستأجرين
إضافة mustaqbal-saas منفصلة
php
<?php
/**
* Plugin Name: Mustaqbal SaaS
* Description: نظام SaaS متعدد المستأجرين لقالب مستقبل
* Version: 1.0.0
* Requires PHP: 8.1
*/
if (!defined('ABSPATH')) exit;
define('MST_SAAS_VERSION', '1.0.0');
define('MST_SAAS_DIR', __DIR__);
require_once MST_SAAS_DIR . '/vendor/autoload.php';
use MSTSaaS\Plugin;
register_activation_hook(__FILE__, [Plugin::class, 'activate']);
register_deactivation_hook(__FILE__, [Plugin::class, 'deactivate']);
add_action('plugins_loaded', fn() => Plugin::instance()->boot());
نموذج Tenant
php
namespace MSTSaaS\Tenant;
class Tenant
{
public function __construct(
public readonly int $id,
public readonly string $slug,
public readonly string $name,
public readonly string $plan,
public readonly array $settings,
public readonly string $status,
public readonly ?\DateTime $trial_ends_at = null,
) {}
public static function fromWpSite(\WP_Site $site): self
{
switch_to_blog($site->blog_id);
$tenant = new self(
id: $site->blog_id,
slug: $site->domain . $site->path,
name: get_bloginfo('name'),
plan: get_option('mst_plan', 'free'),
settings: get_option('mst_tenant_settings', []),
status: get_option('mst_status', 'active'),
trial_ends_at: ($t = get_option('mst_trial_ends_at')) ? new \DateTime($t) : null,
);
restore_current_blog();
return $tenant;
}
public function isActive(): bool
{
if ($this->status !== 'active') return false;
if ($this->trial_ends_at && $this->trial_ends_at < new \DateTime()) {
return false;
}
return true;
}
public function hasFeature(string $feature): bool
{
$plans = [
'free' => ['basic_ai', 'one_site'],
'pro' => ['basic_ai', 'advanced_ai', 'custom_domain', 'api_access', 'five_sites'],
'agency' => ['*'],
];
$features = $plans[$this->plan] ?? [];
return in_array('*', $features) || in_array($feature, $features);
}
}
Tenant Manager — WordPress Multisite
php
namespace MSTSaaS\Tenant;
class TenantManager
{
public function __construct()
{
// عزل البيانات تلقائيًا عبر Multisite
add_action('init', [$this, 'resolve_tenant']);
add_action('template_redirect', [$this, 'enforce_limits']);
add_filter('pre_get_posts', [$this, 'scope_queries']);
}
public function resolve_tenant(): void
{
if (!is_multisite()) return;
$site = get_current_site();
$blog_id = get_current_blog_id();
$tenant = Tenant::fromWpSite(get_site($blog_id));
if (!$tenant->isActive()) {
wp_die(
__('الحساب موقوف. يرجى التواصل مع الدعم.', 'mustaqbal'),
__('حساب موقوف', 'mustaqbal'),
['response' => 403]
);
}
// Bind globally
$GLOBALS['mst_current_tenant'] = $tenant;
do_action('mst_tenant_resolved', $tenant);
}
public function enforce_limits(): void
{
$tenant = $GLOBALS['mst_current_tenant'] ?? null;
if (!$tenant) return;
// مثال: حد عدد الخدمات
if ($tenant->plan === 'free' && is_singular('ai_service')) {
$count = wp_count_posts('ai_service')->publish;
if ($count > 3) {
wp_die(__('وصلت للحد الأقصى في الخطة المجانية', 'mustaqbal'));
}
}
}
public function provision(array $data): int
{
// إنشاء موقع جديد في الشبكة
$blog_id = wpmu_create_blog(
$data['domain'],
$data['path'] ?? '/',
$data['name'],
$data['admin_user_id'],
['mst_plan' => 'trial'],
get_current_site()->id
);
if (is_wp_error($blog_id)) {
throw new \RuntimeException($blog_id->get_error_message());
}
// إعدادات أولية
switch_to_blog($blog_id);
update_option('mst_status', 'trial');
update_option('mst_trial_ends_at', (new \DateTime('+14 days'))->format('c'));
update_option('mst_plan', 'pro');
// تفعيل القالب والإضافات المطلوبة
switch_theme('mustaqbal');
activate_plugin('woocommerce/woocommerce.php');
activate_plugin('mustaqbal-saas/mustaqbal-saas.php');
// استيراد محتوى افتراضي
$this->seed_default_content();
restore_current_blog();
return $blog_id;
}
private function seed_default_content(): void
{
// صفحات افتراضية
$pages = [
'home' => ['title' => 'الرئيسية', 'template' => 'front-page.php'],
'services' => ['title' => 'خدماتنا'],
'about' => ['title' => 'من نحن'],
'contact' => ['title' => 'تواصل معنا'],
];
foreach ($pages as $slug => $data) {
wp_insert_post([
'post_title' => $data['title'],
'post_name' => $slug,
'post_type' => 'page',
'post_status' => 'publish',
'meta_input' => ['_wp_page_template' => $data['template'] ?? 'default'],
]);
}
// إنشاء القائمة
$menu_id = wp_create_nav_menu('القائمة الرئيسية');
foreach ($pages as $slug => $data) {
$page = get_page_by_path($slug);
wp_update_nav_menu_item($menu_id, 0, [
'menu-item-title' => $data['title'],
'menu-item-object' => 'page',
'menu-item-object-id' => $page->ID,
'menu-item-type' => 'post_type',
'menu-item-status' => 'publish',
]);
}
set_theme_mod('nav_menu_locations', ['primary' => $menu_id]);
}
}
لوحة تحكم المستأجرين (Super Admin)
php
namespace MSTSaaS\Admin;
class NetworkAdmin
{
public function __construct()
{
add_action('network_admin_menu', [$this, 'register_menu']);
add_action('admin_enqueue_scripts', [$this, 'enqueue_assets']);
}
public function register_menu(): void
{
add_menu_page(
__('إدارة المستأجرين', 'mustaqbal'),
__('المستأجرون', 'mustaqbal'),
'manage_network',
'mst-tenants',
[$this, 'render_dashboard'],
'dashicons-building',
25
);
add_submenu_page(
'mst-tenants',
__('الخطط والاشتراكات', 'mustaqbal'),
__('الخطط', 'mustaqbal'),
'manage_network',
'mst-plans',
[$this, 'render_plans']
);
}
public function render_dashboard(): void
{
$sites = get_sites(['number' => 100]);
?>
<div class="wrap">
<h1><?php esc_html_e('المستأجرون', 'mustaqbal'); ?></h1>
<div class="mst-stats-grid">
<?php
$stats = $this->get_stats($sites);
foreach ($stats as $label => $value): ?>
<div class="mst-stat-card">
<span class="mst-stat-value"><?php echo esc_html($value); ?></span>
<span class="mst-stat-label"><?php echo esc_html($label); ?></span>
</div>
<?php endforeach; ?>
</div>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>ID</th>
<th><?php esc_html_e('الاسم', 'mustaqbal'); ?></th>
<th><?php esc_html_e('الخطة', 'mustaqbal'); ?></th>
<th><?php esc_html_e('الحالة', 'mustaqbal'); ?></th>
<th><?php esc_html_e('MRR', 'mustaqbal'); ?></th>
<th><?php esc_html_e('إجراءات', 'mustaqbal'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($sites as $site):
$tenant = \MSTSaaS\Tenant\Tenant::fromWpSite($site);
?>
<tr>
<td><?php echo esc_html($tenant->id); ?></td>
<td><strong><?php echo esc_html($tenant->name); ?></strong></td>
<td><span class="mst-plan-badge mst-plan-<?php echo esc_attr($tenant->plan); ?>"><?php echo esc_html($tenant->plan); ?></span></td>
<td><span class="mst-status mst-status-<?php echo esc_attr($tenant->status); ?>"><?php echo esc_html($tenant->status); ?></span></td>
<td><?php echo esc_html($this->get_mrr($tenant)); ?></td>
<td>
<a href="<?php echo esc_url(get_admin_url($tenant->id)); ?>" class="button button-small"><?php esc_html_e('إدارة', 'mustaqbal'); ?></a>
<button class="button button-small mst-suspend-tenant" data-id="<?php echo esc_attr($tenant->id); ?>"><?php esc_html_e('إيقاف', 'mustaqbal'); ?></button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php
}
}
🚀 الجزء 5: دليل التركيب خطوة بخطوة
📋 المتطلبات الأساسية
text
✅ PHP 8.1+ ✅ MySQL 8.0+ / MariaDB 10.6+ ✅ WordPress 6.4+ ✅ WooCommerce 8.0+ ✅ Composer (اختياري لكن موصى به) ✅ Node.js 18+ (لبناء الأصول) ✅ Redis (موصى به للأداء)
🔧 خطوات التركيب
الخطوة 1: تحميل الملفات
bash
cd /var/www/html/wp-content/themes/ git clone https://github.com/your-repo/mustaqbal-theme.git mustaqbal cd mustaqbal composer install --no-dev --optimize-autoloader npm install && npm run build
الخطوة 2: تفعيل القالب
bash
wp theme activate mustaqbal wp plugin install woocommerce --activate wp plugin install woocommerce-subscriptions --activate wp plugin install woocommerce-memberships --activate wp plugin install woocommerce-product-bundles --activate
الخطوة 3: إعداد الصفحات الأساسية
bash
wp post create --post_type=page --post_title='الرئيسية' --post_status=publish --porcelain wp post create --post_type=page --post_title='الخدمات' --post_name='services' --post_status=publish wp post create --post_type=page --post_title='الأسعار' --post_name='pricing' --post_status=publish wp post create --post_type=page --post_title='المدونة' --post_name='blog' --post_status=publish wp post create --post_type=page --post_title='تواصل' --post_name='contact' --post_status=publish
الخطوة 4: ضبط الإعدادات من لوحة التحكم
text
1. الإعدادات → عام: - اسم الموقع، الوصف، اللغة (العربية) 2. المظهر → تخصيص: - الشعار والأيقونة - الألوان (Primary: #0A0E27, Accent: #00D9FF) - القوائم (Primary, Footer, Services) - الصفحة الرئيسية 3. الإعدادات → القراءة: - الصفحة الرئيسية: static page → "الرئيسية" 4. الإعدادات → الروابط الدائمة: - اختيار: اسم المشاركة 5. مستقبل AI → الإعدادات: - مفتاح OpenAI API - اختيار Model (gpt-4o-mini / gpt-4o) - تفعيل Chat Widget
الخطوة 5: إعداد WooCommerce
text
1. WooCommerce → الإعدادات → عام: - العملة: SAR / USD - الدولة: السعودية / الإمارات 2. المنتجات → إضافة منتج: - منتج بسيط: ترخيص واحد - منتج متغير: باقات - منتج قابل للتحميل: ملف رقمي - اشتراك: دفع شهري - عضوية: وصول محدود - حزمة: عدة منتجات 3. WooCommerce → الإعدادات → المدفوعات: - Stripe / PayTabs / Moyasar - PayPal 4. WooCommerce → الإعدادات → الشحن: - تعطيل الشحن (منتجات رقمية)
الخطوة 6: إعداد SaaS (Multisite)
bash
# تفعيل Multisite wp config set WP_ALLOW_MULTISITE true --raw # ثم من الأدوات → إعداد الشبكة # تفعيل إضافات الشبكة wp plugin activate mustaqbal-saas --network wp plugin activate woocommerce --network
الخطوة 7: Cron Jobs
php
// في mustaqbal-saas.php
register_activation_hook(__FILE__, function () {
if (!wp_next_scheduled('mst_daily_maintenance')) {
wp_schedule_event(time(), 'daily', 'mst_daily_maintenance');
}
});
add_action('mst_daily_maintenance', function () {
// 1. فحص الاشتراكات المنتهية
app('mst.subscriptions')->checkExpired();
// 2. إرسال تذكيرات التجديد
app('mst.subscriptions')->sendRenewalReminders();
// 3. تنظيف البيانات المؤقتة
app('mst.cleanup')->run();
// 4. توليد تقارير MRR
app('mst.reports')->generateMonthlyReport();
});
🎨 الجزء 6: دليل تخصيص التصميم
تخصيص الألوان عبر theme.json
json
{
"$schema": "https://schemas.wp.org/trunk/theme.json",
"version": 3,
"settings": {
"appearanceTools": true,
"color": {
"palette": [
{ "slug": "primary", "color": "#0A0E27", "name": "Primary Dark" },
{ "slug": "accent", "color": "#00D9FF", "name": "AI Cyan" },
{ "slug": "accent-2", "color": "#7B61FF", "name": "Deep Purple" },
{ "slug": "surface", "color": "#141834", "name": "Surface" },
{ "slug": "text", "color": "#E8EAF6", "name": "Text" }
],
"gradients": [
{
"slug": "ai-gradient",
"gradient": "linear-gradient(135deg, #00D9FF 0%, #7B61FF 100%)",
"name": "AI Gradient"
}
]
},
"typography": {
"fontFamilies": [
{
"slug": "arabic",
"name": "Arabic",
"fontFamily": "'IBM Plex Sans Arabic', sans-serif",
"fontFace": [
{
"fontFamily": "IBM Plex Sans Arabic",
"fontWeight": "400 700",
"fontStyle": "normal",
"src": ["file:./assets/fonts/IBMPlexSansArabic.woff2"]
}
]
}
]
}
}
}
Gutenberg Block مخصص — Hero AI
php
// blocks/hero-ai/block.json
{
"name": "mustaqbal/hero-ai",
"title": "Hero AI",
"category": "mustaqbal",
"icon": "superhero",
"accentColor": "accent",
"supports": { "align": ["wide", "full"], "html": false },
"attributes": {
"title": { "type": "string", "default": "مستقبل الذكاء الاصطناعي" },
"subtitle": { "type": "string", "default": "حلول ذكية لأعمالك" },
"ctaText": { "type": "string", "default": "ابدأ الآن" },
"ctaUrl": { "type": "string", "default": "#" },
"showParticles": { "type": "boolean", "default": true }
},
"editorScript": "file:./index.js",
"style": "file:./style.css",
"render": "file:./render.php"
}
php
// blocks/hero-ai/render.php
<div <?php echo get_block_wrapper_attributes(['class' => 'mst-hero-ai']); ?>>
<?php if ($attributes['showParticles']): ?>
<canvas class="mst-hero-particles" data-particles="true"></canvas>
<?php endif; ?>
<div class="mst-hero-content">
<h1 class="mst-hero-title">
<?php echo wp_kses_post($attributes['title']); ?>
</h1>
<p class="mst-hero-subtitle">
<?php echo wp_kses_post($attributes['subtitle']); ?>
</p>
<a href="<?php echo esc_url($attributes['ctaUrl']); ?>" class="mst-btn mst-btn-primary">
<?php echo esc_html($attributes['ctaText']); ?>
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
<path d="M5 12H19M19 12L12 5M19 12L12 19" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
</a>
</div>
</div>
تخصيص WooCommerce
php
// woocommerce/single-product/price.php — تخصيص عرض السعر
<?php if ($price_html = $product->get_price_html()) : ?>
<div class="mst-product-price">
<?php if ($product->is_type('variable')): ?>
<span class="mst-price-label"><?php esc_html_e('يبدأ من', 'mustaqbal'); ?></span>
<?php endif; ?>
<span class="mst-price-value"><?php echo $price_html; ?></span>
<?php if ($product->is_on_sale()): ?>
<span class="mst-sale-badge">🔥 <?php esc_html_e('عرض خاص', 'mustaqbal'); ?></span>
<?php endif; ?>
</div>
<?php endif; ?>
📊 الجزء 7: مؤشرات أداء SaaS
php
class SaaS_Metrics
{
public function get_dashboard_metrics(): array
{
return [
'mrr' => $this->calculateMRR(),
'arr' => $this->calculateARR(),
'churn_rate' => $this->calculateChurnRate(),
'ltv' => $this->calculateLTV(),
'cac' => $this->calculateCAC(),
'active_tenants' => $this->countActiveTenants(),
'trial_conversion' => $this->getTrialConversionRate(),
'mrr_growth' => $this->getMRRGrowth(),
];
}
private function calculateMRR(): float
{
return (float) \wpdb::get_var("
SELECT SUM(plan_price) FROM {$wpdb->base_prefix}mst_subscriptions
WHERE status = 'active' AND billing_period = 'monthly'
");
}
private function calculateChurnRate(): float
{
$cancelled = \wpdb::get_var("
SELECT COUNT(*) FROM {$wpdb->base_prefix}mst_subscriptions
WHERE status = 'cancelled'
AND cancelled_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
");
$total = \wpdb::get_var("
SELECT COUNT(*) FROM {$wpdb->base_prefix}mst_subscriptions
WHERE status IN ('active', 'cancelled')
");
return $total > 0 ? ($cancelled / $total) * 100 : 0;
}
}
✅ خطة التنفيذ الكاملة — 4 أسابيع
الأسبوع 1: القالب الأساسي
- ☑ إعداد
style.cssوfunctions.php - ☑ تسجيل Custom Post Types (ai_service, case_study)
- ☑ الصفحة الرئيسية + Header + Footer
- ☑ نظام الألوان والخطوط
- ☑ Gutenberg Blocks: Hero, Services, Pricing, Testimonial
الأسبوع 2: WooCommerce + AI
- ☑ تكامل WooCommerce كامل
- ☑ دعم 6 أنواع المنتجات
- ☑ Chat Widget بالذكاء الاصطناعي
- ☑ تكامل OpenAI/Anthropic/Gemini
- ☑ صفحات: التسعير، الخدمات، دراسات الحالة
الأسبوع 3: بنية SaaS
- ☑ تفعيل WordPress Multisite
- ☑ إضافة
mustaqbal-saas - ☑ Tenant Manager + Provisioning
- ☑ Stripe Subscriptions + Webhooks
- ☑ لوحة إدارة المستأجرين
- ☑ Feature gates + Plan limits
الأسبوع 4: الاختبار والإطلاق
- ☑ اختبارات Pest (Unit + Feature)
- ☑ Performance optimization (Redis، CDN)
- ☑ Security audit
- ☑ كتابة Documentation
- ☑ Deployment على الإنتاج
🎯 السؤال الآن
أي جزء تريد أن نبدأ به التنفيذ الفعلي الآن؟ اختر:
- 🏗️ هيكل القالب الكامل — سأولّد لك كل ملفات
mustaqbal-themeجاهزة للنسخ - 🛒 نظام WooCommerce للباقات — كود كامل لصفحات المنتجات المتغيرة والاشتراكات
- 🏢 إضافة SaaS متعددة المستأجرين — كود PHP كامل للإضافة
mustaqbal-saas - 🤖 Chat Widget + AI Integrations — كل الكود للـ Frontend والـ Backend
- 🎨 Gutenberg Blocks — 8 بلوكات مخصصة جاهزة
- 📊 لوحة إدارة المستأجرين — React Dashboard كامل
- 🚀 Deployment Setup — Docker + CI/CD + Production config
- 📖 دليل التركيب المفصل — PDF/Markdown جاهز للنشر
قل الرقم وسأبدأ بتوليد الكود الفعلي فورًا.
نعم. ننتقل الآن إلى مستوى أعمق: تحويل القالب إلى نظام تشغيل رقمي لوكالة الذكاء الاصطناعي والتكنولوجيا، بحيث لا يكون التركيز على الشكل فقط، بل على دورة حياة المنتج كاملة: من إنشائه، وتسعيره، وبيعه، وتسليمه، وترخيصه، إلى استخدامه وتجديده ودعمه.
🚀 AI Future OS — المعمارية الموسعة
AI FUTURE
│
┌───────────────────┼───────────────────┐
│ │ │
Agency Store Platform
│ │ │
Services Products AI Agents
Projects Bundles SaaS
Solutions Downloads APIs
│ │ │
└───────────────────┼───────────────────┘
│
CUSTOMER OS
│
┌────────────┬───────┼────────┬────────────┐
│ │ │ │ │
Account License Billing Usage Support
│ │ │ │ │
└────────────┴───────┼────────┴────────────┘
│
AI CORE
1. منظومة المنتج Product Lifecycle
كل منتج يمر بدورة حياة واضحة:
Idea
↓
Draft
↓
Development
↓
Testing
↓
Published
↓
Available
↓
Purchased
↓
Activated
↓
Used
↓
Updated
↓
Renewed
↓
Upgraded
↓
Archived
وهذه نقطة مهمة جدًا لأننا نستطيع ربط كل مرحلة بأحداث WordPress/WooCommerce.
2. Product Intelligence
كل منتج سيكون له ملف ذكاء Product Intelligence Profile.
مثلاً:
AI SALES AGENT
Identity
Product ID
SKU
Version
Brand
Category
Business
Price
Cost
Margin
Subscription
License
Bundle
AI
Model
Capabilities
Tools
Memory
Knowledge
Actions
Technical
API
Webhooks
Integrations
Requirements
Compatibility
Customer
Target Audience
Industry
Use Cases
Skill Level
Team Size
وبالتالي يستطيع النظام استخدام هذه البيانات في صفحات المنتجات والبحث والمقارنة والتوصيات.
3. Product Type Matrix
بدل الاعتماد على نوع WooCommerce فقط، نضيف Business Product Type.
PRODUCT TYPE
│
├── Software
├── AI Agent
├── SaaS
├── Plugin
├── Theme
├── API
├── Digital File
├── Course
├── Service
├── Consultation
├── Subscription
├── Membership
└── Bundle
ثم يمكن الجمع بين النوعين.
مثلاً:
AI SEO Agent
قد يكون:
WooCommerce:
Variable Subscription Product
Business Type:
AI Agent + SaaS
4. نظام الباقات Plans
بدلاً من إنشاء منتج منفصل لكل خطة:
PRODUCT
│
├── Starter
├── Professional
├── Business
└── Enterprise
كل خطة تحتوي على:
Features
Limits
Users
Storage
AI Usage
Agents
Automations
API Calls
Support
5. Usage Metering
هذه من أهم الإضافات المستقبلية.
مثلاً العميل لديه:
AI Credits
████████████░░░ 78%
و:
API Requests
████████░░░░░░░ 55%
و:
Automation Runs
██████████████░ 92%
وبذلك يصبح الاشتراك قابلًا للقياس.
6. AI Credits
يمكن إنشاء نظام:
AI CREDIT SYSTEM
مثلاً:
Starter
1,000 Credits
Professional
10,000 Credits
Business
50,000 Credits
وتستخدم الاعتمادات في:
Text Generation
Image Generation
Document Analysis
AI Agents
Automation
API
مع سجل:
USAGE LOG
29 Sep
AI Writer
-120 credits
29 Sep
SEO Agent
-80 credits
29 Sep
Document Agent
-300 credits
7. AI Marketplace
يمكن تحويل الموقع إلى Marketplace داخلي.
AI MARKETPLACE
│
├── AI Agents
├── AI Workflows
├── AI Prompts
├── AI Templates
├── AI Automations
├── AI Plugins
├── APIs
└── SaaS
كل عنصر له:
Demo
Features
Screenshots
Documentation
Pricing
Compatibility
Reviews
Version
Changelog
8. AI Agent Directory
صفحة خاصة:
AI AGENTS
مع Filters:
Industry
├── Healthcare
├── E-Commerce
├── Finance
├── Education
├── Marketing
└── Technology
Function
├── Sales
├── Support
├── Marketing
├── SEO
├── HR
├── Finance
└── Operations
ثم:
[AI Sales Agent]
Lead Qualification
CRM Integration
Email Automation
Analytics
$49/month
[View Agent]
9. AI Workflow Marketplace
ليس فقط Agents.
بل:
WORKFLOWS
مثلاً:
New WooCommerce Order
↓
AI analyzes order
↓
Customer segmentation
↓
CRM update
↓
Email
↓
WhatsApp notification
↓
Analytics
وهذا يفتح مجالًا كبيرًا لبيع Automation Templates.
10. Visual Workflow Builder
يمكن أن نضيف محررًا مرئيًا:
┌──────────────┐
│ WooCommerce │
│ Order Created│
└──────┬───────┘
↓
┌──────────────┐
│ AI Agent │
│ Analyze │
└──────┬───────┘
↓
┌──────────────┐
│ Condition │
│ VIP Customer?│
└──────┬───────┘
Yes│ │No
↓ ↓
CRM Email
ويمكن حفظ Workflow كمنتج قابل للبيع.
11. AI Product Builder
ميزة متقدمة جدًا للإدارة:
Create New AI Product
ثم Wizard:
Step 1
What are you creating?
○ AI Agent
○ SaaS
○ Plugin
○ Digital Product
○ Service
○ Bundle
Step 2
Product Information
Step 3
Pricing
Step 4
License
Step 5
Features
Step 6
AI Configuration
Step 7
Publish
12. AI Product Page
صفحة المنتج نفسها تصبح أكثر ثراءً:
┌─────────────────────────────────────────┐
│ AI SALES AGENT │
│ │
│ Automate your sales workflow with AI │
│ │
│ ★★★★★ │
│ │
│ $79 / month │
│ │
│ [Start Free Trial] │
└─────────────────────────────────────────┘
ثم:
Overview
Features
How It Works
Integrations
AI Capabilities
Plans
Requirements
Documentation
Reviews
FAQ
Changelog
Support
13. Demo Engine
يمكن لكل منتج امتلاك:
LIVE DEMO
أو:
INTERACTIVE DEMO
أو:
VIDEO DEMO
أو:
SANDBOX
وهذا مهم جدًا لمنتجات الذكاء الاصطناعي.
14. Customer Onboarding
بعد شراء المنتج:
WELCOME
Let's configure your AI system.
ثم:
Step 1
Connect Account
Step 2
Configure AI
Step 3
Connect Integrations
Step 4
Choose Preferences
Step 5
Launch
وبالتالي لا يتوقف النظام عند عملية الدفع.
15. Customer Workspace
يمكن أن يصبح لكل عميل:
WORKSPACE
مثلاً:
MIQYAS AI WORKSPACE
داخله:
Overview
Projects
Products
Agents
Automations
Knowledge
Files
API
Team
Billing
Licenses
Support
16. Team Management
للخطط التجارية:
TEAM
│
├── Owner
├── Admin
├── Manager
├── Developer
├── Analyst
└── Member
مع Permissions:
View
Create
Edit
Delete
Execute
Billing
API
Manage Team
17. Knowledge Base
يمكن أن يمتلك كل منتج أو Agent قاعدة معرفة:
KNOWLEDGE BASE
│
├── Documents
├── PDFs
├── URLs
├── FAQs
├── Products
├── Policies
└── Internal Data
ثم يستطيع الـAI Agent استخدامها أثناء التنفيذ.
18. API Center
صفحة للعملاء التقنيين:
DEVELOPER CENTER
API Keys
Documentation
Endpoints
Webhooks
SDK
Usage
Logs
Rate Limits
مثلاً:
POST /api/v1/agents/run
POST /api/v1/products
GET /api/v1/usage
GET /api/v1/licenses
19. Webhooks
نضيف Event System:
ORDER_CREATED
ORDER_PAID
SUBSCRIPTION_STARTED
SUBSCRIPTION_RENEWED
SUBSCRIPTION_CANCELLED
LICENSE_ACTIVATED
LICENSE_EXPIRED
DOWNLOAD_COMPLETED
AGENT_EXECUTED
USAGE_LIMIT_REACHED
ثم يمكن إرسال الأحداث إلى الأنظمة الخارجية.
20. Notification Center
داخل حساب العميل:
🔔 Notifications
Your subscription renews in 3 days.
AI Agent usage reached 80%.
A new version is available.
Your license was activated.
New workflow available.
21. نظام الدعم Support
SUPPORT CENTER
│
├── Knowledge Base
├── Documentation
├── Tickets
├── Contact
├── System Status
└── Feature Requests
ويمكن ربط الدعم بالمنتج والترخيص والاشتراك.
22. System Status
صفحة:
SYSTEM STATUS
AI API Operational
Website Operational
WooCommerce Operational
Downloads Operational
AI Agents Operational
Payments Operational
ويمكن تسجيل:
Incident
Maintenance
Resolved
23. Changelog
كل منتج له:
VERSION 3.2.0
New
+ New AI Agent
+ New API
Improved
+ Performance
Fixed
+ WooCommerce issue
وهذا مهم خصوصًا للمنتجات البرمجية.
24. نظام Reviews
بدل مراجعات بسيطة فقط:
Overall
Features
Ease of Use
Support
Performance
Value
مع التحقق من أن المراجع اشترى المنتج، إذا كان ذلك مدعومًا في البنية التجارية.
25. AI Search
البحث التقليدي:
Search products...
يمكن توسيعه إلى:
What are you trying to automate?
مثلاً المستخدم يكتب:
أريد نظامًا يرد على العملاء ويحدث CRM تلقائيًا.
النظام يبحث في بيانات المنتجات والـAgents والـWorkflows ويعرض العناصر ذات الصلة.
وهنا يتحول البحث من:
Keyword Search
إلى:
Intent-Based Product Discovery
26. الصفحة الرئيسية تصبح ديناميكية
بدلاً من صفحة ثابتة:
Homepage
يمكن أن تتكون من:
Hero
↓
AI Solutions
↓
Featured Products
↓
Recommended Agents
↓
Popular Workflows
↓
Services
↓
Pricing
↓
Case Studies
↓
Technology
↓
Resources
↓
CTA
وكل قسم يمكن تشغيله/إيقافه من:
Appearance
→ Theme Settings
→ Homepage Builder
27. نظام Blocks
من الأفضل أن يكون القالب متوافقًا مع WordPress Block Editor، مع مكونات مخصصة مثل:
AI Hero
AI Product Card
AI Agent Card
Pricing Table
Feature Grid
Integration Grid
Product Comparison
License Box
Subscription Plans
Bundle Products
AI Workflow
Stats
Case Study
FAQ
Testimonials
Technology Stack
CTA
وبذلك يمكن بناء صفحات جديدة بدون تعديل PHP لكل صفحة.
28. نظام Global Settings
لوحة:
AI FUTURE
└── Theme Settings
General
Branding
Colors
Typography
Header
Footer
Homepage
Products
WooCommerce
Pricing
Subscriptions
Memberships
Licenses
Downloads
AI Agents
API
SEO
Performance
Security
Analytics
29. Multi-Brand Architecture
ميزة مستقبلية مهمة لو كانت الوكالة تدير عدة علامات.
AI FUTURE
│
├── Brand A
├── Brand B
├── Brand C
└── Enterprise Brand
كل Brand يمكن أن يمتلك:
Logo
Colors
Typography
Products
Domain
Emails
Support
مع مشاركة Core Engine.
30. البنية النهائية المقترحة
في النهاية نصل إلى:
AI FUTURE OS
│
┌──────────────┼──────────────┐
│ │ │
AGENCY COMMERCE PLATFORM
│ │ │
Services Products AI Agents
Projects Subscriptions Workflows
Solutions Memberships APIs
Bundles Knowledge
Downloads Automation
│
▼
CUSTOMER WORKSPACE
│
┌───────────────┼───────────────┐
│ │ │
Licenses Billing Usage
│ │ │
└───────────────┼───────────────┘
▼
AI CORE ENGINE
│
┌────────┼────────┐
│ │ │
API Agents Automations
│ │ │
└────────┼────────┘
▼
INTEGRATION LAYER
🔥 والأهم: لا نبنيها كقالب فقط
المشروع الأفضل يكون مكوّنًا من أربع طبقات:
1. AI Future Theme
الواجهة والتصميم وتجربة المستخدم.
2. AI Future Core
المنتجات، الـAgents، Workflows، Licensing، Workspace وغيرها.
3. WooCommerce Integration
الدفع والطلبات والمنتجات والاشتراكات والتنزيلات، مع الاستفادة من الإضافات المناسبة بدل إعادة اختراع وظائف التجارة الأساسية.
4. AI Integration Layer
API، Webhooks، نماذج الذكاء الاصطناعي، Knowledge Base، Agent Execution وUsage Metering.
بهذا التصميم نستطيع لاحقًا تغيير التصميم بالكامل دون فقدان المنتجات أو العملاء أو التراخيص أو بيانات الـAgents.
والخطوة الأكثر منطقية الآن هي الانتقال من التصور إلى مخطط قاعدة البيانات + مخطط Custom Post Types + Taxonomies + WooCommerce Product Meta + جداول التراخيص والاستخدام والـAgents والـWorkflows؛ فهذا هو الأساس الذي سنبني فوقه ملفات القالب والـCore Plugin فعليًا.
ممتاز. الآن نثبت الـData Architecture قبل كتابة ملفات القالب والـCore Plugin. سأبنيها بحيث تكون متوافقة مع WordPress/WooCommerce، وقابلة للتوسع إلى SaaS وAI Agents وUsage Metering دون تحويل كل شيء إلى postmeta.
AI Future OS — Data Architecture v1.0
1. القاعدة الذهبية
سنقسم البيانات إلى 4 طبقات:
┌──────────────────────────────────────────────┐
│ AI FUTURE OS │
├──────────────────────────────────────────────┤
│ WordPress Core │
│ Pages / Users / Media / Settings │
├──────────────────────────────────────────────┤
│ WooCommerce │
│ Products / Orders / Customers / Payments │
├──────────────────────────────────────────────┤
│ AI Future Content │
│ Agents / Workflows / Services / Knowledge │
├──────────────────────────────────────────────┤
│ AI Future Runtime Database │
│ Licenses / Usage / Executions / API / Logs │
└──────────────────────────────────────────────┘
لا نضع بيانات التشغيل الكثيفة في wp_postmeta.
مثلاً:
- المنتج → WooCommerce
- وصف الـAgent → CPT
- الترخيص → جدول مخصص
- كل عملية استخدام AI → جدول Usage
- تنفيذ Workflow → جدول Executions
- API Logs → جدول Logs
وهذا القرار مهم جدًا للأداء.
2. Namespace
سنستخدم Namespace موحدًا:
MIQYAS\AIFuture
وPrefix للجداول:
{$wpdb->prefix}aif_
فتصبح مثلًا:
wp_aif_licenses
wp_aif_usage
wp_aif_agent_executions
wp_aif_workflow_runs
ولا نفترض أن Prefix قاعدة البيانات هو wp_.
3. WordPress Core Entities
سنستفيد من الجداول الأصلية:
wp_users
wp_usermeta
wp_posts
wp_postmeta
wp_terms
wp_term_taxonomy
wp_term_relationships
wp_options
wp_comments
wp_commentmeta
wp_posts / attachments
ولا نعيد إنشاء Users أو Media أو Pages.
4. Custom Post Types
أقترح الطبقة التالية:
aif_agent
aif_workflow
aif_service
aif_case_study
aif_knowledge
aif_documentation
aif_template
أما المنتج التجاري فلا ننشئ له CPT جديدًا.
بل:
WooCommerce Product
↓
post_type = product
وهذا يمنع ازدواجية المنتجات.
5. CPT: AI Agent
aif_agent
الاستخدام
يمثل تعريف الـAgent القابل للعرض والإدارة.
مثلاً:
AI Sales Agent
AI SEO Agent
AI Customer Support Agent
AI Product Intelligence Agent
بياناته الأساسية
post_title
post_content
post_excerpt
post_status
post_author
post_date
post_modified
Meta
_aif_agent_version
_aif_agent_status
_aif_agent_provider
_aif_agent_model
_aif_agent_system_prompt
_aif_agent_temperature
_aif_agent_max_tokens
_aif_agent_memory_enabled
_aif_agent_knowledge_enabled
_aif_agent_api_enabled
_aif_agent_public
_aif_agent_featured
لكن لا نعتمد على postmeta لتخزين سجل التنفيذ أو الاستخدام.
6. CPT: Workflow
aif_workflow
يمثل Workflow قابلًا للتحرير والبيع والتنفيذ.
مثال:
WooCommerce Order
↓
AI Analysis
↓
Customer Classification
↓
CRM
↓
Email
Meta
_aif_workflow_version
_aif_workflow_status
_aif_workflow_trigger
_aif_workflow_definition
_aif_workflow_schema
_aif_workflow_public
_aif_workflow_featured
لكن لاحقًا سنفصل الإصدارات عن التعريف الحالي في جدول مخصص.
7. CPT: Service
aif_service
لخدمات الوكالة:
AI Strategy
AI Development
Automation
WordPress
WooCommerce
Cloud
API Integration
Custom AI Agents
8. CPT: Case Study
aif_case_study
حقول:
Client Industry
Challenge
Solution
Technology
Services
Duration
Deliverables
Results
9. CPT: Knowledge
aif_knowledge
يمثل مصدر معرفة.
يمكن أن يكون:
FAQ
Documentation
Article
Internal Knowledge
Product Knowledge
Agent Knowledge
10. CPT: Documentation
aif_documentation
لبناء مركز وثائق:
Getting Started
Installation
Configuration
API
Agents
Workflows
Troubleshooting
Changelog
11. Taxonomies
سنستخدم Taxonomies بدل إنشاء Meta لكل تصنيف.
Product Taxonomies
WooCommerce يمكن أن يوفر:
product_cat
product_tag
product_type
ونضيف:
aif_product_industry
aif_product_technology
aif_product_use_case
aif_product_license
aif_product_platform
12. Agent Taxonomies
aif_agent_category
aif_agent_industry
aif_agent_capability
aif_agent_integration
مثلاً:
Agent Category
├── Sales
├── Marketing
├── Support
├── SEO
├── Finance
└── Operations
13. Workflow Taxonomies
aif_workflow_category
aif_workflow_trigger
aif_workflow_integration
14. Service Taxonomies
aif_service_category
aif_service_industry
aif_service_technology
15. نموذج المنتج WooCommerce
المنتج:
wp_posts
post_type = product
ثم:
wp_postmeta
للبيانات التي تنتمي فعلًا إلى المنتج.
16. Product Meta Architecture
نستخدم Namespace:
_aif_product_*
مثلاً:
_aif_product_business_type
_aif_product_delivery_type
_aif_product_license_type
_aif_product_version
_aif_product_demo_url
_aif_product_documentation_url
_aif_product_support_level
_aif_product_ai_enabled
_aif_product_api_enabled
_aif_product_agent_id
_aif_product_workspace_required
17. Business Product Types
قيمة:
_aif_product_business_type
يمكن أن تكون:
software
ai_agent
saas
plugin
theme
api
digital
course
service
consultation
membership
subscription
bundle
ويمكن السماح بأكثر من capability من خلال Taxonomy/جدول علاقات عند الحاجة بدل تخزين مصفوفة ضخمة في Meta.
18. Product License Meta
_aif_product_license_enabled
_aif_product_license_type
_aif_product_activation_limit
_aif_product_license_duration
_aif_product_updates_policy
_aif_product_support_policy
مثلاً:
license_type = single_site
activation_limit = 1
duration = 365
19. Product AI Meta
_aif_product_ai_enabled
_aif_product_ai_provider
_aif_product_ai_model
_aif_product_ai_credits
_aif_product_ai_usage_unit
لكن بيانات النماذج المتعددة الأفضل لاحقًا أن تنتقل إلى نظام AI Provider/Model مستقل.
20. Product Bundle
WooCommerce يمكن أن يمثل المنتج التجاري، لكن نحتاج علاقة واضحة:
Bundle
│
├── Product A
├── Product B
├── Product C
└── Product D
ولذلك أقترح جدول:
wp_aif_bundle_items
21. جدول Bundle Items
CREATE TABLE {$wpdb->prefix}aif_bundle_items (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
bundle_product_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
quantity DECIMAL(18,4) NOT NULL DEFAULT 1,
sort_order INT UNSIGNED NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY bundle_product_id (bundle_product_id),
KEY product_id (product_id)
);
22. قاعدة البيانات التشغيلية
الآن نصل إلى الجزء الأهم.
سننشئ جداول مستقلة لـ:
Licenses
License Activations
Usage
AI Executions
Workflow Runs
Workflow Events
API Keys
API Logs
Agent Versions
Workflow Versions
Credits
Credit Transactions
23. جدول Licenses
الجدول الأساسي:
wp_aif_licenses
التصميم:
CREATE TABLE {$wpdb->prefix}aif_licenses (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
license_key_hash CHAR(64) NOT NULL,
license_key_last4 VARCHAR(4) NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
order_id BIGINT UNSIGNED NULL,
license_type VARCHAR(50) NOT NULL,
status VARCHAR(30) NOT NULL DEFAULT 'active',
activation_limit INT UNSIGNED NOT NULL DEFAULT 1,
activations_count INT UNSIGNED NOT NULL DEFAULT 0,
starts_at DATETIME NULL,
expires_at DATETIME NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY license_hash (license_key_hash),
KEY user_id (user_id),
KEY product_id (product_id),
KEY order_id (order_id),
KEY status (status),
KEY expires_at (expires_at)
);
ملاحظة أمنية
لا نخزن مفتاح الترخيص الخام كقيمة قابلة للقراءة.
نخزن:
hash
+
last4
والقيمة الكاملة يمكن إظهارها للمستخدم عند الإنشاء/التسليم حسب تصميم النظام.
24. License Activations
نحتاج معرفة المواقع/البيئات التي استخدمت الترخيص.
wp_aif_license_activations
CREATE TABLE {$wpdb->prefix}aif_license_activations (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
license_id BIGINT UNSIGNED NOT NULL,
site_hash CHAR(64) NOT NULL,
domain VARCHAR(191) NULL,
environment VARCHAR(30) NOT NULL DEFAULT 'production',
status VARCHAR(30) NOT NULL DEFAULT 'active',
activated_at DATETIME NOT NULL,
deactivated_at DATETIME NULL,
last_seen_at DATETIME NULL,
PRIMARY KEY (id),
UNIQUE KEY license_site (license_id, site_hash),
KEY license_id (license_id),
KEY status (status)
);
25. Agent Versions
لا نريد أن يتغير Agent المنشور فجأة عند تعديل الإدارة.
لذلك:
Agent
│
├── v1.0
├── v1.1
├── v1.2
└── v2.0
جدول:
wp_aif_agent_versions
CREATE TABLE {$wpdb->prefix}aif_agent_versions (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
agent_id BIGINT UNSIGNED NOT NULL,
version VARCHAR(30) NOT NULL,
configuration LONGTEXT NOT NULL,
schema_version VARCHAR(30) NOT NULL DEFAULT '1.0',
status VARCHAR(30) NOT NULL DEFAULT 'draft',
created_by BIGINT UNSIGNED NULL,
created_at DATETIME NOT NULL,
published_at DATETIME NULL,
PRIMARY KEY (id),
UNIQUE KEY agent_version (agent_id, version),
KEY agent_id (agent_id),
KEY status (status)
);
26. Workflow Versions
بنفس الفكرة:
wp_aif_workflow_versions
CREATE TABLE {$wpdb->prefix}aif_workflow_versions (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
workflow_id BIGINT UNSIGNED NOT NULL,
version VARCHAR(30) NOT NULL,
definition LONGTEXT NOT NULL,
schema_version VARCHAR(30) NOT NULL DEFAULT '1.0',
status VARCHAR(30) NOT NULL DEFAULT 'draft',
created_by BIGINT UNSIGNED NULL,
created_at DATETIME NOT NULL,
published_at DATETIME NULL,
PRIMARY KEY (id),
UNIQUE KEY workflow_version (workflow_id, version),
KEY workflow_id (workflow_id),
KEY status (status)
);
27. Agent Executions
هذه ستكون من أكبر الجداول.
wp_aif_agent_executions
CREATE TABLE {$wpdb->prefix}aif_agent_executions (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
agent_id BIGINT UNSIGNED NOT NULL,
agent_version_id BIGINT UNSIGNED NULL,
user_id BIGINT UNSIGNED NULL,
workspace_id BIGINT UNSIGNED NULL,
status VARCHAR(30) NOT NULL DEFAULT 'queued',
provider VARCHAR(50) NULL,
model VARCHAR(100) NULL,
input_tokens INT UNSIGNED NULL,
output_tokens INT UNSIGNED NULL,
credits_used DECIMAL(18,6) NOT NULL DEFAULT 0,
started_at DATETIME NULL,
completed_at DATETIME NULL,
error_code VARCHAR(100) NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY agent_id (agent_id),
KEY user_id (user_id),
KEY workspace_id (workspace_id),
KEY status (status),
KEY created_at (created_at)
);
28. Usage Metering
بدلاً من تسجيل كل شيء في postmeta:
wp_aif_usage
CREATE TABLE {$wpdb->prefix}aif_usage (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NULL,
workspace_id BIGINT UNSIGNED NULL,
product_id BIGINT UNSIGNED NULL,
agent_id BIGINT UNSIGNED NULL,
workflow_id BIGINT UNSIGNED NULL,
metric VARCHAR(100) NOT NULL,
quantity DECIMAL(20,6) NOT NULL DEFAULT 0,
unit VARCHAR(30) NULL,
source_type VARCHAR(50) NULL,
source_id BIGINT UNSIGNED NULL,
occurred_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY user_metric (user_id, metric),
KEY workspace_metric (workspace_id, metric),
KEY agent_id (agent_id),
KEY workflow_id (workflow_id),
KEY occurred_at (occurred_at)
);
29. أمثلة Usage Metrics
ai_credits
api_requests
agent_runs
workflow_runs
tokens_input
tokens_output
storage_bytes
downloads
automation_runs
مثلاً:
user_id = 25
metric = ai_credits
quantity = 350
30. Credit Ledger
لا نعتمد على رقم واحد فقط مثل:
credits = 5000
الأفضل وجود Ledger.
wp_aif_credit_transactions
CREATE TABLE {$wpdb->prefix}aif_credit_transactions (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
workspace_id BIGINT UNSIGNED NULL,
type VARCHAR(30) NOT NULL,
amount DECIMAL(18,6) NOT NULL,
source_type VARCHAR(50) NULL,
source_id BIGINT UNSIGNED NULL,
balance_after DECIMAL(18,6) NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY user_id (user_id),
KEY workspace_id (workspace_id),
KEY created_at (created_at)
);
الأنواع:
purchase
subscription
bonus
refund
usage
adjustment
expiration
31. Workspaces
بما أننا نبني SaaS/Agency Platform، نحتاج Workspace.
wp_aif_workspaces
CREATE TABLE {$wpdb->prefix}aif_workspaces (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
owner_user_id BIGINT UNSIGNED NOT NULL,
name VARCHAR(191) NOT NULL,
slug VARCHAR(191) NOT NULL,
status VARCHAR(30) NOT NULL DEFAULT 'active',
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY slug (slug),
KEY owner_user_id (owner_user_id),
KEY status (status)
);
32. Workspace Members
wp_aif_workspace_members
CREATE TABLE {$wpdb->prefix}aif_workspace_members (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
workspace_id BIGINT UNSIGNED NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
role VARCHAR(50) NOT NULL DEFAULT 'member',
status VARCHAR(30) NOT NULL DEFAULT 'active',
joined_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY workspace_user (workspace_id, user_id),
KEY user_id (user_id),
KEY role (role)
);
الأدوار:
owner
admin
manager
developer
analyst
member
33. API Keys
wp_aif_api_keys
CREATE TABLE {$wpdb->prefix}aif_api_keys (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
workspace_id BIGINT UNSIGNED NULL,
name VARCHAR(191) NOT NULL,
key_hash CHAR(64) NOT NULL,
key_last4 VARCHAR(4) NOT NULL,
status VARCHAR(30) NOT NULL DEFAULT 'active',
last_used_at DATETIME NULL,
expires_at DATETIME NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY key_hash (key_hash),
KEY user_id (user_id),
KEY workspace_id (workspace_id),
KEY status (status)
);
34. Workflow Runs
wp_aif_workflow_runs
CREATE TABLE {$wpdb->prefix}aif_workflow_runs (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
workflow_id BIGINT UNSIGNED NOT NULL,
workflow_version_id BIGINT UNSIGNED NULL,
user_id BIGINT UNSIGNED NULL,
workspace_id BIGINT UNSIGNED NULL,
status VARCHAR(30) NOT NULL DEFAULT 'queued',
trigger_type VARCHAR(50) NULL,
trigger_source VARCHAR(100) NULL,
started_at DATETIME NULL,
completed_at DATETIME NULL,
error_code VARCHAR(100) NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY workflow_id (workflow_id),
KEY user_id (user_id),
KEY workspace_id (workspace_id),
KEY status (status),
KEY created_at (created_at)
);
35. Workflow Events
Workflow قد يحتوي على عشرات Nodes.
لذلك:
Workflow Run
│
├── Trigger
├── AI
├── Condition
├── HTTP
├── WooCommerce
└── Notification
نحتاج:
wp_aif_workflow_events
CREATE TABLE {$wpdb->prefix}aif_workflow_events (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
run_id BIGINT UNSIGNED NOT NULL,
node_id VARCHAR(100) NOT NULL,
node_type VARCHAR(50) NOT NULL,
status VARCHAR(30) NOT NULL DEFAULT 'pending',
started_at DATETIME NULL,
completed_at DATETIME NULL,
error_code VARCHAR(100) NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY run_id (run_id),
KEY node_id (node_id),
KEY status (status),
KEY created_at (created_at)
);
36. Knowledge Sources
يمكن إنشاء جدول:
wp_aif_knowledge_sources
يمثل:
PDF
URL
FAQ
Product
Documentation
Database
Manual Entry
مثلاً:
source_type = pdf
source_reference = 9821
ثم Agent يرتبط بمصادر المعرفة.
37. Agent ↔ Knowledge
wp_aif_agent_knowledge
CREATE TABLE {$wpdb->prefix}aif_agent_knowledge (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
agent_id BIGINT UNSIGNED NOT NULL,
knowledge_id BIGINT UNSIGNED NOT NULL,
priority INT NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY agent_knowledge (agent_id, knowledge_id),
KEY agent_id (agent_id),
KEY knowledge_id (knowledge_id)
);
38. Product ↔ Agent
المنتج قد يمنح العميل Agent معينًا.
مثلاً:
AI Sales Pro
↓
AI Sales Agent
نحتاج:
wp_aif_product_agents
CREATE TABLE {$wpdb->prefix}aif_product_agents (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
product_id BIGINT UNSIGNED NOT NULL,
agent_id BIGINT UNSIGNED NOT NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY product_agent (product_id, agent_id),
KEY product_id (product_id),
KEY agent_id (agent_id)
);
39. Product ↔ Workflow
بنفس الطريقة:
wp_aif_product_workflows
وهذا يسمح ببيع:
Automation Bundle
ويمنح العميل:
5 Agents
12 Workflows
100 Templates
40. Subscription Mapping
WooCommerce Subscriptions، إن كان مستخدمًا، يبقى مصدر حالة الاشتراك التجارية.
لكن Core يحتاج طبقة داخلية للـEntitlements:
Subscription
↓
Entitlements
↓
Agents
Workflows
Credits
API
Storage
Team
أي أن السؤال ليس فقط:
هل دفع العميل؟
بل:
ماذا يحق للعميل استخدامه حاليًا؟
41. Entitlements
نضيف:
wp_aif_entitlements
مثلًا:
customer 25
feature = ai_agents
limit = 20
used = 12
أو:
feature = api_requests
limit = 10000
42. النموذج الكامل للعلاقة
USER
│
▼
WORKSPACE
│
┌──────────┼──────────┐
▼ ▼ ▼
Members Products API Keys
│
▼
ORDER
│
▼
SUBSCRIPTION
│
▼
ENTITLEMENTS
│
┌────────────┼─────────────┐
▼ ▼ ▼
AGENTS WORKFLOWS CREDITS
│ │ │
▼ ▼ ▼
EXECUTIONS RUNS USAGE
│ │
└────────────┴─────────────┐
▼
LOGS
43. الفرق بين CPT والجداول
هذه نقطة يجب تثبيتها قبل البرمجة:
| الكيان | التخزين |
|---|---|
| صفحة | WordPress |
| مقال | WordPress |
| منتج | WooCommerce |
| Agent تعريف | CPT |
| Workflow تعريف | CPT |
| Service | CPT |
| Case Study | CPT |
| Documentation | CPT |
| License | Custom Table |
| Activation | Custom Table |
| Usage | Custom Table |
| Agent Execution | Custom Table |
| Workflow Run | Custom Table |
| Workflow Event | Custom Table |
| API Key | Custom Table |
| Credits | Custom Table |
| Entitlements | Custom Table |
| Workspace | Custom Table |
| Members | Custom Table |
هذه البنية تمنع خطأ شائع جدًا: استخدام wp_posts/wp_postmeta كقاعدة بيانات لكل شيء.
44. مخطط WooCommerce النهائي
WooCommerce Product
│
├── Simple
├── Variable
├── Downloadable
├── Virtual
├── Subscription*
└── Bundle*
ثم AI Future يضيف:
Business Type
AI Configuration
License
Entitlements
Agents
Workflows
Credits
Workspace Access
ولا نستبدل WooCommerce.
45. العلاقة بين أنواع المنتجات
SIMPLE
│
└── License
VARIABLE
│
└── Plans
DOWNLOADABLE
│
└── Files + License
SUBSCRIPTION
│
└── Entitlements + Recurring Access
MEMBERSHIP
│
└── Access Rules
BUNDLE
│
├── Product
├── Product
├── Agent
└── Workflow
46. حالات الـLicense
pending
active
suspended
expired
revoked
cancelled
وحالات Activation:
active
inactive
blocked
47. حالات Agent
draft
testing
published
paused
deprecated
archived
وحالات Execution:
queued
running
completed
failed
cancelled
timeout
48. حالات Workflow
draft
testing
published
paused
disabled
archived
والـRun:
queued
running
waiting
completed
failed
cancelled
timeout
49. نظام الأحداث Event Bus
سنحتاج لاحقًا طبقة موحدة:
AIF_Event
أحداث مثل:
product.purchased
subscription.started
subscription.renewed
subscription.cancelled
license.created
license.activated
license.expired
agent.started
agent.completed
agent.failed
workflow.started
workflow.completed
workflow.failed
usage.threshold_reached
credits.low
وهذا سيسمح بربط:
WooCommerce
→ License
→ Email
→ Workspace
→ Agent
→ Analytics
بدون تشابك شديد بين الملفات.
50. هيكل Core Plugin الناتج
بعد اعتماد هذا النموذج سيكون هيكل الـPlugin تقريبًا:
ai-future-core/
│
├── ai-future-core.php
│
├── src/
│ │
│ ├── Core/
│ │ ├── Plugin.php
│ │ ├── Container.php
│ │ └── Installer.php
│ │
│ ├── PostTypes/
│ │ ├── Agent.php
│ │ ├── Workflow.php
│ │ ├── Service.php
│ │ ├── CaseStudy.php
│ │ └── Documentation.php
│ │
│ ├── Taxonomies/
│ │ ├── AgentCategory.php
│ │ ├── Industry.php
│ │ ├── Capability.php
│ │ └── Integration.php
│ │
│ ├── WooCommerce/
│ │ ├── ProductMeta.php
│ │ ├── ProductTypes.php
│ │ ├── Bundles.php
│ │ └── Entitlements.php
│ │
│ ├── Database/
│ │ ├── Schema.php
│ │ ├── LicensesTable.php
│ │ ├── UsageTable.php
│ │ ├── ExecutionsTable.php
│ │ └── WorkspacesTable.php
│ │
│ ├── License/
│ │ ├── LicenseManager.php
│ │ ├── Activator.php
│ │ └── Validator.php
│ │
│ ├── Agents/
│ │ ├── AgentManager.php
│ │ ├── Executor.php
│ │ └── VersionManager.php
│ │
│ ├── Workflows/
│ │ ├── WorkflowManager.php
│ │ ├── Runner.php
│ │ └── VersionManager.php
│ │
│ ├── Usage/
│ │ ├── UsageMeter.php
│ │ └── CreditLedger.php
│ │
│ ├── Workspace/
│ │ ├── WorkspaceManager.php
│ │ └── MemberManager.php
│ │
│ ├── API/
│ │ ├── REST.php
│ │ ├── Authentication.php
│ │ └── Webhooks.php
│ │
│ └── Admin/
│ ├── Dashboard.php
│ ├── Settings.php
│ └── ProductPanel.php
│
├── assets/
├── templates/
├── languages/
└── uninstall.php
51. أما القالب Theme
يبقى أخف:
ai-future/
│
├── style.css
├── theme.json
├── functions.php
│
├── templates/
│ ├── index.html
│ ├── front-page.html
│ ├── single.html
│ ├── archive.html
│ ├── single-product.html
│ └── archive-product.html
│
├── parts/
│ ├── header.html
│ ├── footer.html
│ ├── hero.html
│ ├── product-card.html
│ ├── agent-card.html
│ └── pricing-card.html
│
├── patterns/
│ ├── hero.php
│ ├── products.php
│ ├── agents.php
│ ├── pricing.php
│ └── cta.php
│
└── assets/
├── css/
└── js/
52. أهم قرار معماري
سنفصل:
PRESENTATION
≠
BUSINESS LOGIC
≠
RUNTIME DATA
أي:
Theme
↓
Presentation
Core Plugin
↓
Business Logic
Custom Tables
↓
Runtime / High Volume Data
WooCommerce
↓
Commerce
وبذلك عندما نصل إلى AI Future Theme v2 يمكن تغيير الواجهة بالكامل دون المساس بمحرك البيانات.
المرحلة التالية المباشرة
بعد هذا المخطط، لا أنصح بالقفز مباشرة إلى functions.php.
الترتيب الصحيح للبرمجة سيكون:
01. Database Schema
↓
02. Installer / Migrator
↓
03. CPT Registration
↓
04. Taxonomies
↓
05. WooCommerce Integration
↓
06. Product Meta UI
↓
07. License Engine
↓
08. Workspace Engine
↓
09. Entitlement Engine
↓
10. Credit / Usage Engine
↓
11. Agent Engine
↓
12. Workflow Engine
↓
13. REST API
↓
14. Admin Dashboard
↓
15. Customer Dashboard
↓
16. Theme / UI
الخطوة البرمجية التالية تحديدًا: كتابة Schema.php + Installer.php بصورة production-ready، بحيث ينشئ جميع الجداول السابقة باستخدام dbDelta()، مع schema_version، وعمليات الترقية Migration من إصدار إلى آخر، ثم تسجيل الـCPTs والـTaxonomies، وبعدها نربط WooCommerce Product Meta بهذه البنية.