المشكلة
One Mind Agency وكالة إبداعية احتاجت إلى موقع ثنائي اللغة، بالإنجليزية والإيطالية، يعرض أعمالها ويجلب عملاء جددًا. أراد الفريق نشر دراسات الحالة من لوحة تحكم مألوفة، وكان لا بد أن يصل كل استفسار إلى مسار المبيعات لا إلى صندوق البريد. وكانت الاستضافة مشتركة: يمكن لـNode تشغيل عمليات البناء، لكن لا يمكنه تشغيل خادم دائم.
ما الذي بنيته
بنيتُ ثلاثة أجزاء تعمل جنبًا إلى جنب على نطاق واحد.
- واجهة ثابتة بـNext.js — صفحات الرئيسية والأعمال ودراسة الحالة المفردة ومن نحن والتواصل، مُصدَّرة كملفات عادية تحت /en/ و/it/. سريعة التقديم، ولا شيء يحتاج إلى البقاء قيد التشغيل.
- WordPress بلا واجهة تحت /cms — تسجّل إضافة مخصصة نوع المحتوى Case Study وحقوله (العميل، والسنة، والفئة، ولون التمييز، والملخص، وفريق العمل) وتتيحها مع ترجماتها عبر REST API. وتعيد صفحات WordPress العامة التوجيه إلى الموقع الفعلي.
- إعادة بناء تلقائية — حين يحفظ المحرر محتوى، يرفع WordPress علامة. تلتقطها مهمة على الخادم خلال نحو 5 دقائق، فتعيد بناء الموقع وتستبدل الملفات، مع قفل يمنع تداخل عمليتي بناء.
- من نموذج التواصل إلى CRM — جسر PHP صغير يحوّل كل استفسار إلى Lead في EspoCRM، مع نطاق الميزانية واللغة. ويبقى مفتاح CRM على الخادم ولا يصل إلى المتصفح أبدًا.
- الحماية من الرسائل المزعجة وإساءة الاستخدام — حقل honeypot مخفي، وطلب واحد كل 30 ثانية لكل عنوان IP، وقائمة مصادر مسموح بها، وتحقق صارم من كل حقل.
- لا صور معطلة — إذا أشارت دراسة حالة إلى ملف صورة لم يعد موجودًا، لا تُرجع الواجهة البرمجية شيئًا وتعرض الصفحة لونًا بديلًا.
التقنيات المستخدمة
Next.js 15 مع التصدير الثابت، وReact 19 وTailwind CSS وFramer Motion وLenis. وWordPress مع ACF وPolylang. وEspoCRM. وPHP 8.2 وMariaDB 10.11 على Hetzner.
لماذا بهذه الطريقة
لا يسمح الخادم بـNode إلا لعمليات البناء، دون عمليات طويلة التشغيل. لذا يُولَّد الموقع وقت البناء ويُقدَّم كملفات ثابتة، بينما يعمل WordPress وCRM على PHP الموجود أصلًا في الخادم. فيحتفظ المحررون بلوحة تحكم عادية، ويحصل الزوار على HTML خالص.


