موقع الإقامات
ما يفعله موقع الحجز: الصفحة الرئيسية، والإقامات ومرشحاتها، وصفحة الإقامة بتقويمها وبطاقة الحجز، وإتمام الطلب، وصفحة حجز الضيف، والإقامات المحفوظة، والأسئلة، ومحركات البحث ووسوم التسويق.
لحزمة الحزمة الكاملة
الصفحات
كل صفحة موجودة بالإنجليزية تحت /en وبالعربية تحت /ar. ليس في الموقع حسابات ولا تسجيل دخول. يبقى الرأس في أعلى النافذة أثناء تمرير الصفحة، ويعرض كل حقل في النماذج مثالًا على ما يتوقعه، ويُرسم النص العربي في صفحة إنجليزية، مثل بند العربية في قائمة اللغات، بالخط العربي.
| الصفحة | المسار | ما تعرضه |
|---|---|---|
| الرئيسية | /en | بحث مرتبط بالواجهة (الوجهة والوصول والمغادرة والضيوف)، وصور إقامة الواجهة بجوار أولى الوجهات، وكل وجهة، والإقامات المختارة التي يحددها المضيف في لوحة التحكم، وأنواع الأماكن الستة، وكيف يتم الحجز، وعطلة نهاية أسبوع طويلة وشهر كبحثين جاهزين، ولماذا تحجز مباشرة، وأسئلة الضيوف، وطريقة للتواصل. |
| الإقامات | /en/stays، مثل /en/stays?destination=marisol-coast&guests=2 | الإقامات المنشورة، مع المرشحات والفرز والصفحات. |
| إقامة | /en/stays/cedar-house | الصور، والمعلومات، وبطاقة الحجز، والوصف، والمرافق، والأوقات وقواعد المنزل، وتقويم التوفر، والتقييمات، والمنطقة على خريطة، وإقامات مشابهة، ونافذة سؤال. |
| إتمام الشراء | /en/book/cedar-house?checkIn=…&checkOut=…&guests=2 | تُفتح من زر «احجز» في الإقامة: بيانات الضيف، وطريقة الدفع، وسياسة الإلغاء، والملخص. |
| حجز | /en/bookings/<reference> | حجز الضيف نفسه، يُفتح من الرابط بعد إتمام الطلب أو يُعثر عليه بالمرجع والبريد الإلكتروني. |
| اعثر على حجزي | /en/bookings/find | مرجع الحجز والبريد الإلكتروني الذي استُخدم فيه. |
| الوجهات | /en/destinations, /en/destinations/marisol-coast | كل الوجهات، ووجهة واحدة مع إقاماتها. |
| الإقامات المحفوظة | /en/saved | الإقامات التي حفظها الزائر، محفوظة في متصفحه. |
| من نحن، التواصل، الخصوصية | /en/about, /en/contact, /en/privacy | قصة الشركة وبياناتها ونموذج التواصل، ونص خصوصية قالب يجب إعادة كتابته قبل الإطلاق. |
العثور على إقامة
- مرشحات للوجهة والتواريخ والضيوف ونوع الإقامة (
villaوapartmentوcabinوchaletوloftوcottage)، تبقى في العنوان، فيمكن مشاركة البحث وإعادة تحميله والتنقل فيه بالرجوع والتقدم. تظهر المرشحات المطبقة كشارات، ويفتح الهاتف المرشحات نفسها في ورقة سفلية، تُغلق بزر «إغلاق». - مع التواريخ لا تُسرد إلا الإقامات الخالية في كل ليلة من
[check-in, check-out)؛ ومع الضيوف لا تُسرد إلا التي تتسع لهذا العدد. - الفرز بترتيب الشركة نفسها، أو بالسعر من الأقل إلى الأعلى أو من الأعلى إلى الأقل، أو بالتقييم، بست إقامات في الصفحة.
- لا تظهر إلا الإقامات المنشورة. كل سعر هو رمز العملة متبوعًا بالمبلغ، مثل
USD 240 / night.
صفحة الإقامة
- معرض من صورة كبيرة واحدة وصورها المصغرة، وشريط تمرير على الهاتف، والمعلومات: الضيوف وغرف النوم والأسرّة والحمامات والمساحة.
- بطاقة الحجز تسعّر الليالي كما تُختار: سعر الليلة في عدد الليالي، ورسوم التنظيف مرة واحدة، والإجمالي، من عرض السعر الذي تعيده واجهة API. وعلى الهاتف يبقى الإجمالي وزر «احجز» مثبتين في أسفل الشاشة.
- تقويم التوفر يعرض شهرين بخمس حالات: متاح، وغير متاح (ماضٍ أو داخل الحد الأدنى للإقامة)، ومحجوز، والوصول والمغادرة المختاران، والليالي بينهما.
- الوصف، والمرافق، وأوقات الوصول والمغادرة وقواعد المنزل، والتقييمات المنشورة مع متوسط الإقامة، والمنطقة التقريبية على خريطة (لا العنوان الدقيق أبدًا)، وحتى ثلاث إقامات مشابهة، ونافذة سؤال.
إتمام الطلب
- الاسم الأول واسم العائلة للضيف، والبريد الإلكتروني، والهاتف، وطلبات خاصة اختيارية، وعدد ضيوف واحد (لا يُفصل البالغون والأطفال)، وطريقة الدفع من بين ما تعرضه واجهة API: البطاقة أو PayPal أو الدفع عند الوصول.
- يؤكد الضيف سياسة الإلغاء، التي تعدّلها الشركة في إعداداتها. يلغي الضيف مجانًا عبر الإنترنت حتى سبعة أيام قبل وقت الوصول المحلي.
- يُتمّ حجز البطاقة أو PayPal على صفحة Stripe أو PayPal نفسها، فلا يصل رقم بطاقة إلى الموقع ولا إلى واجهة API. الـ webhook هو ما يؤكده، لا عودة الضيف أبدًا؛ وإلى أن يصل تقول صفحة الحجز إن الدفع قيد التأكيد.
- ما دام لا معالج مضبوط، يجمع المحاكي المرفق البطاقة في الصفحة نفسها، تحت الملاحظة «وضع الاختبار: لا تخصم أي مبالغ من البطاقة.»، ويسوّيها فورًا؛ ويُرفض رقم ينتهي بـ
0. وبعد ضبط Stripe أو PayPal لا يعرض إتمام الطلب إلا الطرق التي يقبلانها، مع الدفع عند الوصول ما دام مفعّلًا.
الحجز بعد ذلك
- تفتح الصفحة بعد إتمام الطلب الحجز برمز خاص في عنوانها. وبعد ذلك يجده الضيف في «اعثر على حجزي» بمرجعه (مثل
B0021) والبريد الإلكتروني الذي استُخدم فيه؛ والزوج الخاطئ يجيب بأنه لم يُعثر على حجز. - تعرض الإقامة والتواريخ والليالي والضيوف والسعر والدفع، وما يحدث بعد ذلك.
- يلغيه الضيف من هناك ما دام قيد الانتظار أو مؤكدًا وكان الوصول بعد سبعة أيام على الأقل؛ وبعد ذلك تطلب الصفحة التواصل مع المضيف.
- بعد اكتمال الإقامة يمكن للضيف تقييمها من الصفحة نفسها، مرة لكل حجز، بتقدير وتعليق من 10 إلى 2000 حرف. تظهر التقييمات في صفحة الإقامة فورًا، ويمكن للفريق إخفاء أي منها من لوحة التحكم.
أسئلة إلى المضيف
ترسل صفحة التواصل ونافذة السؤال في صفحة الإقامة سؤالًا إلى المضيف: اسم، وبريد إلكتروني، وهاتف اختياري، ورسالة من 10 إلى 4000 حرف، ومن صفحة الإقامة تلك الإقامة مع التواريخ والضيوف المختارين. يصبح كل سؤال استفسارًا في لوحة التحكم، مع إشعار. لا يُرسل شيء بالبريد: يرى الضيف تأكيدًا في الصفحة، ويجيب الفريق من بريده الخاص.
يحمل إتمام الطلب والنموذجان حقلًا مخفيًا يصطاد الروبوتات ورمزًا لمرة واحدة، فيُخزَّن الإرسال نفسه مرة واحدة فقط، ويمكن لكل عنوان إرسال خمسة حجوزات وخمسة أسئلة وخمسة تقييمات في عشر دقائق.
الإقامات المحفوظة
يحفظ الزائر حتى 12 إقامة بدون حساب. تبقى القائمة في متصفحه ولا تصل إلى واجهة API أبدًا، سوى قراءة بطاقات الإقامات المحفوظة.
محركات البحث
- تضبط كل صفحة عنوانها ووصفها وعنوانها الأساسي واللغة البديلة، وتُبنى من
NEXT_PUBLIC_SITE_URL. وتستخدم صفحة الإقامة عنوان SEO ووصف الإقامة نفسها وصورة غلافها للمشاركة، وصفحة الوجهة اسمها وغلافها. - يسرد
/sitemap.xmlكل صفحة عامة باللغتين، وكل إقامة منشورة، وكل وجهة؛ ويشير إليه/robots.txt. ويُوسَم الحجز وصفحة الطلب الملغى والإقامات المحفوظة بـnoindex.
أوسمة التحليلات والتتبع
ست شبكات مربوطة. شغّل أيًّا منها بوضع معرّفها في .env (مع Docker Compose في .env بجانب docker-compose.yml) وإعادة البناء؛ والمعرّف الفارغ لا يحمّل أي سكربت.
| المتغير | الشبكة |
|---|---|
NEXT_PUBLIC_GTM_ID | Google Tag Manager |
NEXT_PUBLIC_GA4_MEASUREMENT_ID | Google Analytics 4 |
NEXT_PUBLIC_META_PIXEL_ID | Facebook و Instagram |
NEXT_PUBLIC_TIKTOK_PIXEL_ID | TikTok |
NEXT_PUBLIC_SNAPCHAT_PIXEL_ID | Snapchat |
NEXT_PUBLIC_PINTEREST_TAG_ID |
يرسل الموقع page_view وخمسة أحداث:
| الحدث | متى |
|---|---|
page_view | كل تغيير مسار |
view_stay | تُعرض صفحة إقامة |
save_stay | تُحفظ إقامة |
booking_started | يُرسَل إتمام الطلب |
booking_paid | ضيف وصل من إتمام الطلب يرى الحجز مدفوعًا، مرة لكل حجز |
inquiry_submit | يُرسَل سؤال |
- ينتظر
booking_paidتسوية الدفع، فيُحتسب حجز البطاقة أو PayPal حين يعلّمه webhook أو المحاكي مدفوعًا. أما صفحة الحجز نفسها إذا فُتحت لاحقًا بالمرجع والبريد الإلكتروني فلا تُحتسب، وإعادة التحميل لا تبلّغ عنه مرتين، والحجز المدفوع عند الوصول لا يُبلَّغ عنه كعملية شراء. - إذا كان GA4 يعمل داخل حاوية Tag Manager لديك، فاترك معرّف GA4 فارغًا، وإلا حُسبت كل جلسة مرتين.
- يُرسل
NEXT_PUBLIC_ANALYTICS_CURRENCY(USDافتراضيًا) مع كل سعر متتبَّع، ويسجّلNEXT_PUBLIC_ANALYTICS_DEBUG=trueكل حدث في وحدة تحكم المتصفح. - تُحمَّل الأوسمة بمجرد تحميل الصفحة. إذا كنت تخدم زوارًا في الاتحاد الأوروبي أو المملكة المتحدة، فضع أمامهم لافتة موافقة أولًا.
كيف يترابط كود الموقع
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
بنية الكود والأعراف التي يجب الحفاظ عليها عند تغييره.