/docs
وثائق pSEO Wizard
كل ما تحتاجه للانتقال من موقعك إلى صفحات منشورة: كيف يعمل المعالج، وكيف تضع الصفحات على موقعك دون كتابة أي كود، وماذا تفعل إذا لم يعمل شيء كما يجب.
آخر تحديث: سبتمبر 2026
/how-it-works
كيف يعمل
يتكون المعالج من خمس خطوات، ويمكنك الرجوع وتعديل أي خطوة قبل الدفع.
- 01
الصق رابط موقعك
نقرأ صفحتك الرئيسية وبعض الصفحات المهمة (الخدمات، الأسعار، القائمة، من نحن، التواصل) ونتعرّف على نوع نشاطك. أضف أي معلومات أساسية تريد أن تستخدمها كل الصفحات.
- 02
اختر نمطًا
اختر شكل عمليات البحث، مثل “{الخدمة} في {المدينة}” أو “{المنتج} لـ {الجمهور}”، واختر قالب الصفحة.
- 03
أضف القيم
اكتب الخدمات أو المدن أو الفئات التي تريد دمجها، وكل تركيبة تصبح صفحة. وإذا استهدفت أماكن، نتحقق من أنها مناسبة لطريقة خدمتك لعملائك.
- 04
أنشئ الصفحات
أنشئ صفحتك المجانية أولًا. وعندما تعجبك، ادفع ثمن البقية (10 صفحات على الأقل) وستُكتب الصفحات واحدة تلو الأخرى.
- 05
انشر أو نزّل
أرسل الصفحات إلى WordPress أو Shopify أو Webflow أو WooCommerce، أو نزّلها كملفات HTML جاهزة للرفع.
/html-export
تنزيل صفحاتك
في الخطوة 5، يمنحك زر تنزيل الحزمة ملف ZIP فيه كل ما تحتاجه لاستضافة الصفحات في أي مكان:
dist/ملف HTML جاهز لكل صفحة، وتنسيقه مدمج فيه، فيظهر بشكل صحيح دون أي ملفات أخرى.dist/index.htmlقائمة بسيطة بكل صفحاتك مع روابطها.sitemap.xmlخريطة موقع يمكنك إرسالها في Google Search Console.data/الصفحات نفسها بصيغة JSON (العنوان والرابط والوصف وHTML) للمطورين.
لنشرها على الإنترنت
- فك ضغط الملف.
- ارفع الملفات الموجودة في dist/ إلى الاستضافة، ويُفضّل في مجلد /blog، مثلًا عبر مدير الملفات لدى الاستضافة أو FTP.
- افتح إحدى الصفحات في المتصفح للتأكد منها، ثم أرسل sitemap.xml في Google Search Console.
/json
JSON للمطورين
يتضمن ملف التنزيل صفحاتك كبيانات أيضًا، لتقدّمها من تطبيقك الخاص. الملف data/wizard-data.json مصفوفة فيها كائن واحد لكل صفحة:
| الحقل | النوع | ما يحتويه |
|---|---|---|
title | string | عنوان الصفحة الذي يظهر في نتائج البحث، بحد أقصى 60 حرفًا. |
meta_description | string | الوصف التعريفي الذي يظهر تحت العنوان في نتائج البحث. |
h1 | string | العنوان الرئيسي في الصفحة. |
body_html | string | مستند HTML كامل: قسم head وCSS مدمج والبيانات المنظمة وروابط “اقرأ أيضًا”. قدّمه كما هو. |
slug | string | الجزء الأخير من رابط الصفحة، مثل plumber-in-camden. |
keywords | object | القيم المستخدمة لهذه الصفحة، قيمة لكل متغير في النمط. |
status | string | دائمًا “success” للصفحات الموجودة في التصدير. |
locale | string | رمز لغة الصفحة، مثل en أو ar. |
يحتوي data/content.json على الصفحات نفسها مع ثلاثة أسماء إضافية تتوقعها بعض الأدوات: content (نفس body_html)، وmetaDescription وdescription (كلاهما نفس meta_description).
مثال على كائن صفحة (مع اختصار body_html)
{
"title": "Plumber in Camden | Example Plumbing",
"meta_description": "Same-day plumbing in Camden: boiler service from £89 and leak repairs by Gas Safe registered engineers.",
"h1": "Plumber in Camden",
"body_html": "<!DOCTYPE html><html lang=\"en\" dir=\"ltr\"><head>…</head><body>…</body></html>",
"slug": "plumber-in-camden",
"keywords": { "Service": "Plumber", "Area": "Camden" },
"status": "success",
"locale": "en"
}قدّم الصفحات من تطبيقك
أرسل body_html كاستجابة كاملة لرابط الصفحة. لا تضعه داخل تخطيط موقعك، فهو يتضمن بالفعل قسم head والتنسيقات والبيانات المنظمة. اختر المثال المناسب لتقنيتك:
استضافة ثابتة (بلا إطار عمل)
# Put the exported pages under /blog on any static host
unzip your-site-bundle.zip -d export
mkdir -p public/blog
cp export/dist/*.html public/blog/
# /blog/plumber-in-camden.html works now. For /blog/plumber-in-camden,
# turn on "clean URLs" (Netlify, Vercel, Cloudflare Pages) or, on nginx:
location /blog/ {
try_files $uri $uri.html =404;
}Next.js
import pages from '@/data/wizard-data.json';
export async function GET(_req: Request, { params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const page = pages.find(p => p.slug === decodeURIComponent(slug));
if (!page) return new Response('Not found', { status: 404 });
return new Response(page.body_html, {
headers: { 'Content-Type': 'text/html; charset=utf-8' }
});
}Astro
---
import pages from '../../data/wizard-data.json';
export function getStaticPaths() {
return pages.map(page => ({ params: { slug: page.slug }, props: { page } }));
}
const { page } = Astro.props;
---
<Fragment set:html={page.body_html} />Nuxt
import pages from '~~/data/wizard-data.json';
export default defineEventHandler((event) => {
const slug = decodeURIComponent(getRouterParam(event, 'slug') ?? '');
const page = pages.find(p => p.slug === slug);
if (!page) throw createError({ statusCode: 404 });
setHeader(event, 'Content-Type', 'text/html; charset=utf-8');
return page.body_html;
});PHP (Laravel)
use Illuminate\Support\Facades\Route;
Route::get('/blog/{slug}', function (string $slug) {
$pages = json_decode(file_get_contents(storage_path('app/wizard-data.json')), true);
$page = collect($pages)->firstWhere('slug', $slug);
abort_unless($page, 404);
return response($page['body_html'])
->header('Content-Type', 'text/html; charset=utf-8');
});حافظ على عمل روابط “اقرأ أيضًا” وروابط /blog
- تستخدم الروابط بين الصفحات بنية الروابط التي اخترتها في الخطوة 3: /blog/{slug}، أو /{prefix}/blog/{slug} عند استخدام بادئة لغة. قدّم كل صفحة على هذا المسار نفسه في الموقع الذي أدخلته في الخطوة 1، وستعمل الروابط والبيانات المنظمة للصفحة دون أي تعديل.
- إذا كانت صفحاتك على مسار مختلف، فلا تعدّل HTML يدويًا. كل رابط “اقرأ أيضًا” يحمل السمة data-pseo-link مع slug الصفحة المستهدفة، فيمكنك تعديلها كلها دفعة واحدة:
read-also.js // Each "Read also" link carries data-pseo-link="<slug>" const html = page.body_html.replace( /href="[^"]*"(\s+data-pseo-link="([^"]+)")/g, (_, attr, slug) => `href="/guides/${slug}"${attr}` ); - أما ملفات HTML في dist/ فترتبط ببعضها بصيغة {slug}.html. ارفعها معًا في المجلد نفسه (ويُفضّل /blog) وستبقى تعمل، مع الروابط النظيفة أو بدونها.
- استورد كل صفحات الحملة معًا. الرابط إلى صفحة لم تستوردها يؤدي إلى 404: تصدير HTML يحذف هذه الروابط تلقائيًا، وفي تطبيقك يمكنك تجاهل الروابط التي لا يوجد slug الخاص بها في بياناتك.
- لا تغيّر الـ slug بعد نشر الصفحة. وإن اضطررت، فأضف تحويل 301 من العنوان القديم إلى الجديد.
/publish
النشر دون برمجة
اربط موقعك في الخطوة 5 وسنرسل الصفحات نيابة عنك. تحتاج إلى مفتاح من منصتك مرة واحدة فقط، والخطوات التالية توضح أين تجده.
WordPress
تصل الصفحات كمسودات مقالات، لتراجعها قبل نشرها.
- من لوحة تحكم WordPress، افتح المستخدمون ← الملف الشخصي وانزل إلى كلمات مرور التطبيقات.
- اكتب اسمًا مثل “pSEO Wizard”، واضغط إضافة كلمة مرور تطبيق جديدة، وانسخ كلمة المرور الظاهرة، فهي لا تظهر إلا مرة واحدة.
- في الخطوة 5، اختر WordPress وأدخل عنوان موقعك واسم المستخدم في WordPress وكلمة مرور التطبيق (وليس كلمة مرور الدخول المعتادة).
- اضغط نشر، ثم افتح المقالات ← المسودات في WordPress لمراجعة الصفحات ونشرها.
Shopify
تُضاف الصفحات كمقالات منشورة في المدونة التي تختارها.
- من لوحة إدارة Shopify، افتح الإعدادات ← التطبيقات وقنوات البيع ← تطوير التطبيقات، وأنشئ تطبيقًا.
- من إعداد نطاقات Admin API، فعّل read_content وwrite_content، واحفظ، ثم اضغط تثبيت التطبيق.
- افتح بيانات اعتماد API وانسخ رمز وصول Admin API الذي يبدأ بـ shpat_.
- في الخطوة 5، اختر Shopify وأدخل عنوان متجرك (yourstore.myshopify.com) والرمز، واختر مدونة، ثم اضغط نشر.
Webflow
تُضاف الصفحات كعناصر في مجموعة CMS، وتظهر للزوار عند نشر موقعك في المرة القادمة.
- في Webflow Designer، أنشئ مجموعة CMS (مثل “أدلة”) تحتوي على حقل نص منسّق باسم Post Body وحقل نصي باسم Post Summary. قالب المدونة في Webflow يحتوي عليهما مسبقًا.
- افتح صفحة القالب الخاصة بالمجموعة واربط الاسم وPost Body بالتصميم.
- أنشئ رمز API من إعدادات الموقع ← التطبيقات والتكاملات ← الوصول إلى API.
- في الخطوة 5، اختر Webflow والصق الرمز، واختر الموقع والمجموعة، واضغط نشر، ثم انشر موقعك من Webflow.
WooCommerce
تُضاف الصفحات كمسودات منتجات، وهذا مناسب للصفحات التي تتحدث عن شيء تبيعه.
- من لوحة تحكم WordPress، افتح WooCommerce ← الإعدادات ← متقدم ← REST API واضغط إضافة مفتاح.
- امنح المفتاح صلاحية القراءة/الكتابة، ثم انسخ مفتاح المستهلك (ck_…) وسر المستهلك (cs_…).
- في الخطوة 5، اختر WooCommerce وأدخل عنوان متجرك والمفتاحين، واضغط نشر، ثم راجع المسودات في قسم المنتجات.
Wix
لا يوجد ربط مباشر مع Wix بعد، لكن يمكنك إضافة الصفحات يدويًا.
- نزّل صفحاتك من الخطوة 5 (راجع “تنزيل صفحاتك” أعلاه).
- في محرر Wix، أضف صفحة جديدة، ثم أضف تضمين كود ← تضمين HTML والصق المحتوى الكامل لملف .html الخاص بإحدى الصفحات.
- اضبط رابط الصفحة وعنوان SEO في Wix ليطابقا الصفحة. محركات البحث تقرأ HTML المضمّن بدقة أقل من الصفحات العادية، لذلك غالبًا ما تحقق WordPress أو Shopify أو Webflow ترتيبًا أفضل.
/pricing
التسعير والدفع
تدفع مرة واحدة لكل صفحة. لا يوجد اشتراك، وكل حساب يحصل على صفحته الأولى مجانًا.
| الصفحات | سعر الصفحة |
|---|---|
| 1–500 | $0.30 |
| 501–1,500 | $0.25 |
| 1,501–3,500 | $0.20 |
| 3,501+ | $0.15 |
- الأسعار متدرّجة: كل سعر ينطبق فقط على الصفحات داخل شريحته. مثلًا، 600 صفحة تكلف 500 × $0.30 + 100 × $0.25 = $175.
- الطلبات المدفوعة تحتاج إلى 10 صفحات على الأقل. لا توجد خصومات ولا أكواد كوبونات.
- إذا عدّلت حملة مدفوعة، تعود قيمة الصفحات التي لم تُنشأ بعد إلى حسابك كرصيد لطلبك التالي.
- تتم المدفوعات عبر Dodo Payments بصفتها التاجر المسجّل (Merchant of Record). تقبل البطاقات وطرق الدفع المحلية، وتضيف أي ضريبة مبيعات أو ضريبة قيمة مضافة عند الدفع.
/facts
كيف تبقى الصفحات دقيقة
محركات البحث والعملاء يعاقبون الصفحات التي تختلق المعلومات. لذلك تنطبق هذه القواعد على كل صفحة:
المعلومات من موقعك
الأسعار والخدمات والتقييمات والأرقام تُؤخذ فقط من موقعك ومن المعلومات الأساسية التي تدخلها. وأي رقم غير موجود في موقعك يُحذف من الصفحة.
كل صفحة مختلفة
لكل صفحة خطتها الخاصة، وتُقارن الصفحات المكتملة ببعضها. وإذا كررت صفحة ما في غيرها أكثر من اللازم، تُعاد كتابتها.
صدق في المواقع الجغرافية
إذا كان عملاؤك يأتون إليك، ننبهك إلى الأماكن البعيدة. وإذا كنت تذهب إلى عملائك، تقول الصفحات إنك تخدم المنطقة، ولا تقول أبدًا إن لديك فرعًا فيها.
النشر تحت /blog
توضع الصفحات افتراضيًا في مجلد /blog، ما يُبقي المجموعة الكبيرة من الصفحات الجديدة منفصلة عن بقية موقعك.
/help
حل المشكلات
- WordPress يقول إن بيانات الدخول خاطئة (401 أو 403)
- استخدم كلمة مرور تطبيق وليس كلمة مرورك المعتادة، مع اسم المستخدم في WordPress (وليس بريدك الإلكتروني). بعض إضافات الحماية تحظر WordPress REST API؛ اسمح بها لمستخدمك وحاول مرة أخرى.
- Shopify لا يتصل
- استخدم رمز وصول Admin API الذي يبدأ بـ shpat_، وامنح التطبيق نطاقي read_content وwrite_content. بعد تغيير النطاقات، أعد تثبيت التطبيق وانسخ الرمز الجديد.
- الصفحة تعرض 404 بعد الرفع
- تأكد أن الملف في المجلد الذي يتوقعه رابط الصفحة (مثل /blog/)، وأن بادئة اللغة في الروابط التي حددتها في الخطوة 3 تطابق موقعك.
- الأزرار تفتح صفحة خاطئة
- تنقل الأزرار إلى الرابط المستهدف من الخطوة 1، أو إلى الصفحة المناسبة في موقعك (الحجز، القائمة، الأسعار، التواصل) إن وُجدت. اضبط الرابط المستهدف قبل الإنشاء؛ وللصفحات الموجودة، عدّل الرابط من محرر الصفحات في الخطوة 4.
ما زلت تواجه مشكلة؟ راسلنا على support@wizardseo.co وسنساعدك.