# راهنمای ارتقا TeachDemy — نسخه v37 (دور پانزدهم: اجرای کامل موارد باقی‌ماندهٔ فایل Edits)

این بسته شامل دو فایل ZIP نهایی است که مستقیماً روی سایت وردپرسی شما نصب می‌شود:

| فایل | محتوا | نسخه جدید |
|---|---|---|
| `woodmart-child-v37.zip` | قالب فرزند (تم) | 2.0.0 |
| `teach-demy-plus-v25.zip` | افزونه Teach Demy Plus | 2.8.0 |

> این فایل ZIPها جایگزین کامل نسخه‌های قبلی (v36 / v24) هستند — همهٔ دورهای ۱ تا ۱۵ داخلشان است. پایهٔ این نسخه دقیقاً همان فایل‌های نهایی خود شما (v24-fixed و v36-fixed) است و موارد خط‌نخوردهٔ فایل «Edits» روی همان‌ها اعمال شده‌اند.

---

## ۱) نصب (۵ دقیقه)

1. **قالب:** پیشخوان ← نمایش ← پوسته‌ها ← افزودن ← بارگذاری پوسته ← فایل  `woodmart-child-v37.zip` ← نصب ← **فعال‌سازی** (جایگزین کامل پوشه قبلی می‌شود؛ تنظیمات ذخیره‌شده در دیتابیس از بین نمی‌رود).
2. **افزونه:** پیشخوان ← افزونه‌ها ← افزودن ← بارگذاری افزونه ← فایل `teach-demy-plus-v25.zip` ← نصب ← **فعال‌سازی**.
3. **کش‌ها را کامل پاک کنید:** افزونه کش (WP Rocket/LiteSpeed و…) ← کش خود WoodMart (نمایش ← WoodMart ← Clear cache) ← کش هاست/کلادفلر ← سپس در مرورگر Ctrl+Shift+R.
4. بررسی کنید که پیوندهای یکتا تازه باشند: تنظیمات ← پیوندهای یکتا ← «ذخیرهٔ تغییرات» (بدون تغییر چیزی) — برای ثبت Endpointهای جدید.
5. یک‌بار **پیشخوان ← Instructor Applications** را باز کنید تا منوی جدید ساخته شود.

> ⚠️ قبل از نصب، از سایت کامل بکاپ بگیرید (فایل‌ها + دیتابیس).

---

## ۲) خلاصهٔ تغییرات (مطابق شماره‌ی درخواست‌های شما)

### پایه سایت
- **(۱)** آدرس فوتر: **BC, Canada**
- **(۲)** نقش‌ها فقط Instructor / Affiliate / **Learner**؛ کاربر جدید به‌صورت پیش‌فرض Learner می‌شود (برچسب «Student/Customer» به «Learner» تغییر یافت).
- **(۳)** موجودی My Wallet با **دقیقاً ۲ رقم اعشار** (بدون رندشدن).
- **(۴)** فرستندهٔ یکپارچهٔ ایمیل‌ها `TeachDemy <no-reply@دامنه>` + رنگ‌های برند در قالب ایمیل‌ها.
- **(۵)** لیست کاربران پیشخوان: مرتب‌شده بر اساس **تاریخ ثبت‌نام (جدیدترین اول)** + ستون تاریخ ثبت‌نام + انتخابگر حالت **جدیدترین / الفبا**.
- **(۶)** منوی هدر: **Experience → Upcoming**

### چت استاد-دانشجو
- **(۷)** رنگ هدر چت اصلاح شد (سرمه‌ای→سبز برند، متن سفید کاملاً خوانا).
- **(۸)** رفع Network Error آپلود فایل: هر فایل با یک درخواست جدا آپلود می‌شود، نمایش درصد پیشرفت، پیام خطای دقیق (حجم بیش از حد سرور/قطع ارتباط/…) و راهنمای افزایش `upload_max_filesize` در php.ini.
- **(۹)** کتابخانهٔ کلمات حساس: پیشخوان ← تنظیمات ← **Profanity Filter** — دو سطح: Tier 1 (همیشه مسدود) و Tier 2 (علامت‌گذاری؛ ۳ کلمه در یک پیام = مسدود). کلمات فارسی پشتیبانی می‌شود. اینجا ویرایش می‌کنید.
- **(۱۰)** فایل‌های چت در کتابخانهٔ رسانه (`wp-content/uploads`) ذخیره می‌شوند. برای محدودیت ۵ گیگابایت: یا افزونهٔ Offload Media (انتقال به فضای ابری)، یا انتقال پوشهٔ uploads به سرویس خارجی — راهنمای کامل در بخش ۴.
- **(۱۱)** رفع باگ نشانگر پیام‌های خوانده‌نشده: بعد از خواندن مکالمه، شمارهٔ unread هم در لیست مکالمات و هم در منوی My Account **بلافاصله صفر می‌شود**.
- **(۱۲)** UI چت هماهنگ با رنگ‌های صفحهٔ اصلی + نوار وضعیت اشتراک (نوع + روزهای باقی‌مانده + نوار پیشرفت) + برچسب INSTRUCTOR بالای پیام‌ها + وضعیت آنلاین + جداکنندهٔ تاریخ تلگرامی (Today / Yesterday / تاریخ).
- **(۱۳)** OpenAI: پنل راهنما در تنظیمات افزونه اضافه شد. پاسخ: پلن رایج **برای محیط عملیاتی کافی نیست** (حدود ۳ درخواست در دقیقه). پیشنهاد: حساب Pay-as-you-go با سقف هزینهٔ ماهانه + مدل **gpt-4o-mini** (ارزان و سریع).
- **(۱۴)** آیکون‌های SVG برای پیوست/میکروفون + تجربهٔ ضبط صدا: نوار ضبط با چراغ قرمز چشمک‌زن، تایمر زنده، دکمهٔ **لغو** و **ارسال** — آپلود فقط بعد از تأیید صریح انجام می‌شود.

### فرم Become an Instructor (طبق فایل Word شما)
- **(۱۵)** جریان جدید شبیه سایت‌های دولتی: **گام ۱** تأیید کد ملی + شماره موبایل (اعتبارسنجی رقم کنترل کد ملی) → **گام ۲** فرم کامل → ذخیره در دیتابیس + **Google Sheets** → **یک ایمیل داخلی به مدیر** → تأیید/رد از پیشخوان → با تأیید، نقش Instructor + پروفایل استاد ساخته می‌شود.
- **(۱۶)** ایمیل‌های قدیمی «Become an Instructor» **کاملاً مسدود** شدند (نه‌فقط حذف پیوست). ایمیل‌های داخلی خود سیستم با هدر `X-TDP-Internal` استثنا هستند.
- **(۱۷)** ساختار فرم دقیقاً طبق سند: عکس پروفایل، سابقهٔ تحصیلی (جدول تکرارشونده)، سابقهٔ صنعتی، رضایت نمایش لوگوها، اطلاعات دوره، تعرفه پیشنهادی USDT، مجوز تخفیف، و **رزومه به‌صورت متن** (نه PDF). موارد حذفی («software or professional skill…»، «highest academic degree») اعمال شد.
- **(۱۸)** فرم Affiliate: همهٔ فیلدها اجباری، حذف Additional Note، بزرگ‌شدن فیلد Promotion Plan، و در کل سایت «Mentor Support» → **Instructor Support**.

### آزمون‌ها
- **(۱۹)** تب My Exams فقط برای **دانشجو** نمایش داده می‌شود؛ **علت اصلی نمایش‌ندادن سوالات** پیدا و رفع شد (شمارش تلاش‌های نیمه‌کاره + نداشتن Resume). استاد از «Manage Exams ← 👥 Submissions» پاسخ‌های دانشجو را می‌بیند و همان‌جا نمره می‌دهد (راهنمای کامل: `docs/HOW-TO-grade-exams.md` داخل افزونه).
- **(۲۰)** محدودیت نوع فایل در آپلود پاسخ آزمون **واقعاً در سرور** اعمال می‌شود (لیست MIME مجاز + سقف ۲۵MB) + راهنمای مجاز در فرم.
- **(۲۱)** چیدمان دکمه‌ها با عنوان‌های طولانی به‌هم نمی‌ریزد (عنوان حداکثر ۲ خط + دکمه‌ها همیشه سمت راست).
- **(۲۲)** آزمون جدید به‌صورت پیش‌فرض **Draft (منتشرنشده)** است و ویرایش هم وضعیت را عوض نمی‌کند؛ فقط با دکمهٔ Publish منتشر می‌شود.

### صفحات
- **(۲۳)** صفحهٔ دوره: فیلد «Introduction video URL» در تب TeachDemy محصول + باکس **Meet Your Instructor** (عکس + دکمهٔ Show Profile) + شمارندهٔ **Learners** که خودکار از سفارش‌های تکمیل‌شده محاسبه می‌شود.
- **(۲۴)** صفحهٔ Disciplines تبدیل به **Category** شد: هر ۱۴ رشته + شمارش خودکار دوره‌ها + آیکون + هایلایت هاور + فیلتر حروف الفبا + اعداد سفید روی پس‌زمینهٔ تیره. همهٔ «Discipline»های سایت → «Category».
- **(۲۵)** Upcoming: دکمهٔ **Notify Me** (فرم نام+ایمیل) + **Join Waitlist** (پیش‌فروش با تخفیف ۲۰٪ — با فیلتر `tdp_presale_discount` قابل تغییر)، اطلاع استاد، و «Want to teach one of these» → **«Want to Become an Instructor»** با لینک. با انتشار دوره، به همهٔ لیست انتظار ایمیل ارسال می‌شود.
- **(۲۶)** صفحهٔ اصلی: متن Hero طبق Text.docx (با جملهٔ Non-buyers)، آواتار برای نظرات، لینک‌های مطابق URLهای واقعی، بخش دوره‌های واقعی + نوار Upcoming.
- **(۲۷-۲۸)** صفحهٔ Affiliate: کپی اصلاح + کادر سبز وسط‌چین + دکمه‌های «Apply to Affiliate» (به فرم درخواست) و «Start Instructor Application».
- **(۲۹)** Checkout: زیرعنوان جدید، **موبایل + آدرس اجباری** با رضایت واترمارک ویدیو (داده در سفارش ذخیره و در پیشخوان نمایش داده می‌شود)، اعلان **موجودی Wallet** (پرداخت با کیف پول)، و جایگاه معماری پرداخت رمزارز (USDT — صفحهٔ مستقل آینده).
- **(۳۰)** Contact: کپی جدید + فرم برای **کاربران مهمان** (پیام ذخیره + ایمیل به مدیر با Reply-To کاربر + ایمیل تأیید به کاربر).
- **(۳۱)** Courses: حذف «Teachme.com»، «Engineering Learning Marketplace» → **Engineering Learning**، انتخاب دسته با هر ۱۴ رشته، Level با گزینهٔ All، فیلترهای فقط All/New/Best Sellers، نمایش دوره‌های upcoming + **نوار جستجو**.
- **(۳۲)** FAQ: حذف «and Mentorship» + پرسش/پاسخ «Is course access permanent? — Yes, permanent and lifetime.» + آواتارها.
- **(۳۳)** Overview (Mentor Support): Session → **Support Period**، Discipline → **Category**، حذف $89 و «Choose an available time»، تعمیر رنگ «Verified Expert» در ۴ نقطه، پنل کنار: حذف Duration / Time→Period / Total→Price، انتخاب گام‌های ۱-۳ به‌صورت زنده پنل را پر می‌کند، دکمهٔ پرداخت → لینک واقعی Checkout. قیمت‌ها با فیلتر `tdp_support_plans` در بالای فایل قالب قابل تغییرند (پیش‌فرض ۲۹/۷۹/۱۴۹).
- **(۳۴)** سه صفحهٔ Privacy/Refund/Terms: سه مقدمهٔ **متفاوت و حرفه‌ای**، حذف یادداشت‌های تولید، حذف بخش Refund Eligibility.

### سیستم Affiliate
- **(۳۵)** ستون **Order ID** در Recent Referrals و پنل مدیر + یادداشت کمیسیون به‌صورت «Commission for course purchase — Order #…» + Student→Learner + جدول‌های وسط‌چین + رنگ‌دیدنی فیلترها + «Monthly Performance» → **Performance** با دو **نمودار Chart.js** (فروش ماهانه + درآمد ماهانه) + چهار کادر آمار با حاشیهٔ رنگی و عدد همرنگ.
- **(۳۶)** جریان درخواست Affiliate کامل (ایمیل مدیر + پنل تأیید/رد)؛ «Become an Affiliate» از داشبورد به صفحهٔ اصلی؛ منوی **Learners** در پیشخوان با جستجو، مرتب‌سازی، ستون‌های دوره/خرید و دکمهٔ **Purchase Details** هر سفارش؛ لیست Users پیشخوان مرتب بر اساس ثبت‌نام + جستجو.
- **(۳۷)** تاریخچه و وضعیت درخواست‌ها با تایم‌لاین + امکان درخواست مجدد پس از رد.
- **(۳۸)** آبشار **کشور→شهر** + کد تلفن خودکار کشور + پرچم‌های ISO (که در Chrome ویندوز هم نمایش داده می‌شود — مشکل ایموجی پرچم حل شد).
- **(۴۱)** سقف تلاش ورود/ثبت‌نام: **۱۰ بار در ۱۵ دقیقه** (قبلاً ۲۰).
- **(۴۲)** در موبایل بعد از ورود، کاربر به **صفحهٔ اصلی** می‌رود (نه My Account).
- **(۴۳)** متن لایسنس Spot Player با CSS قرمز و پررنگ می‌شود (قانون در `teachdemy-static-pages.css`).
- **(۴۴)** کدهای Referral قدیمی: جستجوی **بدون حساسیت به حروف بزرگ/کوچک** + پشتیبانی از متاهای قدیمی — لینک‌های قبلی بدون تغییر کار می‌کنند.
- **(۴۵)** لیست ارجاع‌ها با **صفحه‌بندی ۲۰تایی** (با حفظ فیلترها) + «Showing X–Y of Z».
- **(۴۶)** ظاهر My Wallet به سبک داشبورد Affiliate + فلش‌های تمیز تقویم.

---

## ۳) تنظیمات پس از نصب

### الف) اتصال Google Sheets (برای فرم مدرسی)
1. در Google Drive یک Google Sheet بسازید (مثلاً «TeachDemy Instructor Applications»).
2. از منوی Sheet: **Extensions ← Apps Script** و کد زیر را جایگزین کنید:

```javascript
function doPost(e) {
  var SECRET = 'یک-راز-دلخواه'; // همان را در تنظیمات افزونه وارد کنید
  try {
    var data = JSON.parse(e.postData.contents);
    if (data.secret !== SECRET) { return ContentService.createTextOutput('bad secret'); }
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
    if (sheet.getLastRow() === 0) {
      sheet.appendRow(['ID','Submitted','Status','Name','Email','Phone','National ID','Country','City','Course','Price USDT','Resume']);
    }
    sheet.appendRow([
      data.app_id, data.submitted_at, data.status, data.full_name, data.email,
      data.phone, data.national_id, data.country, data.city,
      data.course_title, data.price_usdt, (data.resume_text || '').substring(0, 4000)
    ]);
    return ContentService.createTextOutput('ok');
  } catch (err) {
    return ContentService.createTextOutput('error: ' + err);
  }
}
```

3. **Deploy ← New deployment ← Web app**: Execute as = **Me**, Who has access = **Anyone** ← Deploy ← URL را کپی کنید.
4. پیشخوان ← **Instructor Applications** ← قسمت Google Sheets Integration ← URL و Secret را وارد و ذخیره کنید.
5. از همان صفحه می‌توانید همهٔ درخواست‌ها را **CSV دانلود** کنید.

### ب) قیمت‌ها و تخفیف‌ها
- تخفیف پیش‌فروش Waitlist: در functions.php یا یک افزونهٔ snippet:
  `add_filter( 'tdp_presale_discount', function() { return 20; } );`
- پلن‌های Instructor Support: در بالای `page-mentor-support.php` آرایهٔ `$tdp_plans` (یا فیلتر `tdp_support_plans`).

### ج) کلمات حساس
پیشخوان ← تنظیمات ← **Profanity Filter**: دو کادر (Tier 1 = مسدود، Tier 2 = علامت‌گذاری) با کاما جدا شوند؛ فارسی پشتیبانی می‌شود.

### د) ایمیل و اسپم‌شدن (مهم)
سایت هدرهای درست فرستنده را می‌سازد، اما برای رسیدن به Inbox (نه Spam) حتماً این رکوردهای DNS را برای دامنهٔ teach-demy.com تنظیم کنید:
- **SPF**: `v=spf1 include:سرویس-ایمیل-هست ~all`
- **DKIM**: از هاست/سرویس ایمیل فعال کنید و کلید را در DNS ثبت کنید.
- **DMARC**: `_dmarc.teach-demy.com TXT "v=DMARC1; p=quarantine; rua=mailto:admin@teach-demy.com"`
- اگر ایمیل‌های زیادی می‌فرستید، یک سرویس SMTP معتبر (مثل Mailgun/Brevo) با افزونهٔ WP Mail SMTP تنظیم کنید.

### هـ) ذخیره‌سازی فایل‌ها (محدودیت ۵GB)
- مسیر فعلی: `wp-content/uploads` (کتابخانهٔ رسانه).
- پیشنهاد ۱: افزونهٔ **WP Offload Media** → انتقال خودکار به Amazon S3/DigitalOcean Spaces.
- پیشنهاد ۲: سرویس‌های Object Storage ارزان + افزونهٔ Offload.
- فایل‌های چت با status `private` ذخیره می‌شوند و لینک مستقیم عمومی ندارند.

### و) OpenAI
پیشخوان ← تنظیمات افزونه ← بخش AI. پلن رایگان (حدود ۳ درخواست/دقیقه) برای پروداکشن کافی نیست؛ حساب Pay-as-you-go با Budget Cap + مدل `gpt-4o-mini` پیشنهاد می‌شود. کلید فقط سمت سرور و رمزنگاری‌شده (AES-256) استفاده می‌شود.

---

## ۴) نکته‌های مهم
- **بکاپ قبل از نصب فراموش نشود.**
- بعد از نصب یک‌بار پیوندهای یکتا را ذخیره کنید.
- قالب قدیمی را حذف نکنید — WoodMart والد باید نصب بماند.
- اگر صفحه‌ای بعد از نصب ظاهر قدیم داشت: کش مرورگر + کش افزونه + کش هاست را به‌ترتیب پاک کنید.
- فرم مدرسی برای مهمان‌ها هم کار می‌کند؛ کاربر وردپرس فقط بعد از «تأیید» مدیر ساخته می‌شود.

---

## ۵) دور دوم بازبینی (v26.1 → v26.1.1 / v16.1 → v16.1.1)

در این دور، هر ۴۶ مورد یک‌بار دیگر با کد نهایی مقایسه شد. ۹ ایراد پنهان پیدا و رفع شد:

1. **باگ دکمه‌های مرده صفحهٔ اصلی** — دکمه‌های «Choose 30/90/180 Days» و «Open Chat» به تابع تعریف‌نشده وصل بودند ← الان لینک واقعی هستند.
2. **قیمت‌های ناسازگار هوم** — کارت‌ها $49/$119/$199 بودند ← با پلن‌های سراسر سایت (29/79/149 دلار) یکدست شد.
3. **مورد ۱۸ ناقص بود** — فیلد Additional Notes هنوز موجود بود و فیلدها اجباری نبودند ← حذف کامل + اجباری‌سازی همهٔ فیلدها (مرورگر و سرور).
4. **Student‌های جا‌مانده** — در استعلام گواهینامه، ایمیل‌های آزمون، جدول‌های ادمین چت/آزمون/گواهینامه و نقشِ فعال‌سازی ← همه Learner شدند.
5. **مورد ۴۰ اصلاً پیاده نشده بود** — شمارشگر فالوور شبکه‌های اجتماعی اضافه شد (ویرایش در سفارشی‌سازی + هوک به‌روزرسانی خودکار روزانه).
6. **دکمه‌های ورود/ثبت‌نام موبایل** — دو دکمهٔ همیشه‌نمایان Log In / Sign Up در هدر اضافه شد.
7. **Become Affiliate از داشبورد به هوم** — آیتم منوی حساب کاربری حذف و مسیر از صفحهٔ اصلی برقرار شد.
8. **ظاهر نظرات صفحهٔ دوره + نام‌گذاری Mentor** — نظرات با سبک هوم هماهنگ شد و کارت‌های اشتراک هوم Support Starter/Pro/Extended نام گرفتند.
9. **Mentor→Instructor در نام‌گذاری پلن‌ها و کارت‌های هوم** — به‌طور کامل اعمال شد.

همهٔ فایل‌ها دوباره از نظر ساختاری (تعادل آکولاد/کوتیشن/تگ PHP) بررسی شدند: ۶۹ فایل PHP + همهٔ CSS و JS سالم هستند.

---

## ۶) دور سوم — ارزش‌افزایی: SEO، دسترس‌پذیری، و پرینت (v26.2 / v16.2)

این دور روی بهبودهای حرفه‌ایِ مکمل متمرکز بود:

- **Open Graph + Twitter Card** برای همهٔ صفحات (عنوان/توضیح/تصویر/URL خودکار) — اشتراک‌گذاری در شبکه‌های اجتماعی اکنون پیش‌نمایش غنی دارد.
- **Schema.org Course + Product JSON-LD** در صفحهٔ هر دوره (نام، استاد، قیمت، aggregateRating) — نتایج غنیِ گوگل برای دوره‌ها.
- **Schema.org Organization + WebSite + BreadcrumbList** در صفحهٔ اصلی + مسیر نورد در همهٔ صفحات (sitelinks search box گوگل فعال می‌شود).
- **دسترس‌پذیری**: لینک «Skip to content» (اولین عنصر Tab)، حلقهٔ focus-visible برند، احترام به prefers-reduced-motion.
- **استایل‌شیت پرینت**: مخفی‌کردن هدر/فوتر/دکمه‌ها + نمایش URL لینک‌ها + جلوگیری از شکستن کارت‌ها — خروجی تمیز Ctrl+P در صفحهٔ دوره.
- **پشتیبانی Site Icon**: اگر در سفارشی‌سازی آیکون آپلود شود، apple-touch-icon هم emit می‌شود.

---

## ۷) دور چهارم — PWA، امنیت، حریم خصوصی، و UX (v26.3 / v16.3)

این دور روی حرفه‌ای‌سازیِ بیشتر تمرکز کرد. همهٔ موارد به‌صورت افزودنی اضافه شدند؛ هیچ فایل موجودی تغییر نکرده:

### الف) وب‌اپ قابل‌نصب (PWA)
- فایل جدید `manifest.webmanifest` در ریشهٔ قالب — عنوان، آیکون‌ها، میان‌برها (Courses/Categories/Upcoming/Account)، رنگ تم.
- فایل جدید `sw.js` (Service Worker) با استراتژی هوشمند:
  - **Network-first** برای HTML (همیشه محتوای تازه + بازگشت به shell آفلاین وقتی شبکه قطع است).
  - **Stale-while-revalidate** برای استاتیک‌های هم‌ریشه (CSS/JS/فونت/عکس).
  - **Cache-first** برای دارایی‌های CDN کراس‌ریشه (Google Fonts, jQuery, Swiper, Gravatar).
  - **هرگز** admin/REST API/AJAX/uploads/cart/checkout/my-account را کش نمی‌کند.
- متاتگ‌های `theme-color`، `apple-mobile-web-app-capable`، `apple-mobile-web-app-status-bar-style`، `mobile-web-app-capable` به `wp_head` اضافه شد.
- کاربران می‌توانند TeachDemy را «Add to Home Screen» کنند و آفلاین هم باز کنند.

### ب) هدرهای امنیتی HTTP (`.htaccess` جدید در ریشهٔ قالب)
- `X-Frame-Options: SAMEORIGIN` (جلوگیری از clickjacking).
- `X-Content-Type-Options: nosniff` (جلوگیری از MIME sniffing).
- `Referrer-Policy: strict-origin-when-cross-origin`.
- `Permissions-Policy` (غیرفعال‌کردن geolocation/midi/usb و محدودکردن camera/microphone به self).
- `Strict-Transport-Security` (HSTS) با max-age یک سال + includeSubDomains + preload (فقط روی HTTPS).
- مسدودکردن اجرای PHP در `wp-content/uploads/` (دفاع در عمق).
- کش ۳۱۵۳۶۰۰ ثانیه‌ای (۱ سال) برای CSS/JS/فونت/عکس با header `Cache-Control: public, immutable`.
- `no-cache, no-store, must-revalidate` برای `sw.js` (سرویس‌ورکر همیشه تازه می‌ماند).
- **توجه**: اگر هاست شما Caddy/Nginx است (نه Apache)، این `.htaccess` نادیده گرفته می‌شود. باید معادل‌های این هدرها را در پیکربندی وب‌سرور اضافه کنید. در غیر این صورت، اگر هاست Apache با `mod_headers` و `mod_rewrite` باشد (اکثر هاست‌های اشتراکی)، این فایل به‌محض کپی شدن به ریشهٔ سایت فعال می‌شود.

### ج) Resource Hints (کاهش TTFB)
- `preconnect` به `fonts.googleapis.com`، `fonts.gstatic.com`، `paypal.com` (در checkout)، `js.stripe.com`/`m.stripe.com` (اگر Stripe نصب باشد)، `0.gravatar.com`/`2.gravatar.com`.
- `dns-prefetch` به `code.jquery.com` و `api.openai.com` (در ادمین).
- اثر: اولین بارگذاری صفحهٔ پرداخت/حساب کاربری به‌سرعت‌تر، چون DNS/TLS handshake قبلاً انجام شده.

### د) بنر رضایت کوکی (GDPR-style)
- بنر برند-استایل (navy + green) در پایین صفحه با دو دکمه:
  - **Accept all** (سبز، سبکِ برند).
  - **Reject** (شفاف با border سفید).
- ذخیره در `localStorage('td-cookie-consent')` با مقدار `accepted`/`rejected` — دیگر نشان داده نمی‌شود تا زمانی که کاربر آن را پاک کند.
- کلید ESC بنر را می‌بندد (دسترس‌پذیری کیبورد).
- dispatch ایولنت `td:cookie-consent` برای واکنش اسکریپت‌های شخص ثالث (مثلاً فعال‌کردن Google Analytics فقط پس از Accept).
- لینک به صفحهٔ Privacy Policy در متن بنر.

### هـ) نوار پیشرفت خواندن
- نوار ۳px بالای صفحه (z-index بالا، pointer-events:none) که با اسکرول پُر می‌شود.
- فقط در صفحات تک‌محتوایی (single post / page) و نه در صفحهٔ اصلی یا ادمین.
- با `requestAnimationFrame` و listener `passive: true` روی scroll — به کارایی صفحه آسیبی نمی‌رساند.
- رنگ gradient سبز-مینت + glow سبک.
- پشتیبانی از dark-mode.

### و) زمان تخمینی مطالعه
- چیپ «N minutes read · N words» بالای هر مطلب با محاسبه از ۲۲۰ wpm (استاندارد).
- فقط برای مطالب بلندتر از ۶۰ کلمه (مطالب کوتاه چیپ ندارند).
- سبکِ pill با آیکون ω (امگا — نشانهٔ زمان).
- شمارش کلمات با `number_format_i18n` (سه‌رقمی با کاما/نقطهٔ فارسی).

### ز) نوار قدرت رمز (روی فرم ثبت‌نام و حساب کاربری)
- استفاده از `zxcvbn` (هستهٔ وردپرس، بدون نیاز به فایل اضافه).
- ۵ سطح رنگی:
  - Very weak (قرمز) | Weak (طلایی) | OK (تیرکوهی) | Strong (سبز) | Very strong (سبز پررنگ).
- نوار ۴px با animation width/background و برچسب متن فارسی کنار آن.
- خودکار می‌چسبد به inputهایی با `name=password` یا `name=reg_password` یا `type=password`.

### ح) بهبود صفحهٔ ۴۰۴
- اضافه‌شدن جعبهٔ جستجوی درون‌سایتی (با `get_search_form()`) بالای دکمه‌ها.
- سه پیشنهاد دوره محبوب (توسط `wc_get_products` با مرتب‌سازی popularity).
- لینک‌های سریع: Explore Courses / Browse Categories / Back Home.

### ط) نکته‌های مهم دور چهارم
- **سرویس‌ورکر فقط روی HTTPS فعال می‌شود** (محدودیت امنیتی مرورگر).
- اگر هاست Apache نیست، هدرهای امنیتی در `.htaccess` نادیده گرفته می‌شوند — معادل‌ها را در Caddy/Nginx اضافه کنید.
- بنر کوکی برای کاربرانی که قبلاً رد/قبول کرده‌اند دوباره نشان داده نمی‌شود.
- برای غیرفعال‌کردن هر یک از این قابلیت‌ها، کافی است تابع مربوطه را در `functions.php` پیدا کنید و `add_action` آن را کامنت کنید.
- آیکون‌های PWA: سه فایل PNG در `wp-content/uploads/` لازم است (`teachdemy-icon-192.png`، `teachdemy-icon-512.png`، `teachdemy-icon-512-maskable.png`) — یا مسیرها را در `manifest.webmanifest` ویرایش کنید.

---

## ۸) دور پنجم — اشتراک‌گذاری، محتوای مقاله و تبدیل دوره (v26.4 / v16.4)

نسخه‌ها: قالب **1.6.4** (بستهٔ `woodmart-child-v28.zip`) و افزونهٔ **2.4.4** (بستهٔ `teach-demy-plus-v18.zip`).
همهٔ موارد این دور **افزودنی** است (توابع و هوک جدید؛ هیچ تغییر مخرب در کد قبلی).

### الف) دکمه‌های اشتراک‌گذاری (مقاله‌ها + صفحهٔ دوره)
- شبکه‌ها: **Telegram / WhatsApp / X / LinkedIn / Facebook + کپی لینک**.
- آیکون‌های SVG داخلی؛ هیچ اسکریپت شخص ثالثی لود نمی‌شود (فقط لینک‌های share-intent).
- در مقاله‌ها: انتهای مطلب (فیلتر `the_content` با اولویت ۱۲).
- در صفحهٔ دوره: با هوک استاندارد `woocommerce_share` وردکامرس.
- دکمهٔ «کپی لینک» با Clipboard API + حالت fallback قدیمی و توست تأیید.

### ب) باکس نویسنده + مقالات مرتبط (صفحهٔ مقاله)
- **باکس نویسنده**: آواتار (۸۸px)، نام (لینک به آرشیو نویسنده)، بیو، لینک «View all articles».
- فقط وقتی بیوی نویسنده در پروفایل وردپرس پر شده باشد نمایش داده می‌شود.
- **مقالات مرتبط**: ۳ کارت از همان دسته (fallback: آخرین مطالب) با تصویر، دسته، عنوان و تاریخ.
- گرید ریسپانسیو: ۳ ستون ← ۲ ستون ← ۱ ستون.

### ج) شمارش معکوس زندهٔ دوره‌های پیش‌رو
- صفحهٔ «Upcoming Courses»: زیر هر کارت با تاریخ راه‌اندازی، تایمر زندهٔ **روز/ساعت/دقیقه/ثانیه**.
- صفحهٔ تک‌دورهٔ پیش‌رو: نوار «Launching in» بالای عنوان دوره.
- بعد از رسیدن به زمان راه‌اندازی، حالت «Launched!» سبز رنگ نمایش داده می‌شود.
- داده از متاهای موجود `_td_upcoming` و `_td_launch_date` خوانده می‌شود — بدون تغییر در فرمت فعلی.

### د) نوار چسبان «Enroll now» در موبایل (صفحهٔ دوره)
- فقط در عرض **کمتر از 768px** نمایش داده می‌شود (دسکتاپ بدون تغییر).
- شامل: تصویر کوچک دوره + نام + قیمت + دکمهٔ سبز «Enroll now».
- برای دوره‌های variable → دکمهٔ «View options» که به فرم انتخاب اسکرول می‌کند.
- با `add-to-cart` استاندارد وردکامرس (سبد و تسویهٔ واقعی، بدون شبیه‌سازی).
- `padding-bottom` ایمن برای نوار سیستمی iOS (`env(safe-area-inset-bottom)`).

### هـ) فهرست مطالب خودکار (TOC) در مقاله‌های بلند
- اگر مقاله **۳ عنوان h2/h3 یا بیشتر** داشته باشد، جعبهٔ «On this page» بالای محتوا ساخته می‌شود.
- شماره‌گذاری `01/02/03` سبز، زیر‌بخش‌ها (h3) تورفته.
- قابل جمع‌شدن با کلیک روی سربرگ؛ اسکرول نرم با آفست هدر چسبان.
- سازگار با کلاس‌های واقعی قالب (`.entry-content` و `.wd-post-content`).

### و) دکمهٔ «Copy» روی بلوک‌های کد
- برای سایت آموزش مهندسی: هر `<pre>` دکمهٔ کپی گوشهٔ بالا-راست می‌گیرد.
- فقط با hover دیده می‌شود؛ بعد از کپی حالت «Copied!» سبز.
- با Clipboard API و fallback مرورگرهای قدیمی.

### ز) لایت‌باکس تصاویر مقاله
- کلیک روی هر تصویر محتوا (بزرگ‌تر از ۸۰px و خارج از لینک) → بزرگ‌نمایی تمام‌صفحه.
- پس‌زمینهٔ تیره با blur، دکمهٔ بستن، بستن با **ESC** یا کلیک بیرون.
- انیمیشن ورود scale + مکان‌نما `zoom-in` روی تصاویر قابل بزرگ‌نمایی.

### ح) نمای YouTube با بارگذاری تأخیری (Facade)
- iframeهای یوتیوب داخل مقاله‌ها فقط **پس از کلیک** لود می‌شوند.
- پیش‌نمایش: تصویر `hqdefault` + دکمهٔ پخش سبز برند + عنوان ویدیو.
- سرعت بارگذاری اولیهٔ صفحات مقاله به‌طور محسوس بهتر می‌شود (YouTube ~۱MB JS را به تعویق می‌اندازد).

### ط) ارتقای دکمهٔ بازگشت به بالا
- حلقهٔ پیشرفت دایره‌ای دور دکمهٔ موجود (سبز برند) که درصد اسکرول را نشان می‌دهد.

### ک) اشتراک‌گذاری گواهینامه (افزونه — حلقهٔ رشد)
- در «My Certificates» حساب کاربری، کنار دکمهٔ Download یک دکمهٔ **Share** اضافه شد.
- منوی Share شامل: LinkedIn / X / Telegram / WhatsApp + «Copy verification link».
- لینک اشتراک: `certificate-verification/?lms=شماره` — گیرنده لینک مستقیماً نتیجهٔ تأیید گواهینامه را می‌بیند.
- صفحهٔ تأیید گواهینامه حالا پارامتر `?lms=` (یا `#lms=`) را می‌خواند و **خودکار** فرم را ارسال می‌کند.
- متن اشتراک: «I just earned the "[نام دوره]" certificate on TeachDemy!» — برای LinkedIn/X آماده است.
- بستن منو با کلیک بیرون یا ESC؛ حالت Copied! بعد از کپی لینک.
- نکته: محدودیت نرخ تأیید بر اساس IP سرجا مانده است (محرمانگی و ضد Brute-force).

### ی) نکته‌های دور پنجم
- تمام حالت‌های تاریک (dark mode) پشتیبانی می‌شوند (`html[data-theme="dark"]`).
- در پرینت، همهٔ عناصر تعاملی جدید مخفی می‌شوند (`.td-share`, `.td-sticky-cta`, `.td-toc`, …).
- غیرفعال‌کردن هر قابلیت: کافی است `add_action/add_filter` همان تابع را در `functions.php` کامنت کنید.
- باکس نویسنده فقط با وجود بیو نمایش داده می‌شود — بیو نویسنده‌ها را در پیشخوان → Users → Profile پر کنید.
- نسخهٔ کش سرویس‌ورکر به `td-v1.6.4` ارتقا یافت (به‌روزرسانی خودکار کش‌های قدیمی).

---

## ۹) دور ششم — داشبورد تحلیلی استاد و اتوماسیون هفتگی (v26.5 / v16.5)

**سه قابلیت کاملاً افزودنی (بدون دست‌کاری کدهای قبلی) + یک اصلاح برند در قالب ایمیل.**

### الف) ویجت «My Instructor Analytics» در پیشخوان وردپرس
- برای همهٔ **استادها** (نقش instructor یا هر کاربری که دوره ساخته است) + مدیران، در **Dashboard → پیشخوان** نمایش داده می‌شود.
- ۴ کارت رنگی با نوار رنگی بالای هر کارت (سبز/سرمه‌ای/طلایی/فیروزه‌ای — رنگ‌های برند):
  1. **دوره‌های منتشرشده** (+ تعداد پیش‌نویس)
  2. **هنرجویان** (خریداران یکتای ۳۰ روز اخیر + مجموع ثبت‌نام‌ها)
  3. **میانگین امتیاز** (از نظرات واقعی ووکامرس + تعداد نظرات)
  4. **درآمد ۳۰ روزه** (و مجموع کل)
- **نمودار خطی ۱۴ روزهٔ ثبت‌نام‌ها** (SVG داخلی با گرادیان سبز — بدون کتابخانهٔ خارجی).
- **هشدار پیام‌های خوانده‌نشده** با لینک مستقیم به Messages.
- **فید فعالیت اخیر** (۶ مورد آخر): ثبت‌نام‌ها، نظرات جدید و پیام‌های جدید — هر نوع با نقطهٔ رنگی متمایز.
- دکمه‌های میان‌بر: دورهٔ جدید / Messages / Manage Exams / لغو یا فعال‌سازی ایمیل هفتگی شخصی.

### ب) ویجت «Platform Health» برای مدیر
- فقط برای مدیران، زیر ویجت بالا: تعداد هنرجویان و استادها، درآمد ۳۰ روزه، **درخواست‌های در انتظار** (استاد + Affiliate)، گواهینامه‌های صادرشده و **گفتگوهایی که منتظر پاسخ استاد هستند**.
- لینک‌های سریع به صفحات مدیریتی با نشان تعداد (badge).

### ج) ایمیل هفتگی خودکار (هر یکشنبه ۷ صبح — وقت سایت)
- **برای مدیر**: ثبت‌نام‌های جدید، تعداد فروش و درآمد هفته، ۳ دورهٔ پرفروش هفته، لینک دوره‌هایی که در ۱۴ روز آینده لانچ می‌شوند، درخواست‌های در انتظار و گفتگوهای بی‌پاسخ.
- **برای هر استاد** (فقط اگر اتفاقی در هفته داشته باشد — بدون ایمیل بی‌مورد): ثبت‌نام‌ها و فروش هفتهٔ خودش، میانگین نظرات جدید، پیام‌های خوانده‌نشده + لینک مستقیم به داشبورد.
- خاموش/روشن‌کردن کل سیستم: از خود ویجت مدیر (دکمهٔ Turn off/Turn on) یا فیلتر `tdp_weekly_digest_enabled`.
- لغو شخصی هر استاد: دکمهٔ «Unsubscribe» در ویجت خودش (ذخیره در user meta).
- زمان‌بندی: WP-Cron با خودترمیمی (اگر حذف شود، در اولین بازدید دوباره ساخته می‌شود).
- برای اطمینان از اجرای دقیق WP-Cron روی هاست اشتراکی، یک cron job واقعی (`wp-cron.php` هر ۱۵ دقیقه) توصیه می‌شود.

### د) قالب ایمیل همرنگ برند شد
- هدر ایمیل‌ها از آبی `#123A80` به **سرمه‌ای برند `#062b2b`** با خط تأکید سبز `#16a673` تغییر کرد.
- رنگ لینک‌ها از آبی به سبز تیرهٔ برند، پس‌زمینه‌ها به ته‌مایهٔ نعنایی برند.
- **همهٔ ایمیل‌های افزونه** (گواهینامه، آزمون، درخواست استاد و …) حالا هم‌رنگ سایت هستند.

### هـ) جزئیات ریز فرانت (قالب)
- **Scroll-spy فهرست مطالب**: در مقاله‌ها، آیتم فعال در TOC هنگام اسکرول سبز و برجسته می‌شود (IntersectionObserver — بدون اسکرول‌لیسنر سنگین).
- **میان‌بر «/»**: دکمهٔ جستجوی هدر از ابتدا در tooltip وعدهٔ کلید `/` را داده بود — حالا واقعاً کار می‌کند: فشردن `/` در هر جای صفحه (خارج از فیلدهای ورودی) جستجو را باز و فوکوس می‌کند.
- **هشدار چندارزی Checkout**: «همهٔ پرداخت‌ها به [USD] است؛ اگر کارت شما ارز دیگری دارد، بانک شما با نرخ خودش تبدیل می‌کند…» — برای خریداران بین‌المللی؛ با فیلتر `tdp_checkout_currency_hint` قابل غیرفعال‌شدن.

### و) نکات فنی دور ششم
- همهٔ آمارها **۶ ساعت** در transient کش می‌شوند؛ پنجرهٔ اسکن سفارش‌ها به‌طور پیش‌فرض ۵۰۰ سفارش اخیر است (فیلتر `tdp_analytics_order_scan_limit` برای فروشگاه‌های بزرگ).
- اسکن سفارش‌ها فقط با `wc_get_orders()` انجام می‌شود → با **HPOS** (جدول سفارش سفارشی ووکامرس) کاملاً سازگار است.
- کوئری‌های چت/گواهینامه فقط خواندنی و روی جداول خود افزونه است.
- فایل جدید افزونه: `includes/modules/class-tdp-instructor-analytics.php` — با کامنت‌کردن یک خط در `class-teach-demy-plus.php` کل ماژول غیرفعال می‌شود.
- نسخه‌ها: قالب **1.6.5** (کش سرویس‌ورکر `td-v1.6.5`)، افزونه **2.4.5**.

---

## ۱۰) دور هفتم — سفر هنرجو، اتوماسیون نظرات و اشتراک‌گذاری زیبا (v26.6 / v16.6)

**چهار قابلیت کاملاً افزودنی. هیچ کد قبلی تغییر نکرده؛ هر ماژول با کامنت‌کردن یک خط در `class-teach-demy-plus.php` غیرفعال می‌شود.**

### الف) تب جدید «My Learning» + استریک مطالعه (هنرجو)
- در **My Account**، بلافاصله بعد از Dashboard، تب جدید **My Learning** اضافه می‌شود (`/my-account/my-learning/`).
- **کارت استریک 🔥**: تعداد روزهای متوالی فعالیت هنرجو + رکورد شخصی + **نوار فعالیت ۱۴ روزه** (روزهای فعال سبز روشن، روزهای غیرفعال کم‌رنگ).
- ردیابی فعالیت: یک چک سبک در هر بازدید؛ حداکثر **یک نوشتن در دیتابیس برای هر کاربر در روز** (متا `tdp_active_day` / `tdp_streak` / `tdp_streak_best` / `tdp_activity_log`).
- **۴ کارت آماری**: دوره‌های ثبت‌نام‌شده، گواهینامه‌های دریافت‌شده، آزمون‌های شرکت‌شده، روزهای فعال (۲۸ روز اخیر).
- **فهرست سفر دوره**: همهٔ دوره‌های خریداری‌شده با وضعیت زنده و **گام بعدی مشخص** برای هر کدام:
  - «Certified» (گواهینامه فعال دارد) → دکمهٔ View certificate
  - «Exam ready» (آزمون دوره را نداده) → دکمهٔ Take the exam
  - «Passed — certificate pending» → دکمهٔ My certificates
  - «In progress» → دکمهٔ Open course
- همهٔ داده‌ها از جداول موجود (سفارش‌ها، گواهینامه‌ها، آزمون‌ها) خوانده می‌شوند — **هیچ جدول جدیدی ساخته نمی‌شود**.

### ب) ایمیل خودکار درخواست نظر (۷ روز بعد از خرید)
- هر روز ساعت **۸ صبح** (وقت سایت)، هنرجوهایی که **۷ روز (قابل‌تنظیم) از خریدشان گذشته** و هنوز نظر نداده‌اند، یک ایمیل مؤدبانهٔ همرنگ برند دریافت می‌کنند با دکمهٔ «★ Write a quick review».
- شرط‌های ارسال (هر ۵ شرط باید برقرار باشد): سفارش پرداخت‌شده، هنوز نظر نداده، قبلاً دربارهٔ همین دوره سوال نشده (**تضمین: حداکثر یک ایمیل برای هر دوره در کل عمر**)، لغو اشتراک نکرده، و سیستم سایت-wide روشن باشد.
- **لغو اشتراک یک‌کلیکی**: لینک «Turn them off» در پایین ایمیل (با nonce امن) — بدون نیاز به لاگین.
- محدودیت ایمنی: حداکثر **۴۰ ایمیل در هر اجرا** (فیلتر `tdp_review_request_batch_limit`) — باقی در روز بعد ارسال می‌شوند.
- قابل‌تنظیم با فیلترها: `tdp_review_request_enabled` (روشن/خاموش)، `tdp_review_request_delay_days` (پیش‌فرض ۷)، `tdp_review_request_order_limit` (پیش‌فرض ۲۰۰ سفارش در هر اسکن).
- تست فوری بدون انتظار برای کرون: از مرورگر، با لاگین مدیر: `?tdp_run_review_requests=1&_wpnonce=...` (nonce از `wp_create_nonce('tdp_run_review_requests')`).
- شمارندهٔ ارسالی‌ها در ویجت **Platform Health** مدیریت نمایش داده می‌شود.

### ج) جدول «Top Instructors (last 30 days)» برای مدیر
- در ویجت Platform Health، **رتبه‌بندی ۵ استاد برتر** بر اساس درآمد ۳۰ روز اخیر: مدال 🥇🥈🥉 برای سه نفر اول + تعداد ثبت‌نام + درآمد + لینک مستقیم به پروفایل.
- وضعیت سیستم درخواست نظر (ON/OFF + تعداد ارسالی) هم در همان ویجت دیده می‌شود.

### د) تصویر اشتراک‌گذاری OG خودکار (بدون تصویر شاخص)
- اگر مقاله یا دوره‌ای **تصویر شاخص نداشته باشد**، افزونه یک کارت برند **1200×630** با PHP GD می‌سازد: پس‌زمینه سرمه‌ای گرادیانی، نشان COURSE/ARTICLE طلایی، عنوان تا ۳ سطر سفید، خط تأکید سبز، آدرس سایت.
- فایل‌ها در `uploads/tdp-og/` کش می‌شوند (نام فایل شامل hash عنوان → با تغییر عنوان، خودکار بازسازی می‌شود و نسخهٔ قدیمی حذف).
- **اگر تصویر شاخص باشد، همیشه همان برنده می‌شود** — این ماژول فقط جای خالی را پر می‌کند.
- سازگاری: GD با `function_exists` چک می‌شود؛ اگر هاست GD نداشته باشد بی‌صدا به fallback قبلی (آیکون سایت/لوگو) برمی‌گردد. فونت TTF اگر موجود نباشد از فونت داخلی GD استفاده می‌شود.
- پیش‌تولید: هنگام ذخیرهٔ مقاله/دوره (`save_post`) فایل ساخته می‌شود تا اولین خزش شبکه‌های اجتماعی سریع باشد.
- پل ارتباطی: قالب در بخش SEO خود مقدار og:image را از فیلتر `teachdemy_og_image` می‌گیرد (قالب 1.6.6 + افزونه 2.4.6 هر دو لازم‌اند).

### هـ) صفحهٔ تشکر خرید (Order Received) برند شد
- متن پیش‌فرض «Thank you. Your order has been received.» → «**Thank you, [نام هنرجو] — your order is confirmed!** Your engineering journey starts right now.»
- **تایم‌لاین «What happens next?»** با ۳ گام شماره‌دار و خط اتصال سبز:
  1. **Check your inbox** — ایمیل رسید + توصیهٔ چک‌کردن اسپم
  2. **Your courses are ready** — همه‌چیز در My Learning آماده است
  3. **Start learning today** — دسترسی دائمی + گواهینامه پس از آزمون
- دکمهٔ بزرگ «Go to My Learning →» + لینک «Need help? Contact Instructor Support».
- کاملاً واکنش‌گرا + حالت تاریک؛ با فیلتر `tdp_thankyou_next_steps` قابل غیرفعال‌شدن.

### و) دو جزئیات فرانت دیگر
- **کنترل اندازهٔ متن مقاله (A− / A / A+)**: بالای بدنهٔ هر مقاله، ۴ گام (۱۵ تا ۲۰px)، ذخیره در localStorage — برای مقاله‌های فنی طولانی و خوانندگان مسن، یک برد بزرگ دسترس‌پذیری. بلوک‌های کد اندازهٔ خود را حفظ می‌کنند.
- **نوار چسبان ثبت‌نام موبایل**: در صفحهٔ دوره وقتی جعبهٔ خرید از دید خارج شود، نوار باریکی پایین صفحه با **قیمت دوره + دکمهٔ Enroll now** ظاهر می‌شود؛ دکمه به‌آرامی به جعبهٔ خرید اسکرول می‌کند و دکمهٔ اصلی Add to cart دو ثانیه پالس سبز می‌گیرد. اگر Woodmart خودش دکمهٔ چسبان داشته باشد یا محصول متغیر/گروهی باشد، این نوار فعال نمی‌شود (صفر تداخل با اعتبارسنجی ووکامرس).

### ز) نکات فنی دور هفتم
- فایل‌های جدید افزونه: `class-tdp-learner-progress.php`، `class-tdp-review-request.php`، `class-tdp-og-image.php` — هر سه فقط با `register_hooks()` خودکار در `class-teach-demy-plus.php` ثبت می‌شوند.
- اسکن سفارش‌ها فقط با `wc_get_orders()` → **سازگار با HPOS**؛ کوئری‌های گواهینامه/آزمون روی جداول خود افزونه با ایندکس.
- ایمیل درخواست نظر از همان قالب برند (سرمه‌ای + سبز) استفاده می‌کند + نسخهٔ in-app در اعلان‌های داشبورد هنرجو.
- تصاویر OG در `uploads/tdp-og/` — اگر پوشهٔ uploads سفارشی دارید، همان‌جا ساخته می‌شود؛ فضای مصرفی هر کارت زیر ۵۰KB است.
- نسخه‌ها: قالب **1.6.6** (کش سرویس‌ورکر `td-v1.6.6`)، افزونه **2.4.6**.
- بعد از نصب: کش‌ها را پاک کنید و یک‌بار **تنظیمات ← پیوندهای یکتا ← ذخیره** بزنید (برای Endpoint جدید `my-learning`).

---

## ۱۱) دور هشتم — موتور رشد: نشان‌ها، بازیابی سبد، انتشار خودکار (v26.7 / v16.7)

> تمرکز این دور: **تبدیل هنرجو به طرفدار برند** و **برداشت درآمد از دست‌رفته**. سه ماژول جدید افزونه + یک ویجیت جدید ادمین + اصلاح رنگ برند در کل افزونه + یک جزئیات فرانت.

### الف) نشان‌های دستاورد هنرجو (Achievement Badges) 🏆
۱۰ نشان خودکار که با پیشرفت هنرجو فعال می‌شوند:

| نشان | شرط |
|---|---|
| 🎓 First Step | اولین ثبت‌نام دوره |
| 📚 Course Collector | ثبت‌نام در ۵ دوره |
| ⭐ Trusted Voice | اولین ثبت نظر برای دوره |
| 📝 Exam Debut | اولین شرکت در آزمون |
| 🏅 Exam Conqueror | اولین قبولی آزمون |
| 🏆 Certified | اولین گواهینامه |
| 🔥⚡🚀💎 | استریک ۳ / ۷ / ۱۴ / ۳۰ روز |

- **ویترین نشان‌ها** پایین تب My Learning (My Account) — نشان‌های قفل‌شده خاکستری و کم‌رنگ دیده می‌شوند تا انگیزه بماند.
- هر نشان یک **اعلان in-app** می‌سازد؛ فقط نشان‌های «مایلستون» (گواهینامه، قبولی، ۵ دوره، استریک ۷ و ۳۰) ایمیل برند هم دارند — **اسپم نمی‌شود**.
- **ایمیل گواهینامه اول** شامل **۳ دورهٔ پیشنهادی بعدی** است (پرفروش‌هایی که هنرجو هنوز ندارد؛ دوره‌های upcoming هرگز پیشنهاد نمی‌شوند) — این همان ایمیل «تبریک + ادامه بده» است که در پایان لحظهٔ شادی بیشترین نرخ کلیک را دارد.
- انصراف از ایمیل‌ها با یک کلیک (لینک nonce دار در پاورقی هر ایمیل) — نشان‌ها همچنان ثبت و نمایش داده می‌شوند.
- فیلترها: `tdp_achievement_definitions` (تغییر/حذف/افزودن نشان)، `tdp_achievement_email_badges`، `tdp_achievement_emails_enabled`.

### ب) بازیابی سبد خرید رهاشده (Abandoned Cart Recovery) 🛒
- لحظه‌ای که هنرجو فرم Checkout را POST می‌کند (ایمیل + اقلام سبد ثبت می‌شود) و سفارش کامل **نمی‌شود** (انصراف در پی‌پل، بستن تب، خطای کارت…):
  - **۶ ساعت بعد** → ایمیل اول بازیابی («سبد شما ذخیره است» + لیست دوره‌ها + جمع کل + دکمهٔ سبز Finish my enrolment).
  - **۲۴ ساعت بعد** → فقط یک یادآوری نهایی. بعد از آن ساکت مطلق.
- اگر همان ایمیل **هر سفارشی** ثبت کند، ردیف سبد «recovered» می‌شود و ایمیل نمی‌گیرد — حتی اگر از مسیر دیگری خرید کند.
- لینک انصراف مهمان‌ها (بدون حساب کاربری) با توکن امن کار می‌کند.
- **ویجیت سلامت پلتفرم**: سطر «Cart recovery» با تعداد باز، تعداد بازیابی‌شده و **درآمد بازیابی‌شده ۳۰ روزه** + دکمهٔ Pause/Enable.
- جدول جدید `wp_tdp_abandoned_carts` — **خودترمیم** (اگر فقط فایل‌ها را FTP کنید هم در اولین بازدید ادمین ساخته می‌شود؛ نیازی به غیرفعال/فعال‌کردن مجدد نیست).
- فیلترها: `tdp_cart_recovery_delay_hours` (پیش‌فرض ۶)، `tdp_cart_recovery_followup_hours` (۲۴)، `tdp_cart_recovery_coupon` (اگر کد تخفیف دارید، در ایمیل ذکر می‌شود)، `tdp_cart_recovery_batch`، `tdp_cart_recovery_enabled`.
- محدودیت: فقط سبدهایی که ایمیل‌شان در فرم Checkout ثبت شده (سبد مهمانِ بدون ایمیل قابل پیگیری نیست).

### ج) اتوماسیون روز انتشار دوره (Launch Automation) 🚀
تا امروز ادمین باید **دستی** تیک Upcoming را برمی‌داشت تا ایمیل‌های Notify/Waitlist ارسال شوند. حالا:
- هر روز ساعت **۰۹:۰۰ به وقت سایت**، دوره‌های منتشرشده‌ای که `_td_launch_date` **رسیده** ولی هنوز upcoming هستند پیدا می‌شوند:
  1. به همهٔ مشترکان Notify/Waitlist که هنوز ایمیل نگرفته‌اند **ایمیل برند** می‌رود (اعضای waitlist همان متن تخفیف pre-sale را می‌بینند).
  2. دوره **خودکار live می‌شود** (از صفحهٔ Upcoming به گرید دوره‌های منتشرشده منتقل می‌شود) — حتی اگر ادمین خواب باشد!
  3. یک ایمیل «Course launched» برای تیم ارسال می‌شود.
- **حفاظت دوبل**: هر عضو waitlist متا `_tdp_wl_notified` می‌گیرد — **هیچ مسیری (کرون یا ادمین) نمی‌تواند دو بار به یک نفر ایمیل بزند**. مسیر دستی قبلی قالب هم همین متا را چک می‌کند.
- فیلترها: `tdp_autolaunch_enabled` (اگر می‌خواهید ایمیل‌ها برود ولی live‌شدن خودکار نباشد → option `tdp_autolaunch_off`)، `tdp_autolaunch_batch`.
- اجرای دستی ادمین: `?tdp_run_launch_check=1&_wpnonce=...` (مثل review-request).

### د) Learner 360 — پروندهٔ کامل هنرجو در یک نگاه 🔍
در **ویجیت Platform Health** (پیشخوان ادمین):
- کادر جستجو: نام یا ایمیل یا یوزرنیم هنرجو را بنویسید + Enter.
- نتیجه: آواتار، نقش‌ها، تاریخ عضویت، تعداد دوره‌ها، گواهینامه‌ها (۳ مورد آخر با شماره LMS)، آزمون‌ها (کل + قبولی)، استریک (فعلی + رکورد)، **ارزش کل مشتری (LTV)**، همهٔ نشان‌ها، آخرین فعالیت/سفارش + دکمهٔ Edit profile.
- چند نتیجه؟ اولین کامل نمایش داده می‌شود، بقیه به‌صورت خلاصه.
- سطح دسترسی: فقط `manage_options`. یک درخواست AJAX سبک — بدون هزینهٔ محاسباتی تا وقتی جستجو نشود.

### هـ) یکسان‌سازی کامل رنگ برند (رفع آبی‌های قدیمی) 🎨
ادامهٔ اصلاح دور ۶ (که فقط قالب ایمیل را درست کرده بود):
- **همهٔ** `#123A80` (آبی اصلی قدیمی) در صفحات گواهینامه، آزمون، تیکت‌ها، UI افزونه و ادمین → **سرمه‌ای برند `#062b2b`**
- `#5276B3` و `#45add6` → **سبز برند `#16a673`**، تینت‌های آبی روشن → مینت برند
- قاب گواهینامه‌های چاپی، دکمه‌های ایمیل، بلوک‌کوت‌ها، سایه‌ها و کامنت‌ها — همه یکدست شدند. حالا **کل تجربه (سایت + افزونه + ایمیل‌ها + گواهینامه) یک برند واحد است**.

### و) نوار «ادامه از جایی که بودید» در صفحهٔ دوره‌ها 🕐
- در صفحهٔ هر دوره که می‌روید، دوره در حافظهٔ مرورگر ثبت می‌شود (حداکثر ۸ مورد).
- در صفحهٔ Courses (و صفحهٔ shop) نوار افقی اسکرولی از **آخرین دوره‌های دیده‌شده** با تصویر، عنوان و قیمت نمایش داده می‌شود — «Pick up where you left off» + دکمهٔ Clear history.
- حداقل ۲ مورد لازم است تا نمایش داده شود (یک مورد تنها = نویز).
- کارت‌ها: hover سبز + سایه، snap اسکرول، lazy-load تصاویر، حالت تاریک و پرینت کامل، `prefers-reduced-motion` رعایت شده.

### ز) ارتقای ایمیل‌های Waitlist (برند + ضد ارسال دوباره)
- مسیر دستی قبلی (برداشتن تیک Upcoming توسط ادمین) حالا از **قالب ایمیل برند** افزونه استفاده می‌کند (اگر افزونه فعال باشد) و متا «notified» ثبت می‌کند.
- یعنی: ادمین دستی live کند یا کرون خودکار — **هر هنرجو فقط یک ایمیل می‌گیرد**.

### ح) نکات فنی دور هشتم
- فایل‌های جدید افزونه: `class-tdp-achievements.php`، `class-tdp-abandoned-cart.php`، `class-tdp-launch-automation.php` + دو خط add_action در `class-teach-demy-plus.php`.
- خط اکشن جدید در `class-tdp-certificate.php`: `do_action('tdp_certificate_issued', ...)` — تنها تغییری که در ماژول‌های قبلی داده شده (برای اتصال نشان‌ها).
- اکشن جدید برای ماژول‌های آینده: `tdp_platform_health_extra` — ماژول‌ها می‌توانند سطر وضعیت به ویجیت سلامت اضافه کنند بدون دستکاری فایل آن.
- همه‌چیز **HPOS-safe** (فقط `wc_get_orders` / `wc_get_products`)، همه‌جا `class_exists` + `function_exists` گارد شده؛ هر ماژول با کامنت‌کردن یک خط در `class-teach-demy-plus.php` خاموش می‌شود.
- کرون‌ها: بازیابی سبد **ساعتی**، چک انتشار **روزانه ۰۹:۰۰** — هر دو self-healing. روی هاست‌های اشتراکی یک cron واقعی که هر ۱۵ دقیقه `wp-cron.php` را صدا بزند توصیه می‌شود (مثل دور ۶ و ۷).
- نسخه‌ها: قالب **1.6.7** (کش `td-v1.6.7`)، افزونه **2.4.7**.
- بعد از نصب: کش‌ها را پاک کنید؛ جدول جدید سبد در اولین ورود به پیشخوان خودش ساخته می‌شود.

---

## ۱۲) دور نهم — لحظهٔ شادی و کنترل کامل: Toast نشان‌ها، مدیریت سبد، جزئیات خواندن (v27 / v19)

> تمرکز این دور: بستنِ **حلقهٔ انگیزشی** — نشان‌ها حالا خودشان را جشن می‌گیرند، مدیر کنترل کامل روی سبدهای رهاشده دارد، و تجربهٔ مطالعهٔ مقاله‌ها سه جزئیات حرفه‌ای می‌گیرد. همهٔ موارد **افزودنی** هستند و هیچ فایل منطق موجودی تغییر نکرده است.

### الف) Toast برندِ نشان‌ها در سایت 🔔
- تا دور قبل، نشان جدید فقط در تب My Learning و اعلان‌ها دیده می‌شد. حالا: **اولین بازدید بعدی** هنرجو از سایت (هر صفحه‌ای)، یک اعلان شناور برند پایین صفحه ظاهر می‌شود:
  - سرمه‌ای برند با هدر سبز «Achievement unlocked»، ایموجی و عنوان و توضیح هر نشان (تا ۳ نشان هم‌زمان) + دکمهٔ سبز **View My Learning**.
  - بعد از **۹ ثانیه** محترمانه محو می‌شود؛ دکمهٔ بستن هم دارد. `prefers-reduced-motion` و پرینت رعایت شده.
- هر نشان **فقط یک‌بار** Toast می‌شود: صف در user meta (`tdp_badge_toast_queue`) ذخیره و **قبل از رندر پاک می‌شود** — رفرش = تکرار نمی‌شود؛ اگر هنرجو Toast را از دست بدهد، نشان همچنان در ویترین My Learning منتظرش است.
- فقط برای کاربران واردشده؛ در ادمین/AJAX/کرون هرگز اجرا نمی‌شود.
- خاموش‌کردن: خط `add_action( 'wp_footer', ... 'render_badge_toast' ...)` در `class-tdp-achievements.php` را کامنت کنید.

### ب) صفحهٔ مدیریت سبد‌های رهاشده 📋
منوی جدید: **ووکامرس ← Abandoned Carts** (دسترسی: فقط `manage_options`):
- **چهار کادر آماری**: سبدهای باز (۳۰ روز)، بازیابی‌شده (۳۰ روز)، **درآمد بازیابی‌شده** (۳۰ روز) و کل ایمیل‌های بازیابی ارسالی — به‌علاوه بنر هشدار «PAUSED» اگر بازیابی خاموش باشد.
- **فیلتر وضعیت** (همه / در انتظار / ایمیل ۱ ارسال شد / یادآوری ارسال شد / بازیابی‌شده / انصراف‌دادن) + جدول **۱۰۰ سبد آخر** با تاریخ، ایمیل (مهمان/عضو)، محتوای سبد، مبلغ، برچسب رنگی وضعیت.
- اکشن هر ردیف:
  - **Resend now** — ارسال دوبارهٔ ایمیل اول، **همین حالا** بدون صبر کردن روی تأخیر ۶ ساعته (سقف ۲ ایمیل خودکار کرون را خراب نمی‌کند؛ اگر سبد pending باشد به sent ارتقا می‌یابد).
  - **Delete** — حذف کامل ردیف (مناسب درخواست‌های GDPR) با تأیید و nonce.
- دکمهٔ جدید **View all carts** در سطر Cart recovery ویجیت Platform Health هم به همین صفحه می‌رسد.
- امنیت: هر دو اکشن `admin_post` با `check_admin_referer` و nonce اختصاصی هر سبد + گارد `manage_options`.

### ج) نمودار درآمد به تفکیک دوره در ویجت استاد 📊
- در ویجت «My Instructor Analytics» (پیشخوان استاد)، زیر نمودار ۱۴ روزه: بخش جدید **Revenue by course — 30 days**:
  - ۵ دورهٔ پرفروشِ ۳۰ روز گذشتهٔ همان استاد با **نوار افقی گرادیانی سبز** (نسبت به پرفروش‌ترین)، عنوان کوتاه (کلیک = ویرایش همان دوره)، مبلغ و تعداد فروش.
- داده از همان اسکن کش‌شدهٔ ۶ ساعتهٔ قبلی (`per_product`) join با لیست دوره‌های خود استاد گرفته می‌شود — **صفر کوئری اضافه**. خروجی در همان ترنزینت کش استاد ذخیره می‌شود.

### د) آمار «موتور رشد» در ایمیل هفتگی مدیران 📬
بخش جدید **Growth Engine** در ایمیل دایجست یکشنبه‌ها:
- سه کادر: سبدهای رهاشدهٔ این هفته، سبدهای بازیابی‌شده (+ **درآمد بازیابی‌شده**)، کل نشان‌های اهداشده + یک خط برای کل ایمیل‌های ویت‌لیست/انتشار.
- داده‌ها: یک کوئری سبک روی جدول خود افزونه + دو option شمارنده — بدون هیچ اسکن سنگین.
- فقط وقتی دیده می‌شود که حداقل یکی از این اعداد غیرصفر باشد (سایت خالی = ایمیل خالی‌تر).

### هـ) حالت تاریک استعلام گواهینامه 🌙
- صفحهٔ **Verify Certificate** و پنل **آپلود امضای استاد** حالا با `prefers-color-scheme: dark` خودکار به پالت تیرهٔ برند می‌روند (زمینهٔ سبز-سرمه‌ای تیره، متن‌های مینت، ورودی‌ها و جدول اطلاعات هماهنگ).
- **پرینت همیشه روشن** می‌ماند (بلاک print جدا) و تصویر امضای اسکن‌شده روی زمینهٔ سفید می‌نشیند تا همیشه خوانا بماند.
- فقط CSS — با کامنت‌کردن بلاک `prefers-color-scheme` در `tdp-certificate.css` خاموش می‌شود.

### و) سه جزئیات جدید تجربهٔ مطالعهٔ مقاله‌ها 📖
در `teachdemy-enhancements.js` (§۲۷ تا §۲۹) و `blog-refresh.css`:
1. **چیپ زمان مطالعه** — «N min read» با آیکون ساعت، کنار متای مقاله (محاسبه از ۲۲۰ کلمه در دقیقه؛ فقط برای مطالب بلند).
2. **دقیقهٔ باقی‌مانده** — حلقهٔ پیشرفت مطالعهٔ موجود حالا به‌جای درصد خام، «۴m» (۴ دقیقه تا پایان) نشان می‌دهد و در انتها ✓ — هم‌زمان با چیپ بالای مقاله کار می‌کند.
3. **لینک کپی تیترها** — هاور روی هر H2/H3 (که TOC برایشان id گذاشته) ← چیپ زنجیر § ظاهر می‌شود ← کلیک = لینک عمیق در کلیپ‌بورد + تیک تأیید سبز. در موبایل کم‌رنگ همیشه دیده می‌شود (بدون هاور).
4. **حباب اشتراک متن انتخاب‌شده** — متنِ مقاله را انتخاب کنید (۱۲ تا ۲۸۰ کاراکتر) ← حباب سرمه‌ای با X / Telegram / کپیِ نقل‌قول+عنوان+لینک؛ موقعیت هوشمند (اگر بالای صفحه جا نباشد پایین انتخاب می‌نشیند) و با اسکرول محو می‌شود.

### ز) CTA معرفی (Referral) در ایمیل‌های مایلستون 🏆
- اگر هنرجوی دریافت‌کنندهٔ ایمیل نشان/گواهینامه، **Affiliate تأییدشده** باشد، پایین ایمیل بلوک سبز «Earn while you share» با لینک referral شخصی‌اش می‌آید — درست در لحظه‌ای که بیشترین تمایل به اشتراک‌گذاری را دارد.
- غیر-Affiliate‌ها هیچ تغییری نمی‌بینند (هیچ نویز جدیدی اضافه نمی‌شود). متد `referral_cta_html()` با گارد `class_exists('TDP_Affiliate')`.

### ح) نکات فنی دور نهم
- فایل‌های تغییریافتهٔ افزونه: `class-tdp-achievements.php` (Toast + CTA معرفی)، `class-tdp-abandoned-cart.php` (صفحهٔ ادمین + دو اکشن admin_post)، `class-tdp-instructor-analytics.php` (نمودار دوره‌ها + بخش دایجست)، `tdp-certificate.css` (حالت تاریک) — **همه در قالب متدهای جدید**؛ نسخه افزونه: **2.4.8**.
- فایل‌های تغییریافتهٔ قالب: `teachdemy-enhancements.js` (§۲۷–۲۹)، `blog-refresh.css` (استایل‌های جدید)، bump نسخه‌ها در `functions.php` (۱۴ نقطه) + `style.css` + `sw.js` (کش `td-v1.6.8`) — نسخه قالب: **1.6.8**.
- Toast: کل استایل و اسکریپت inline در `wp_footer` رندر می‌شود (فایل جدیدی لود نمی‌شود)؛ صف با `update_user_meta` عادی — بدون جدول جدید.
- صفحهٔ سبد رهاشده از همان ترنزینت کش ۱۰ دقیقه‌ای ویجیت استفاده می‌کند (آمار فوری می‌خواهید؟ transient `tdp_cart_recovery_stats` را پاک کنید).
- بعد از نصب این دور: فقط کش‌ها را پاک کنید — نه جدول جدیدی هست نه endpoint جدیدی.

## ۱۳) دور دهم — انگیزه، فوریت و ابزار کسب‌وکار استاد (v27.1 / v20)

> تمرکز این دور: سه اهرم رشد — **انگیزهٔ هنرجو** (جدول رتبه‌بندی استریک با حریم خصوصی)، **فوریت خرید** (شمارندهٔ زندهٔ ویت‌لیست + سنجهٔ صندلی‌های پیش‌فروش) و **ابزار کسب‌وکار استاد** (خروجی CSV تسویه‌حساب). همهٔ موارد افزودنی‌اند؛ بدون جدول یا endpoint جدید.

### الف) جدول رتبه‌بندی استریکِ ناشناس 🔥
- بخش جدید در تب **My Learning** (زیر کارت استریک) + شورت‌کد `[tdp_streak_leaderboard]` برای هر صفحه‌ای:
  - ۱۰ هنرجوی برتر بر اساس روزهای پیوستهٔ مطالعه؛ رتبه ۱ تا ۳ با نشان طلایی/نقره‌ای/برنزی؛ ردیف خودِ کاربر با برچسب سبز «you» هایلایت می‌شود.
  - **حریم خصوصی اول:** همه به‌صورت «Learner #1024» دیده می‌شوند — **هیچ‌کس بدون رضایت صریح، نامش را نشان نمی‌دهد**. دکمهٔ «Show my name / Hide my name» (admin-post + nonce) زیر جدول است و بلافاصله اعمال می‌شود.
  - یک خط انگیزشی شخصی: «You are #۴ on the board with your ۱۲-day streak» یا رتبهٔ دقیق برای خارج از جدول («currently rank #۲۳ — one more active day and you climb»).
- داده: یک `WP_User_Query` ایندکس‌شده در ترنزینت ۳۰ دقیقه‌ای (فیلتر `tdp_leaderboard_cache_ttl`؛ اندازه با `tdp_leaderboard_size`). فقط ID و عدد استریک کش می‌شود — تصمیم نام/ناشناس لحظهٔ رندر گرفته می‌شود.
- ماژول جدید: `class-tdp-streak-leaderboard.php` — برای غیرفعال‌کردن، خط `register_hooks` آن در `class-teach-demy-plus.php` را کامنت کنید.

### ب) خروجی CSV گزارش تسویه‌حساب استاد ⤓
- دکمهٔ جدید **«Payout report (CSV)»** در ویجت پیشخوان My Instructor Analytics:
  - یک ردیف به‌ازای هر دورهٔ ۳۰ روز گذشته: تعداد ثبت‌نام، درآمد ناخالص، **کارمزد پلتفرم** و **خالص قابل پرداخت** + ردیف TOTAL.
  - فایل با BOM یونیکد ساخته می‌شود تا اکسل متن فارسی را درست باز کند (`teachdemy-payout-u12-2026-08-30.csv`).
  - کارمزد پیش‌فرض ۳۰٪ و با فیلتر قابل‌تنظیم است: `add_filter( 'tdp_platform_commission', fn( $r ) => 0.25 );`
- امنیت: `admin_post` + nonce + گارد `read` + تأیید نقش استاد. داده از همان اسکن کش‌شدهٔ ویجت — صفر کوئری اضافه.

### ج) شمارندهٔ زندهٔ ویت‌لیست + سنجهٔ صندلی‌های پیش‌فروش 🕐
صفحهٔ **Upcoming** حالا در هر کارت:
1. **چیپ social proof** — «🔥 N people already waiting» (شمارش زندهٔ کل ثبت‌نام‌های همان دوره).
2. **سنجهٔ صندلی پیش‌فروش** — «ONLY X OF THE FIRST Y PRE-SALE SEATS LEFT» با نوار پیشرفت که با پرشدن صندلی‌ها **سبز → کهربایی → قرمز** می‌شود؛ بعد از تکمیل: «Pre-sale seats are claimed — join the notify list».
3. **جایگاه در صف** — بعد از Join Waitlist، پیام تأیید می‌گوید «You are #N in line» (فقط صف پیش‌فروش شمرده می‌شود، نه Notify ها).
- بعد از ثبت‌نام موفق، چيپ و نوار **بدون رفرش** به‌روز می‌شوند و پیام سرور جای پیام ثابت قدیمی را می‌گیرد.
- سقف صندلی پیش‌فرض ۲۵ و فیلترپذیر است: `add_filter( 'tdp_presale_seat_cap', fn( $c ) => 50 );` (شمارندهٔ «all» و «waitlist» جدا کش می‌شوند — helper `teachdemy_waitlist_count()` با کوئری COUNT مستقیم).

### د) ادامهٔ خواندن مقاله (Resume Reading) ▸
- مرورگر جایگاه مطالعهٔ هر مقاله را به‌خاطر می‌سپارد (localStorage با کلید مسیر صفحه). بازگشت بعدی = قرص شناور «**Resume reading · ۴۲%**» پایین صفحه (RTL-safe با ویژگی‌های logical CSS):
  - کلیک/Enter = پرش نرم همان‌جا؛ دکمهٔ × یا کلید Esc = رد؛ بعد از ۹ ثانیه خودش محترمانه محو می‌شود.
  - اگر مقاله تا ≥۹۲٪ خوانده شود، حافظه پاک می‌شود (مقالهٔ تمام‌شده دیگر پیشنهاد ادامه نمی‌دهد).
- پرینت و `prefers-reduced-motion` رعایت شده. (§۳۰ در `teachdemy-enhancements.js`)

### هـ) دکمهٔ کپی برای بلوک‌های کد 📋
- هر `<pre>` داخل مقاله یک دکمهٔ کوچک **Copy** گوشهٔ خودش می‌گیرد (RTL-safe)؛ بعد از کپی ۱.۶ ثانیه «Copied ✓» سبز می‌شود. متن کد **قبل از** افزودن دکمه snapshot می‌شود تا برچسب دکمه وارد کپی نشود. با fallback `execCommand` برای مرورگرهای قدیمی. (§۳۱)

### و) نکات فنی دور دهم
- فایل‌های افزونه: **جدید** `includes/modules/class-tdp-streak-leaderboard.php` (شورت‌کد + toggle + CSS inline فقط هنگام رندر)؛ `class-tdp-instructor-analytics.php` (دکمه + هندلر CSV)؛ `class-tdp-learner-progress.php` (تزریق جدول به My Learning)؛ `class-teach-demy-plus.php` (ثبت ماژول) — نسخه افزونه: **2.5.0**.
- فایل‌های قالب: `functions.php` (helper شمارش + پیام جایگاه در صف)، `page-upcoming.php` (چیپ + سنجه + JS به‌روزرسانی زنده)، `teachdemy-enhancements.js` (§۳۰–§۳۱)، `blog-refresh.css` + `teachdemy-static-pages.css` (استایل‌های جدید)، bump نسخه‌ها (۱۶ نقطه + `style.css` + کش `td-v1.6.9` در `sw.js`) — نسخه قالب: **1.6.9**.
- جدول رتبه‌بندی به‌صورت پیش‌فرض **ناشناس** است — برای نمایش نام، خود هنرجو باید فعالش کند (مناسب GDPR).
- بعد از نصب: فقط کش‌ها را پاک کنید. نه جدول جدیدی ساخته می‌شود نه endpoint جدیدی ثبت می‌شود.

---

## ۱۴) دور یازدهم — استعلام آفلاین و درآمد بیشتر (v27.2 / v21)

> تمرکز این دور: **اعتماد و درآمد**. گواهینامه‌ها حالا QR واقعی «Scan to verify» دارند (تولیدکنندهٔ QR کاملاً PHP خالص، بدون هیچ کتابخانهٔ خارجی)، صفحهٔ پرداخت پیشنهاد هوشمند دوره‌های مکمل می‌دهد، استادها اولین گزارش ماهانهٔ تسویه‌حساب را در ایمیل می‌گیرند، و هنرجوها حلقهٔ هدف هفتگی مطالعه را می‌بینند. همهٔ موارد افزودنی‌اند؛ بدون جدول جدید.

### الف) QR «اسکن برای استعلام» روی گواهینامه‌ها 📱
- پایین هر گواهینامه (هر دو قالب Standard و Premium)، کنار لینک استعلام، یک QR واقعی چاپ می‌شود:
  - اسکن = باز شدن مستقیم صفحهٔ استعلام با LMS Number همان گواهینامه و **استعلام خودکار** (از Round 5 صفحه با ?lms= خودکار چک می‌کند).
  - QR با رنگ سرمه‌ای برند (#062b2b)، حاشیهٔ سالم (quiet zone)، و به‌صورت SVG برداری — در پرینت و PDF کاملاً شارپ می‌ماند.
- **موتور QR کاملاً داخل افزونه است** (`includes/modules/class-tdp-qr-code.php`):
  - تولیدکنندهٔ QR خالص PHP با Reed-Solomon روی GF(256)، انتخاب خودکار ماسک با امتیازدهی ISO (هر ۴ قانون N1-N4)، سطح خطای M و نسخه‌های ۱ تا ۶ (تا ~۱۰۰ کاراکتر — برای URLهای استعلام کافی است).
  - **صحت‌سنجی‌شده:** خروجی الگوریتم بیت‌به‌بیت با کتابخانهٔ مرجع `segno` مقایسه شد — ۱۴۶ تست (مرزهای همهٔ نسخه‌ها، هر ۸ ماسک در دو سطح خطا، حالت‌های مرزی ظرفیت دقیق، و رشته‌های تصادفی) — **همگی موفق**.
  - بدون هیچ وابستگی، جدول یا endpoint جدید؛ اگر payload طولانی‌تر از ظرفیت باشد، QR بی‌صدا حذف می‌شود (گواهینامه بدون QR سالم می‌ماند).
- شخصی‌سازی با فیلتر `tdp_qr_args` (رنگ، اندازه، سطح خطا، حاشیه)؛ برای حذف کامل QR، ماژول را در `class-teach-demy-plus.php` کامنت کنید.

### ب) پیشنهاد دورهٔ مکمل در صفحهٔ پرداخت 🛒
- بخش جدید «Complete your learning path» زیر یادداشت سفارش در Checkout (فقط کاربران واردشده با سبد غیرخالی):
  - تا ۳ دورهٔ هم‌رشته (همان دسته‌بندی محصول سبد)، که هنرجو **صاحبشان نیست** و در سبد هم نیست — پس هرگز تکراری یا اسپم نیست.
  - هر کارت: تصویر کوچک، عنوان، قیمت و دکمهٔ Add — افزودن با endpoint استاندارد `wc-ajax=add_to_cart` خود WooCommerce و رفرش صفحه تا جمع کل دوباره محاسبه شود.
  - استایل با توکن‌های برند، واکنش‌گرا، و رعایت `prefers-reduced-motion`.
- غیرفعال‌کردن: `add_filter( 'tdp_bundle_upsell_enabled', '__return_false' );` — تعداد پیشنهادها: `tdp_bundle_upsell_max` (پیش‌فرض ۳، حداکثر ۴).
- ماژول جدید `class-tdp-bundle-upsell.php` — یک wc_get_orders (سقف ۲۰۰، کش درخواست) + یک get_posts.

### ج) ایمیل ماهانهٔ تسویه‌حساب استاد 📧
- اولین روز هر ماه (ساعت ۰۸:۰۰ وقت سایت)، هر استادِ فعال گزارش ۳۰ روز گذشته را در ایمیل می‌گیرد:
  - سه عدد بزرگ: ثبت‌نام‌ها، ناخالص و **خالص قابل پرداخت** + فایل **CSV پیوست** (همان قالب دکمهٔ ویجت، با BOM برای اکسل فارسی).
  - فقط برای استادهایی که این ماه فروش داشتند ارسال می‌شود (بدون ایمیل خالی)؛ لغو اشتراک همان opt-out ویجت است.
  - زمان‌بندی با «رویدادهای زنجیره‌ای» WP-Cron (بدون بازهٔ سفارشی) و خودترمیم‌شونده — اگر Cron سایت خاموش باشد، در اولین اجرا جبران می‌کند.
- غیرفعال‌کردن: `add_filter( 'tdp_payout_email_enabled', '__return_false' );` — کارمزد همان فیلتر `tdp_platform_commission` (پیش‌فرض ۳۰٪).
- نکته: این گزارش **ابزار اطلاع‌رسانی** است؛ پرداخت نهایی همچنان باید با جمع سفارش‌های WooCommerce تطبیق داده شود.

### د) حلقهٔ هدف هفتگی مطالعه 🎯
- کارت جدید در تب **My Learning** (بین کارت استریک و جدول رتبه‌بندی):
  - حلقهٔ SVG با درصد پیشرفت: «Weekly goal: N از ۵ روز فعال» — شمارش روزهای فعال از شنبهٔ هفته (از همان log موجود، بدون کوئری جدید).
  - پیام‌های انگیزشی مرحله‌ای: شروع هفته / «فقط X روز دیگر» / 🏆 «هدف رسیدی!» (حالت طلایی).
- هدف پیش‌فرض ۵ روز و فیلترپذیر: `add_filter( 'tdp_weekly_goal_days', fn( $d ) => 3 );`

### هـ) لیست خواندنی مقالات (Save for Later) 🔖
- دکمهٔ «Save for later» بالای هر مقاله + دکمهٔ شناور لیست خواندنی (گوشهٔ پایین، RTL-safe):
  - کشوی لیست با عنوان مقالات ذخیره‌شده + **درصد پیشرفت زندهٔ مطالعه** (از همان حافظهٔ «ادامهٔ خواندن» Round 10) + حذف تک‌آیتم و پاک‌کردن کل.
  - کاملاً client-side (localStorage، سقف ۳۰ مقاله)، Escape می‌بندد، داک‌مود و پرینت رعایت شده، و عنوان‌ها escape می‌شوند.

### و) پرینت تمیز مقالات 🖨
- استایل‌شیت کامل پرینت برای مقالات: کل chrome سایت (هدر/منو/سایدبار/نظرات/اشتراک‌گذاری/…) حذف، تایپوگرافی مناسب کاغذ (11.5pt)، لینک‌های خارجی با URL کنارشان چاپ می‌شوند، و `pre`/جدول/تصویر/تیترها از شکستن صفحه درست محافظت می‌شوند.

### ز) نکات فنی دور یازدهم
- فایل‌های افزونه: **جدید** `includes/modules/class-tdp-qr-code.php` (مولد QR خالص PHP، بدون hook) و `class-tdp-bundle-upsell.php`؛ `class-tdp-certificate.php` (بلوک QR در قالب گواهینامه)؛ `class-tdp-instructor-analytics.php` (بازسازی CSV به متدهای مشترک `payout_rows`/`payout_csv_content` + کرون ماهانه)؛ `class-tdp-learner-progress.php` (حلقهٔ هدف هفتگی)؛ `class-teach-demy-plus.php` (ثبت دو ماژول) — نسخه افزونه: **2.6.0**.
- فایل‌های قالب: `teachdemy-enhancements.js` (§۳۲ لیست خواندنی)، `blog-refresh.css` (استایل‌های Round 11 + پرینت مقاله)، bump نسخه‌ها (۱۶ نقطه + `style.css` + کش `td-v1.7.0` در `sw.js`) — نسخه قالب: **1.7.0**.
- بعد از نصب: فقط کش‌ها را پاک کنید. نه جدول جدیدی ساخته می‌شود نه endpoint جدیدی؛ QR هیچ فایل JS/CSS جدیدی لود نمی‌کند (SVG در همان HTML رندر می‌شود).
- سازگاری: QR فقط با PHP 7+ (intdiv) کار می‌کند — همان حداقلِ وردپرس امروز. با HPOS سازگار است.

---

## ۱۵) دور دوازدهم — طراحی کامل قیف خرید و صفحهٔ مقاله (v28.0 / v21)

> تمرکز این دور: **طراحی صفحاتی که هنوز طراحی نشده بودند**. صفحهٔ سبد خرید که تا امروز کاملاً بدون طراحی بود، حالا طراحی کامل TeachDemy دارد؛ صفحهٔ Checkout مطابق فایل مرجع `checkout.html` بازطراحی شد؛ صفحهٔ «سفارش دریافت شد» هدر موفقیت برند گرفت؛ و صفحهٔ مقاله (Article) و لیست وبلاگ با قالب‌های کاملاً جدید جایگزین چیدمان پیش‌فرض WoodMart شدند.

### الف) صفحهٔ سبد خرید (Cart) — طراحی کامل 🛒
- **باند بالا با نشانگر مراحل:** «سبد → پرداخت → شروع یادگیری» — مرحلهٔ فعلی با حلقهٔ سبز برند مشخص است و روی Checkout مرحلهٔ «سبد» به سبد لینک می‌شود.
- **جدول سبد به‌صورت کارت‌های مدرن:** تصویر دوره با گوشهٔ گرد، نام دوره، قیمت‌ها، استپر تعداد بازطراحی‌شده، دکمهٔ حذف نرم، و ردیف‌ها با هاور سبز.
- **کارت جمع کل (Sticky):** کنار سبد می‌ماند، جمع کل با رنگ سبز برجسته، و دکمهٔ سبز «ادامهٔ پرداخت» تمام‌عرض.
- **ردیف‌های اعتماد زیر جمع کل:** پرداخت امن SSL / دسترسی مادام‌العمر / ۳ ماه پشتیبانی استاد / لینک سیاست بازگشت وجه.
- **فرم کد تخفیف و دکمهٔ بروزرسانی سبد** بازطراحی شدند.
- **حالت «سبد خالی» جدید:** کارت وسط‌چین با آیکون، متن انگیزشی و دو دکمه (مرور دوره‌ها / بازگشت به خانه) — متن و دکمهٔ پیش‌فرض ووکامرس با CSS مخفی شده‌اند.
- **Cross-sellها** به‌صورت کارت‌های سه‌ستونه استایل گرفتند.
- **واکنش‌گرا:** زیر ۷۶۸ پیکسل جدول به کارت‌های پله‌ای (stacked) تبدیل می‌شود؛ حالت تاریک کامل.
- همهٔ این‌ها CSS خالص روی مارک‌آپ واقعی ووکامرس است (`cart-refresh.css` + هوک‌های PHP) — آژاکس سبد، کد تخفیف و هر افزونه‌ای بی‌نقص کار می‌کنند.

### ب) صفحهٔ پرداخت (Checkout) — ارتقا به طراحی مرجع 💳
- **کارت ارزش (Value Card):** بالای فرم صورتحساب، کارتی با تصویر دوره، عنوان (لینک به دوره)، دسته‌بندی، قیمت + قیمت قبل از تخفیف خط‌خورده + برچسب «X% ذخیره»، و چک‌لیست ارزش‌ها (دورهٔ ساختاریافته / دسترسی مادام‌العمر / آزمون‌ها / گواهینامه / ۳ ماه پشتیبانی) — دقیقاً مطابق چیدمان فایل `checkout.html` تأییدشده.
- **نشان «SECURE CHECKOUT»:** پیل سرمه‌ای با آیکون قفل بالای کارت سفارش + برچسب کوچک SSL.
- **جدول سفارش:** جمع کل با عدد درشت سبز و ردیف برجسته؛ ردیف‌ها با حاشیه‌های نرم.
- **روش‌های پرداخت به‌صورت کارت‌های رادیویی:** هر درگاه (PayPal و…) کارت خودش را دارد؛ روش انتخاب‌شده با حاشیهٔ سبز و دات سبز مشخص می‌شود. برای مرورگرهای قدیمی‌تر (بدون پشتیبانی `:has()`) انتخاب با سلکتور sibling (`input:checked + label`) هم استایل می‌گیرد و حلقهٔ فوکوس کیبورد (`:focus-visible`) هم اضافه شده است.
- **دکمهٔ داینامیک:** «Pay $X & Start Learning →» — مبلغ واقعی سبد را نشان می‌دهد و با رفرش آژاکسی به‌روز می‌شود (سفارش رایگان → «Complete Enrollment →»).
- **ردیف‌های اعتماد زیر دکمهٔ پرداخت:** اتصال رمزنگاری‌شده / فعال‌شدن دسترسی بلافاصله / لینک سیاست بازگشت.
- فرم کد تخفیف و نوارهای اطلاع‌رسانی (ورود/تخفیف) هم با استایل برند شدند.
- سازوکارها تغییری نکرده‌اند: اعتبارسنجی فیلدها، درگاه‌ها و آژاکس همه روی قالب اصلی ووکامرس کار می‌کنند (هیچ قالب ووکامرسی override نشده).

### ج) صفحهٔ «سفارش دریافت شد» — هدر موفقیت 🎉
- **هدر برند موفقیت:** آیکون تیک سبز درشت + «{نام هنرجو}، ممنون!» + توضیح گرم + چیپ‌های شمارهٔ سفارش / تاریخ / مبلغ کل / «رسید به ایمیل شما».
- دکمه‌های اقدام: «برو به My Learning →» (سبز) و «مرور دوره‌های بیشتر» (شفاف).
- متن و لیست پیش‌فرض ووکامرس فقط وقتی هدر فعال باشد با CSS مخفی می‌شوند (کلاس body هوشمند `td-has-thankyou-hero`) — با فیلتر `tdp_thankyou_hero` غیرفعال‌شدنی است.
- جدول جزئیات سفارش و آدرس صورتحساب هم کارت‌بندی و استایل گرفتند؛ تایم‌لاین «قدم بعدی» (دور ۷) سر جایش ماند.

### د) صفحهٔ مقاله (Article) — قالب کاملاً جدید 📄
- **فایل جدید `single.php`** در قالب فرزند: چیدمان پیش‌فرض WoodMart برای مقالات تک‌صفحه‌ای کاملاً با طراحی TeachDemy جایگزین شد:
  - **باند Hero سرمه‌ای:** مسیر (Breadcrumb)، پیل‌های دسته‌بندی، تیتر درشت، و ردیف متا (آواتار + نویسنده + تاریخ + زمان مطالعه + تعداد نظرات).
  - **تصویر شاخص** بزرگ با گوشهٔ گرد و سایه + کپشن.
  - **چیدمان دو ستونه:** ستون مقاله (حداکثر ۷۸۰px) + **ریل چسبان کناری** (Sticky) که فهرست مطالب (TOC) خودکار و کارت CTA «Turn theory into skill» را دارد.
  - **تایپوگرافی مهندسی:** تیترهای خط‌کشی‌شده، نقل‌قول سبز، بلوک کد سرمه‌ای تیره، جدول‌های راه‌راه، تصاویر گرد — همه با حالت تاریک کامل.
  - برچسب‌ها (Tags) به‌صورت چیپ، **ناوبری مقالهٔ قبلی/بعدی** به‌صورت کارت، و بخش نظرات استایل‌دار.
- **سازگاری ۱۰۰٪ با امکانات قبلی:** بدنهٔ مقاله همان کلاس `.entry-content` را دارد؛ پس TOC خودکار (§۱۸)، اسکرول-اسپای (§۲۲)، کنترل اندازهٔ متن (§۲۴)، زمان مطالعه (§۲۷)، لینک تیترها (§۲۸)، اشتراک متن انتخابی (§۲۹)، «ادامه از جایی که بودید» (§۳۰)، لیست خواندنی (§۳۲)، دکمهٔ کپی کد (§۱۹)، ردیف اشتراک‌گذاری و باکس نویسنده/مقالات مرتبط — همه بدون تغییر کار می‌کنند.
- **§۳۳ جدید در JS:** در صفحه‌های پهن TOC به‌صورت خودکار به ریل چسبان منتقل می‌شود و در موبایل به داخل متن برمی‌گردد.

### هـ) لیست وبلاگ — قالب کاملاً جدید 🗂
- **فایل‌های جدید `home.php` و `archive.php`** + رندرر مشترک `inc/blog-archive.php`:
  - **باند Hero با چیپ‌های دسته‌بندی** (All + ۸ دستهٔ پرمحتوا، صفحهٔ فعلی با پیل سبز).
  - **کارت مقالهٔ ویژه (Featured)** در صفحهٔ اول وبلاگ: تصویر بزرگ کنار عنوان و خلاصه.
  - **گرید کارت‌های مقاله:** تصویر ۱۶:۱۰ با زوم نرم هنگام هاور، پیل دسته، عنوان، خلاصه، ردیف متا (نویسنده · تاریخ · زمان مطالعه).
  - **صفحه‌بندی عددی** استایل‌دار (صفحهٔ فعلی سبز).
  - **باند خبرنامه** پایین صفحه با فرم متصل به همان endpoint اشتراک فوتر.
  - حالت خالی زیبا («هنوز مقاله‌ای نیست») با دکمهٔ مرور دوره‌ها.
- آرشیوهای دسته/برچسب/تاریخ/نویسنده هم همین طراحی را می‌گیرند (عنوان و مسیر خودکار). آرشیو محصولات ووکامرس و آرشیو مدرس‌ها (instructor) به‌کلی دست‌نخورده می‌مانند.

### و) نکات فنی دور دوازدهم
- فایل‌های قالب — **جدید:** `single.php`، `home.php`، `archive.php`، `inc/blog-archive.php`، `assets/css/article-single.css`، `assets/css/blog-archive.css`، `assets/css/cart-refresh.css`؛ **تغییرکردہ:** `functions.php` (بلوک Round 12: انکِیوها + هوک‌های سبد/پرداخت/تشکر + تابع مشترک نشانگر مراحل)، `assets/css/checkout-refresh.css` (بلوک Round 12)، `assets/js/teachdemy-enhancements.js` (§۳۳ ریل TOC)، bump نسخه‌ها (`style.css` → 1.8.0، کش `td-v1.8.0`) — نسخه قالب: **1.8.0**.
- افزونه بدون تغییر است (همان v21/2.6.0) — نیازی به نصب مجدد افزونه نیست؛ فقط قالب را به‌روزرسانی کنید.
- هوک‌های استفاده‌شده همه استاندارد ووکامرس/وردپرس‌اند: `woocommerce_before_cart`، `woocommerce_after_cart_totals`، `woocommerce_cart_is_empty`، `woocommerce_checkout_billing`، `woocommerce_checkout_before_order_review_heading`، `woocommerce_review_order_after_submit`، `woocommerce_order_button_text`، `woocommerce_order_details_before_order_table`، `body_class`.
- فیلترهای روشن‌کردن/خاموش‌کردن: `tdp_thankyou_hero` (هدر تشکر). کارت ارزش و ردیف‌های اعتماد با حذف `add_action` مربوطه در انتهای `functions.php` خاموش می‌شوند.
- نکتهٔ مهم ووکامرس: کارت ارزش از **اولین آیتم سبد** رندر می‌شود (مطابق مرجع تک‌محصلی) و اگر آیتم بیشتری باشد «+ N مورد دیگر» نشان می‌دهد؛ مبالغ نهایی همیشه در کارت سفارش (که با آژاکس تازه می‌شود) معتبرند.
- اگر «برگهٔ نوشته‌ها» (Posts page) در تنظیمات خواندن تعیین نشده باشد، `home.php` فعال نمی‌شود — در این حالت لیست قبلی (استایل‌شده با blog-refresh.css) باقی می‌ماند. برای فعال‌شدن طراحی جدید: تنظیمات ← خواندن ← «برگهٔ نوشته‌ها» را روی برگهٔ Articles بگذارید.
- بعد از نصب: کش‌ها را پاک کنید (قالب + مرورگر). نه جدولی ساخته می‌شود نه endpoint جدیدی.

---

## ۱۶) دور سیزدهم — اصلاح نقش‌ها (Learner تکراری)، بازطراحی صفحهٔ Category و پاسخ به موارد اعلام‌شده (v33 / v22)

> تمرکز این دور: سه گزارش کارفرما — (۱) نمایش دوبارهٔ «Learner, Learner» و «Subscriber» در فهرست کاربران + توضیح سازوکار نقش‌های چندگانه، (۲) بازطراحی کامل صفحهٔ رشته‌ها (حذف Marine، افزودن همهٔ دسته‌های واقعی سایت، کلمهٔ Engineering در تیترها، گرایش‌ها، فیلترها)، (۳) تأیید وضعیت ۱۵ مورد اعلام‌شده. قالب → **1.9.0**، افزونه → **2.7.0**.

### الف) رفع باگ «Learner, Learner» و «Subscriber» 👤
**علت:** بعضی کاربران هم نقش `customer` ووکامرس و هم نقش قدیمی `tdp_student` افزونه را داشتند و چون هر دو برچسب‌شان «Learner» شده بود، ستون نقش دوبار «Learner» نشان می‌داد. کاربرانِ افزونهٔ ورود با شبکه‌های اجتماعی هم با نقش پیش‌فرض قدیمی سایت (`subscriber` = مشترک) ساخته می‌شدند.
**راه‌حل (خودترمیم — فقط یک بار پیشخوان را باز کنید):**
- نقش «هنرجو» حالا **یک نقش واحد** است: `customer` (نمایش «Learner»). نقش `tdp_student` بازنشسته شده: همهٔ کاربرانش به‌طور خودکار به `customer` منتقل و نقش اضافی حذف می‌شود (`TDP_Database::unify_learner_role` روی `admin_init`).
- دسترسی‌های هنرجو (آزمون، گواهی‌نامه، چت با استاد) روی خودِ `customer` سوار شده‌اند؛ همهٔ شمارنده‌ها و فهرست‌های «Learners» هم از `customer` می‌خوانند.
- کاربران غیرمدیری که «فقط» subscriber بودند → یک‌باره به «Learner» تبدیل می‌شوند (مدیر و کاربران دارای نقش دیگر دست نمی‌خورند).
- نقش پیش‌فرض ثبت‌نام = `customer`؛ از این پس کاربرانی که با شبکهٔ اجتماعی وارد می‌شوند هم «Learner» می‌شوند (اگر افزونهٔ ورود اجتماعی تنظیم «نقش سفارشی» دارد، آن را روی «پیش‌فرض سایت» بگذارید).

**سازوکار نقش‌های دوگانه/سه‌گانه (توضیح درخواستی):** وردپرس به‌طور ذاتی هر کاربر می‌تواند چند نقش هم‌زمان داشته باشد. در TeachDemy نقش «Learner» پایهٔ همه است؛ با **تأیید درخواست تدریس** نقش `instructor` فقط **اضافه** می‌شود و با **تأیید درخواست Affiliate** نقش `tdp_affiliate` فقط اضافه می‌شود — هیچ نقشی حذف نمی‌شود. یعنی یک نفر می‌تواند هم‌زمان «Learner, Instructor, Affiliate» باشد؛ پیشخوان همه را پشت‌سرهم نشان می‌دهد و دسترسی‌ها روی هم سوار می‌شوند. این رفتار موردانتظار و درست است (برچسب‌ها هم حالا تمیز شده‌اند: «Affiliate» بدون پسوند).

### ب) صفحهٔ Category (رشته‌ها) — بازطراحی کامل 🏗️
- **فقط دسته‌های واقعی سایت:** کارت‌ها مستقیم از دسته‌بندی محصولات ووکامرس (`product_cat`) می‌آیند — هیچ رشته‌ای از پیش‌فرض‌های ما اضافه نمی‌شود؛ «Marine» حذف شد و هر دسته‌ای که در سایت باشد (مثل Biomedical) خودکار کارت خودش را می‌گیرد.
- **کلمهٔ Engineering:** به تیتر همهٔ رشته‌ها اضافه می‌شود («Petroleum Engineering»، «Biomedical Engineering»، …) مگر خودِ نام از قبل داشته باشد (مثل Engineering Management).
- **گرایش‌ها در هر باکس:** ابتدا زیرشاخه‌های واقعی آن دسته در سایت؛ اگر نداشت، مجموعهٔ پیش‌فرض مرتب‌ط (Reservoir/Drilling/… برای Petroleum و…) به‌صورت چیپ نمایش داده می‌شود.
- **فیلترها:** جستجو + **Level** (Beginner/Intermediate/Advanced — به‌محض اینکه متای سطح روی دوره‌ها ثبت شود ظاهر می‌شود؛ تا آن موقع مخفی است تا فیلتر بی‌داده نیاید) + **مرتب‌سازی**: A–Z / بیشترین دوره / محبوبیت (مجموع فروش) / جدیدترین (آخرین به‌روزرسانی دورهٔ همان رشته).
- **بخش اول (Hero) جدید:** چیدمان دوستونه — سمت راست متن + آمار واقعی (تعداد دسته‌ها/دوره‌ها/اساتید)، سمت چپ کارت «محبوب‌ترین‌ها» با ۴ دستهٔ پرحجم‌ترین و شمار دوره‌ها.
- آمارِ هر کارت (تعداد دوره/فروش/آخرین به‌روزرسانی) سمت سرور از دادهٔ واقعی فروشگاه محاسبه می‌شود.

### ج) وضعیت ۱۵ مورد اعلام‌شده (۳، ۵، ۷، ۸، ۱۱، ۱۲، ۱۴، ۱۶، ۱۷، ۱۸، ۱۹، ۲۱، ۲۲، ۲۳، ۲۴) ✅
همه در فایل‌های تحویلی پیاده‌سازی شده‌اند؛ با کپی فایل‌ها فعال می‌شوند و فقط برای چند مورد یک قدم تکمیلی در پیشخوان لازم است:

| مورد | کجا پیاده شده | قدم لازم بعد از کپی |
|---|---|---|
| ۳ — موجودی Wallet دقیق | افزونه `class-tdp-affiliate.php` (Item 3/46) | — |
| ۵ — لیست کاربران: مرتب‌سازی + ستون تاریخ | قالب `functions.php` (Item 5) | — |
| ۷ — رنگ هدر چت | افزونه `tdp-chat.css` | — |
| ۸ — آپلود فایل: رفع Network Error + درصد پیشرفت | افزونه `tdp-chat.js` | — |
| ۱۱ — صفرشدن شمارندهٔ خوانده‌نشده | افزونه `tdp-chat.js` (Item 11) | — |
| ۱۲ — UI چت + نوار اشتراک + برچسب INSTRUCTOR | افزونه `tdp-chat.css/js` | — |
| ۱۴ — آیکون‌های ضمیمه/میکروفون + نوار ضبط | افزونه `tdp-chat.js` (MediaRecorder) | — |
| ۱۶ — توقف کامل ایمیل‌های قدیمی | قالب `functions.php` | — |
| ۱۷ — فرم مدرسی طبق فایل Word | قالب `page-become-instructor.php` | برگه باید قالب «TeachDemy Become Instructor» داشته باشد |
| ۱۸ — فرم Affiliate: اجباری‌بودن همهٔ فیلدها | افزونه `class-tdp-affiliate.php` (Item 18) | — |
| ۱۹ — حذف My Exams استاد + رفع Resume + پنل Submissions | افزونه `class-tdp-exam.php` + `class-tdp-instructor-exam-builder.php` | — |
| ۲۱ — چیدمان دکمه‌ها با تیترهای طولانی | افزونه `tdp-exam.css` | — |
| ۲۲ — آزمون جدید = Draft + ویرایش وضعیت را عوض نمی‌کند | افزونه `class-tdp-instructor-exam-builder.php` | — |
| ۲۳ — ویدیوی معرفی + Meet Your Instructor + شمارندهٔ Learners | قالب `functions.php` + `inc/product-fields.php` | ویدیو/استاد از فیلدهای محصول ست می‌شود |
| ۲۴ — صفحهٔ Category | قالب `page-disciplines.php` (بازطراحی این دور) | برگه باید قالب «TeachDemy Disciplines» داشته باشد |

**نکتهٔ استقرار مهم:** چون فایل‌ها را مستقیم کپی کرده‌اید، هوک‌های «فعال‌سازی افزونه» اجرا نشده‌اند. این مشکلی ایجاد نمی‌کند چون ترمیم نقش‌ها (`unify_learner_role`) و مهاجرت‌ها روی هر بارگذاری پیشخوان خودشان اجرا می‌شوند — **فقط یک بار پیشخوان را باز کنید** تا: نقش تکراری حذف، subscriberها به Learner تبدیل، نقش پیش‌فرض اصلاح و دسترسی‌ها سوار شوند. برای اطمینان می‌توانید افزونه را یک‌بار غیرفعال/فعال هم بکنید (اختیاری).

### د) نکات فنی دور سیزدهم
- افزونه: `class-tdp-database.php` (تابع جدید `unify_learner_role` + هوک)، `class-teach-demy-plus-activator.php` (حذف add_role قدیمی + کپ‌ها روی customer + remove_role)، `class-tdp-affiliate.php`، `class-tdp-exam.php`، `class-tdp-instructor-analytics.php`، `class-tdp-affiliate-admin.php` (بدون کوئریِ نقش سخت) — نسخهٔ افزونه: **2.7.0**.
- قالب: `page-disciplines.php` (بازنویسی کامل)، `functions.php` (بلوک Item 2 بازنویسی + bump به 1.9.0)، `assets/css/teachdemy-static-pages.css` (بلوک Round 13)، `sw.js` (کش td-v1.9.0)، `style.css` → **1.9.0**.
- فیلتر Level فقط وقتی ظاهر می‌شود که حداقل یک دوره متای سطح (`_td_level` یا `_difficulty` با مقدار beginner/intermediate/advanced) داشته باشد — مقدارها روی فرم ویرایش محصول در «فیلدهای سفارشی» قابل ثبت‌اند.
- محبوب‌ترین‌ها از `total_sales` ووکامرس و «جدیدترین» از تاریخ آخرین تغییر دوره محاسبه می‌شود؛ همه سمت سرور و بدون AJAX اضافه.

---

## ۱۷) دور چهاردهم — صفحات پرچمدار و دسترسی‌پذیری خودکار (حالا داخل v37)

> نکته: صفحه‌های این دور در بستهٔ v36 شما نبود؛ در v37 دوباره و کامل داخل بسته آمده‌اند. (قالب 2.0.0)

- **صفحهٔ تک‌دوره (Single Course) کاملاً بازطراحی شد:** قالب اختصاصی اودمی‌گونه (هیرو + چیپ‌ها + ویدئوی معرفی + «What you'll learn» + کارت خرید چسبان با قیمت و دکمهٔ واقعی افزوده‌به‌سبد + گارانتی‌ها + بخش Meet Your Instructor با دکمهٔ **Show Profile** + دوره‌های مرتبط). تعداد هنرجویان از sales واقعی، «learner» به‌جای student، و پرسش/پاسخ دسترسی دائمی دقیقاً طبق فایل متنی شما: «Yes, the course access is permanent and lifetime.»
- **فیلد ویدئوی معرفی هر دوره:** در پیشخوان ویرایش محصول، تب TeachDemy → «Intro Video URL» (لینک یوتیوب/وایمئو/MP4) را وارد کنید تا در صفحهٔ دوره نمایش داده شود.
- **صفحات Become an Instructor (پرچمدار)، Instructors، پروفایل استاد** با آمار واقعی، تایم‌لاین و پنل چسبان.
- **هدر/فوتر صفحهٔ Home روی همهٔ صفحه‌ها** از جمله cart / checkout / صفحهٔ دوره (و حالا صفحهٔ آزمون‌ها).
- **سیستم خودشکن (Self-healing) صفحه‌ها:** افزونه صفحه‌های اصلی را خودش می‌سازد و قالب درست را روی هر صفحه‌ای که slug یا عنوانش مطابق باشد اعمال می‌کند — دیگر لازم نیست دستی قالب انتخاب کنید. صفحهٔ «Overview / Instructor Support» که قابل مشاهده نبود، الان مستقیم روی /mentor-support/ یا /instructor-support/ بالا می‌آید.
- منوی موبایل: دکمه‌های Login / Register (و «Become an Instructor») اضافه شد.
- دکمهٔ «افزودن به سبد» حالا کاربر را مستقیم به صفحهٔ سبد خرید می‌برد.

---

## ۱۸) دور پانزدهم — اجرای موارد باقی‌ماندهٔ فایل «Edits» (تم v37 / افزونه v25)

> پایه: فایل‌های نهایی خود شما (teach-demy-plus-v24-fixed + woodmart-child-v36-fixed). موارد خط‌خورده رد شدند؛ بقیه اعمال شدند.

### الف) افزونه — چت، آزمون، ولت و ایمیل
1. **هدر چت:** کاور بالا حالا گرادیان سرمه‌ای توپر با متن کاملاً سفید؛ نام استاد در هدر چت با کلمهٔ **INSTRUCTOR** جایگزین شد؛ وضعیت آنلاین/آفلاین و آخرین بازدید واضح.
2. **کادر پیام چت:** پیش‌فرض یک‌خطی شد (فقط با تایپ بیشتر رشد می‌کند) و دکمهٔ شناور ⌄ با فشردن، به آخرین پیام اسکرول می‌کند. آیکن‌های Attachment و Voice جدید (SVG) با حالت hover و focus.
3. **آپلود فایل در چت (خطای Network Error):** چندلایه درمان شد — تلاش مجدد خودکار وقتی اتصال قطع می‌شود، نمایش پیام دقیق سرور به‌جای «Network error»، مسیر اختصاصی آپلود `uploads/tdp-chat/سال/ماه/`، سازگاری با هاست‌های بدون fileinfo، و اخطار مدیریتی اگر سقف آپلود PHP زیر ۲۵ مگابایت بود (در پیشخوان نمایش داده می‌شود — اگر دیدید، از هاست بخواهید upload_max_filesize را بالا ببرد).
4. **آزمون‌ها:** آزمون‌های منتشرشده حالا در خود صفحهٔ آزمون برای هنرجویِ دارای دسترسی، کامل اجرا می‌شوند (دکمهٔ Start در My Exams به همان صفحه وصل است). اگر آزمونی سؤالی نداشت پیام واضح «This exam has no questions yet» می‌آید (به‌جای صفحهٔ خالی). برای استاد: دکمهٔ **View submissions** کنار هر آزمون در لیست سازندهٔ آزمون، مستقیم به صفحهٔ تصحیح و پاسخ‌های هنرجو (tdp-grading) می‌رود. چیدمان دکمه‌های Edit/Questions/Unpublish/Delete با تیترهای طولانی دیگر به‌هم نمی‌ریزد (ستون عنوان ثابت، دکمه‌ها راست‌چین بی‌جابجایی).
5. **مای ولت:** عدد بالانس بالای جدول حالا دقیق با سنت (دو رقم اعشار) است — هم در کارت بالانس و هم در مبالغ درخواست‌های برداشت. تقویم‌ها/فیلدهای تاریخ واله با استایل داشبورد افیلیت هم‌شکل شدند (فلش‌های واضح).
6. **یکسان‌سازی ایمیل‌ها:** هر سه منبع ایمیل (افزونه، ووکامرس، فرم‌های Gravity) حالا **یک قالب برند واحد** دارند (نوار سرمه‌ای + فوتر سبز). برای نرفتن به اسپم حتماً رکوردهای **SPF / DKIM / DMARC** دامنه را در DNS تنظیم کنید و ترجیحاً یک افزونهٔ SMTP (مثلاً WP Mail SMTP با سرویسی مثل Brevo/Postmark) نصب کنید — قالب برندشده به‌تنهایی deliverability را تضمین نمی‌کند.
7. **توقف کامل ایمیل Become an Instructor (مورد ۱۸):** ریشه پیدا شد — نوتیفیکیشن قدیمی Gravity Forms (همان که قرارداد DOCX را ضمیمه می‌کرد) هنوز فعال بود. الان نوتیفیکیشن **کاملاً غیرفعال** شده (نه ضمیمه، نه ایمیل). جریان جدید: ثبت در داشبورد Instructor Applications + آینه‌سازی در Google Sheets + یک ایمیل اطلاع‌رسانی برای ادمین.
8. **ورود با شبکهٔ اجتماعی (Subscriber ماندن):** پاک‌سازی خودکار هر ۶ ساعت: هر کاربری که فقط نقش Subscriber دارد به **Learner** تبدیل می‌شود (به‌جز ادمین‌ها) و نقش تکراری (Learner,Learner) حذف می‌شود.
9. **پرداخت از ولت (چک‌اوت):** درگاه جدید «TeachDemy Wallet» به ووکامرس اضافه شد — موجودی ولت (Kestrel) را نشان می‌دهد، اگر کافی باشد کل سفارش را از ولت تسویه می‌کند، وگرنه پیام خطای واضح. اگر افزونهٔ Kestrel فعال باشد در روش‌های پرداخت ظاهر می‌شود (ووکامرس ← تنظیمات ← پرداخت‌ها ← TeachDemy Wallet را فعال کنید).

### ب) افزونه — جریان‌های درخواست (Government-style)
10. **بازگشت مرحلهٔ احراز هویت:** جریان Become an Instructor مثل قبل (و طبق درخواست) با **گام ۱: کد ملی + شماره موبایل** شروع می‌شود؛ اعتبارسنجی کد ملی (الگوریتم رقم کنترلی) و شماره تلفن انجام و نتیجه در متادیتای درخواست ذخیره می‌شود. اتصال به سرویس واقعی استعلام کدملی↔موبایل در صورت خرید API از طریق فیلتر `tdp_inst_verify_identity_api` ممکن است (کد آماده است؛ فقط URL و کلید را وصل کنید).
11. **Become an Affiliate همان جریان را گرفت:** پنل احراز هویت (کد ملی + موبایل) ابتدای فرم + **آپلود عکس پروفایل** + ترتیب جدید فیلدها (تلفن بعد از شهر) + پرچم کشور (به‌صورت بج کد ISO — در کروم ویندوز هم نمایش داده می‌شود چون ایموجی پرچم حذف شد).
12. **بگ اسپیس تلفن:** دیگر با پاک کردن، کد کشور دوباره تایپ نمی‌شود (فقط موقع تایپ واقعی پیش‌شماره می‌آید و مکان‌نما حفظ می‌شود).
13. **افیلیت + گوگل شیت و خروجی:** ثبت‌نام افیلیت‌ها هم اکنون به Google Sheets آینه می‌شود (تنظیمات در پیشخوان ← Affiliates ← Applications: URL وب‌اپ Apps Script) + دکمهٔ **Export CSV** با همهٔ فیلدها (شامل کد ملی و آدرس عکس) + **ایمیل اطلاع‌رسانی به ادمین** هنگام ثبت (مشکل «ایمیل نیامد» حل شد) + نمای بررسی کامل (ریویو) با عکس و کد ملی.
14. **وظایف/سوابق درخواست:** تاریخچهٔ submitted/approved/rejected برای هر دو جریان با ذخیرهٔ عکس پروفایل به‌صورت پیوست خصوصی در کتابخانهٔ رسانه (uploads/tdp-chat و مسیر پیش‌فرض media) — فقط ادمین از پیشخوان می‌بیند.

### ج) قالب — صفحه‌ها
15. **صفحهٔ Affiliate:** باکس «Up to 30%» حذف شد (هم از اینجا هم از Home)؛ سه باکس زیر Creator Fit (Monthly/60 days/Up to 30%) حذف شد؛ متن زیر Get Started جایگزین شد.
16. **صفحهٔ Courses:** همه‌چیز زمینه سفید؛ هیروی جدید با پنل گرادیان (عکس مفقود جایگزین طراحی شد)؛ متن زیر عنوان طبق خواسته تغییر کرد؛ دکمه‌ها pill مدرن؛ کارت دوره‌ها 16:9 با چیپ دسته و قیمت؛ «browse the full shop/» حذف و «Browse All Courses» جایگزین شد؛ دکمهٔ Show More Courses با فاصلهٔ درست؛ ۴ باکس آخر صفحه تمام‌عرض و بزرگ‌تر.
17. **صفحهٔ FAQs:** دکمه‌های Listen در یک ستون عمودی هم‌عرض ردیف شدند (فقط مرورگرهای پشتیبان از TTS نمایش می‌دهند)؛ آواتار حروف اول برای نظردهندگان.
18. **صفحهٔ Contact:** ۴ باکس پر شد (آیکن + توضیح + چیپ زمان پاسخ)؛ زیر فرم یادداشت «به ایمیلی که وارد کردید پاسخ می‌دهیم (۲۴-۴۸ ساعت)» اضافه شد. **پیام‌ها کجا می‌روند؟** → ایمیل به آدرس ادمین (tdp_team_notification_email یا admin_email) + ذخیره در پیشخوان ← **Contact Messages** (منوی جدید با پاسخ ایمیلی و حذف).
19. **صفحهٔ Instructor Support (Overview):** همهٔ اصطلاحات طبق فایل ادیت: Mentor Support→Instructor Support، Session→**Support Period**، Discipline→Category، Amount/89$ حذف و پلن‌های ۱/۳/۶ ماهه (29/79/149 دلار) جایگزین شد، Focus Period، «Choose an available time» حذف، پنل خلاصه: Duration حذف + Time→Period + Total→Price + تکمیل خودکار از انتخاب‌ها، و دکمهٔ «Continue to Checkout» مستقیم به چک‌اوت وصل است. رنگ‌های بخش Verified Expert اصلاح شد. صفحه حالا از طریق seeder روی /mentor-support/ (یا /instructor-support/) در دسترس است.
20. **صفحهٔ Home:** متن‌ها دقیقاً طبق فایل Text (عنوان Hero، پاراگراف پشتیبانی، دو بولت Lifetime / Instructor support)؛ پلن‌های پشتیبانی پولی با همان قیمت/مدت صفحهٔ Instructor Support؛ آواتار برای نظردهندگان؛ همهٔ لینک‌ها داخلی شدند (هیچ لینک خارجی teach-demy.com در کد نیست)؛ بخش **Featured Courses** با دادهٔ واقعی محصولات (۴ دوره) + دکمهٔ Explore All Courses.
21. **صفحهٔ Upcoming:** دکمه‌های **Notify Me** و **Join Waitlist** برای همهٔ دوره‌ها (فرم نام+ایمیل، ثبت در سیستم و ایمیل هنگام انتشار)؛ تخفیف پیش‌خرید پیش‌فرض **۲۰٪** و قابل تغییر از تنظیمات دیتابیس (option با کلید `tdp_waitlist_discount`)؛ نام مدرس هر دوره با لینک به پروفایل؛ بخش «Want to Become an Instructor» به صفحهٔ Become an Instructor وصل است.
22. **صفحهٔ Disciplines/Category:** آمار واقعی به‌جای +50 (اگر صفر باشد نمایش داده نمی‌شود)؛ شمارش واقعی دوره‌های هر دسته؛ رنگ متن «not sure where to start» سفید شد.
23. **صفحهٔ About Us:** نوار لوگوی سازمان‌ها (همان Home) + بج‌های دانشگاه/شرکت برای اعضای تیم (قابل ویرایش با متاهای `_td_university` و `_td_company` روی پست اعضا) + نوار فالوور شبکه‌های اجتماعی (اعداد از theme mod با کلیدهای `td_social_youtube/linkedin/instagram/telegram`؛ مقدار پیش‌فرض نمایش داده می‌شود تا مقدار واقعی تنظیم شود — افزونه‌های شبکه‌های اجتماعی برای گرفتن خودکار اعداد API کلید می‌خواهند).
24. **چک‌اوت:** متن بنر عوض شد؛ اعداد پنل راست تراز شد؛ روش‌های پرداخت به‌صورت کارت رادیویی (شامل درگاه جدید Wallet)؛ فیلدهای تلفن/آدرس از قبل اجباری هستند (واترمارک).
25. **Refund:** باکس آخر به‌جای «My Purchase» راهنمای تیکت پشتیبانی است. **404:** اشاره به learning path حذف شد.

### د) پاسخ به سؤال‌های شما در فایل Edits
- **نقش‌های چندگانه چطور کار می‌کند؟** در وردپرس هر کاربر می‌تواند هم‌زمان چند نقش داشته باشد؛ نمایش «Learner, Instructor» یا «Learner, Affiliate» طبیعی است و سه‌گانه هم ممکن است (مثلاً هنرجویی که استاد و افیلیت هم باشد). فقط «تکراری» بودن نقش اشتباه بود که پاک‌سازی خودکار الان حذفش می‌کند.
- **چطور محدودیت ثبت‌نام (۱۰ بار) را تست کنیم وقتی کد تایید ایمیلی است؟** شمارنده روی «تلاش» است نه «موفق»: در حالت ناشناس (Incognito) فرم ثبت‌نام را با ایمیل‌های مختلف ۱۱ بار Submit کنید (بدون اینکه کد ایمیلی را وارد کنید) — بار یازدهم پیام «Too many registrations» می‌آید و ۱۵ دقیقه قفل می‌شود. برای لاگین هم ۱۰ تلاش ناموفق (رمز غلط) همان رفتار را دارد.
- **ری‌ست پله‌ای رفرال ماهانه چطور بررسی شود؟** سلسله‌مراتب کمیسیون اولِ هر ماه (زمان سرور سایت) دوباره از پلهٔ شروع محاسبه می‌شود. برای تست: یک کاربر آزمایشی را با لینک رفرال ثبت‌نام کنید و یک خرید کامل انجام دهید؛ در جدول Recent Referral کمیسیون با نرخ پلهٔ اول ثبت می‌شود؛ با wp-cli یا صبر تا اول ماه بعد، سقف ری‌ست می‌شود (متای شمارنده در جدول affiliate_settings قابل مشاهده است).
- **فایل‌های چت کجا ذخیره می‌شوند؟** در `wp-content/uploads/tdp-chat/سال/ماه/` (پیوست خصوصی). برای هاست ۵ گیگابایتی: تنظیمات ← Messaging ← محدودیت ۲۵ مگابایت موجود است؛ اگر حجم رشد کرد می‌توانید دایرکتوری را به گوگل درایو/آرشیو سرد منتقل کنید یا از افزونهٔ Offload Media استفاده کنید (معماری آماده است چون همهٔ فایل‌ها زیر یک پوشه‌اند).
- **عکس پروفایل درخواست‌ها کجا ذخیره می‌شود؟** به‌صورت پیوست خصوصی در کتابخانهٔ رسانه (media) — در پیشخوان ← Instructor Applications یا Affiliates ← Applications داخل جزئیات هر درخواست قابل مشاهده است.
- **اسپات‌پلیر:** متن لایسنس با سلکتورهای `.spxplayer-license/.spot-player-license` قرمز شده؛ اگر کلاس پلاگین اسپات پلیر متفاوت است، نام کلاس دقیق را بفرستید تا اضافه کنیم.
- **Voice چت:** ضبط با تایمر زنده + دکمه‌های تأیید/لغو موجود است؛ فایل صوتی فقط بعد از تأیید ارسال می‌شود.

### هـ) مراحل نصب این نسخه
1. قالب `woodmart-child-v37.zip` و افزونهٔ `teach-demy-plus-v25.zip` را نصب/فعال کنید (جایگزین کامل).
2. یک‌بار پیشخوان را باز کنید (منوهای Contact Messages و تنظیمات Sheets ساخته شوند) و پیوندهای یکتا را ذخیره کنید.
3. برای درگاه ولت: ووکامرس ← تنظیمات ← پرداخت‌ها ← **TeachDemy Wallet** را فعال کنید.
4. برای Sheets: Instructor Applications و Affiliates ← Applications ← URL وب‌اپ Apps Script را وارد کنید (نمونه اسکریپت در README افزونه).
5. اگر ایمیل‌ها هنوز به اسپم می‌روند: SPF/DKIM/DMARC + SMTP (بند ۶ بالا).

---

## ۱۹) دور شانزدهم — درخواست‌های جدید شما: حذف احراز هویت، فرم کامل‌تر، و صفحات مدرس‌ها (v38 / v25)

این دور دقیقاً روی سه درخواست جدید شما ساخته شده: **(۱) حذف مرحلهٔ احراز هویت (کد ملی + موبایل) از فرم Become an Instructor، (۲) کامل‌تر شدن فرم با مراحل و فیلدهای فایل Word اصلی شما، (۳) صفحهٔ Instructors به‌عنوان لیست مدرس‌ها + ورود به پروفایل هر فرد.**

### الف) فرم Become an Instructor — حذف احراز هویت + ساختار ۵ مرحله‌ای کامل
- مرحلهٔ «احراز هویت» (کد ملی + موبایل) به‌طور کامل از فرم، جاوااسکریپت و بک‌اند افزونه حذف شد — دیگر هیچ الزامی برای Verify وجود ندارد و ارسال فرم مستقیم انجام می‌شود.
- فرم حالا **۵ مرحله** مطابق ساختار فایل Word شماست:
  1. **Personal Details** — متن معرفی خود فایل Word شما («Please complete this form carefully…») + نام، ایمیل، کشور/شهر (کشویی)، تلفن، عکس پروفایل.
  2. **Educational Background** — جدول شماره‌دار تکرارشونده: «No. / Degree / Field of Study / University / Year» (مطابق جدول فایل Word).
  3. **Industrial Experience** — جدول شماره‌دار تکرارشونده: «No. / Job Position / Company Name / Years» + رضایت نمایش لوگوهای سازمان‌ها (Yes/No).
  4. **Course Proposal** — عنوان دوره، مخاطب هدف، اهداف یادگیری (۳ تا ۶)، نوع ارزیابی، قیمت پیشنهادی USDT، سرفصل‌ها و زیرمبحث‌ها، اجازهٔ تخفیف تبلیغاتی.
  5. **Resume** — رزومه به‌صورت **متن** (نه PDF).
- اعتبارسنجی مرحله‌به‌مرحله: فیلدهای الزامی قرمز می‌شوند و پیام خطا داخل همان مرحله نمایش داده می‌شود (بدون پرش).
- فایل‌های تغییر یافته: قالب `page-become-instructor.php` + `assets/css/td-become-instructor.css`، افزونه `tdp-instructor-apply.js` + `tdp-instructor-apply.css` + `class-tdp-instructor-application.php`.
- در ایمیل ادمین و خروجی CSV، ستون National ID فقط برای داده‌های قدیمی (قبل از این دور) نمایش داده می‌شود — درخواست‌های جدید آن را ندارند.

### ب) صفحهٔ Instructors (لیست مدرس‌ها) — `/instructors/`
- فیلتر تخصص حالا **از دادهٔ واقعی مدرس‌های شما ساخته می‌شود** (گزینه‌های دستی حذف شدند).
- **مرتب‌سازی جدید**: Featured / Top rated / Most learners / Most courses / A–Z + شمارندهٔ زندهٔ نتایج.
- نشان **Verified** (تیک سبز) روی عطارکِ هر مدرس + دکمهٔ **1:1 Support** در کنار View Profile هر کارت.
- لینک «Instructors» از قبل در منوی هدر و فوتر موجود است.
- **مهم — پر شدن خودکار لیست**: اگر مدرس‌های شما کاربر وردپرس با نقش `instructor` باشند (مثلاً از طریق تأیید درخواست‌ها)، قالب حالا **خودکار برای هرکدام یک پست Instructor می‌سازد** (سینک هر ۶ ساعت، بدون دست‌کاری داده‌های موجود). پس لیست روی سایت واقعی شما خالی نمی‌ماند.

### ج) صفحهٔ پروفایل مدرس (`/instructor/{slug}/`) — زیباتر و کاربردی‌تر
- دکمه‌های اقدام مستقیم در هیرو: **Book 1:1 Support** + **View Courses ↓** (پرش به بخش دوره‌ها).
- نشان Verified روی عطارک پروفایل، لینک «Browse All Courses» در بخش دوره‌ها، و **کلیک‌شدن نام مدرس** در صفحهٔ هر دوره (بخش Meet Your Instructor) برای رفتن به پروفایل.
- **پس از تأیید درخواست مدرسی** علاوه بر ساخت خودکار پروفایل: عکس + تخصص از فرم پر می‌شود و **دوره‌های ووکامرسی که خود او ساخته** به‌طور خودکار به پروفایلش لینک می‌شوند (اگر از قبل مدرسی انتخاب نشده باشند).

### د) نکات فنی دور شانزدهم
- قالب: `page-become-instructor.php`، `archive-instructor.php`، `single-instructor.php`، `inc/instructor-cpt.php` (سینک خودکار + متاباکس کاربر لینک‌شده)، `inc/td-course-single.php`، CSSهای `td-become-instructor.css` / `td-instructors.css` / `td-course-single.css`، `functions.php` (bump) — نسخهٔ قالب: **2.0.1 (v38)**.
- افزونه: `class-tdp-instructor-application.php` (حذف کامل منطق احراز هویت + سیم‌کشی جدید تأیید)، `tdp-instructor-apply.js` / `.css` — نسخهٔ افزونه: **2.8.1 (v25)**.
- کارت اضافه‌کردن مدرس دستی: منوی «Instructors» در پیشخوان → Add New (فیلدها: تخصص، امتیاز، تعداد هنرجو، جدول تخصص‌ها، LinkedIn/وب‌سایت).
- برای لینک‌کردن دستی دوره به مدرس: ویرایش محصول → بخش Product data → تب **TeachDemy** → Instructor.

---

## ۲۰) دور هفدهم — ریسپانسیو کامل موبایل در «همهٔ صفحات و همهٔ بخش‌ها» (v39 / v26)

گزارش شما: **«روی گوشی اصلاً سایت خوب نیست و ریسپانسیو موبایل نیست — در همهٔ صفحات و هر قسمت از صفحات.»** این دور یک لایهٔ کامل موبایل روی کل سایت اضافه می‌کند؛ دسکتاپ هیچ تغییری نمی‌کند چون تمام قوانین فقط داخل مدیاکوئری‌های موبایل (۱۰۲۴ / ۹۰۰ / ۷۶۸ / ۶۴۰ / ۴۸۰ / ۳۸۰ پیکسل) نوشته شده‌اند.

### الف) لایهٔ سراسری جدید: `td-mobile-fix.css`
- فایل CSS جدید که **در همهٔ صفحات سایت** (صفحات اختصاصی، فروشگاه، سبد خرید، تسویه‌حساب، حساب من، بلاگ، جستجو، 404، صفحات افزونه) با بالاترین اولویت لود می‌شود تا همیشه روی بقیهٔ استایل‌ها پیروز شود.
- **شبکهٔ ایمنی عمومی**: عکس/ویدئو/جدول‌ها هرگز از عرض صفحه بیرون نمی‌زنند (`max-width:100%`)، فرزندان گرید اجازهٔ کوچک‌شدن دارند (رفع مشکل شمارهٔ یک اسکرول افقی)، کلمات طولانی می‌شکنند.
- **ورودها ۱۶px** می‌شوند تا iOS هنگام لمس فیلدها زوم نکند.
- `html/body` روی موبایل `overflow-x:hidden` — دیگر اسکرول افقی اتفاقی وجود ندارد.

### ب) هدر و فوتر روی گوشی
- ارتفاع هدر ۷۶ → ۶۴ پیکسل؛ لوگو و دکمه‌ها جمع‌وجورتر؛ در ۳۸۰px فقط لوگو + همبرگر + سبد + ورود می‌ماند (Explore/Wishlist/Sign Up موبایل حذف می‌شوند — همه داخل پنل همبرگر موجودند).
- پنل منوی همبرگر: **حداکثر ارتفاع صفحه با اسکرول** (روی گوشی‌های کوچک منو زیر صفحه گم نمی‌شود)، دکمهٔ همبرگر ۴۴px (اندازهٔ استاندارد لمس)، آیتم‌ها فاصلهٔ ۱۲px با جداکننده.
- جستجوی هدر روی موبایل به **پنل تمام-عرض** زیر هدر تبدیل می‌شود (به‌جای پاپ‌آور کوچک دسکتاپ) با لیست نتایج قابل اسکرول.
- فوتر: ستون‌ها فشرده‌تر، فرم خبرنامه که قبلاً `min-width:320px` داشت و صفحه را می‌شکست حالا **تمام-عرض و ستونی** می‌شود، لینک‌های اجتماعی ۳۶px، رعایت **ناحیهٔ امن iOS** (ناچ و نوار خانه).

### ج) صفحهٔ اصلی و صفحات محتوایی
- هیرو: عنوان با `clamp()` (بین ۲۴ تا ۴۰px خودکار)، متن ۱۳.۵px، دکمه‌های CTA **تمام-عرض ستونی**، حذف min-height 100vh، دایرهٔ تزئینی داخل مرز.
- مارکی لوگوها، کارت‌های رشد/پلن‌ها، پیش‌نمایش چت، کارت‌های دوره — همه با padding و اندازهٔ مناسب گوشی.
- همهٔ صفحات ثابت (درباره/تماس/سوالات/بازگشت وجه/قوانین/حریم خصوصی/ماموریت/همکاری/پشتیبانی استاد): هیرو جمع‌تر، فرم‌های تماس تک‌ستونه، تایم‌لاین نازک‌تر، **جدول‌ها اسکرول افقی** (نه له‌شدن)، نوار چسبان پایین با safe-area.
- Disciplines/Upcoming: فیلترها افقی-اسکرول، شمارش معکوس و صندلی‌های باقی‌مانده wrap، فرم Notify-Me ستونی.
- Instructors و پروفایل مدرس: نوار فیلتر ستونی با چیپ‌های اسکرول‌شونده، کارت‌ها تک‌ستونه با دکمه‌های تمام-عرض، هیرو پروفایل تک‌ستونه.
- فرم ۵ مرحله‌ای Become an Instructor: **قرص‌های پیشرفت به‌صورت افقی اسکرول می‌شوند** (دیوار قرص‌ها حذف شد)، ورودها ۱۶px، دکمه‌های Next/Back تمام-عرض، جدول‌های شماره‌دار (No./مدرک/دانشگاه/…) روی گوشی ستونی با حفظ ستون شماره.
- صفحهٔ دوره: کارت خرید بالای محتوا (نه چسبیده)، عنوان clamp، متا wrap، سرفصل‌ها فشرده.
- مقالات: چیدمان تک‌ستونه، TOC کنار محتوا، کد و جدول‌ها اسکرول افقی، نویسنده/اشتراک‌گذاری ستونی.

### د) ووکامرس روی گوشی (سبد / تسویه / حساب من / فروشگاه)
- فروشگاه: **۲ ستون** روی گوشی (فاصله ۱۰px)، عکس‌ها تمام-عرض.
- سبد خرید: جدول سبد به **لیست کارتی ستونی** تبدیل می‌شود (عکس + عنوان + قیمت با برچسب‌ها) — همان رفتار استاندارد موبایل ووکامرس، جمع‌شده (cart totals) تمام-عرض.
- تسویه‌حساب: فرم و خلاصه سفارش ستونی، فرم‌ها تمام-عرض، جدول خلاصه سفارش اسکرول افقی.
- **حساب من مهم‌ترین تغییر**: منوی کناری به **نوار قرصی افقی قابل اسکرول** تبدیل می‌شود (۹ برچسب ووکامرس به‌جای اشغال کل صفحه)، کارت‌های داشبورد ۲ ستونه (۴۸۰px: تک‌ستونه)، جدول سفارش‌ها اسکرول افقی، فرم‌های آدرس تک‌ستونه، صفحهٔ ورود/ثبت‌نام تک‌ستونه.

### هـ) رابط‌های افزونه روی گوشی (افزونه v26)
- **چت پشتیبانی**: پنجره تمام-ارتفاع با `100dvh` (سافاری iOS)، حباب‌ها ۹۰-۹۴٪ عرض، فایل پیوست‌ها wrap، نوار ضبط فشرده، دکمه‌های آیکون ۴۲px، متن ورودی ۱۶px (بدون زوم iOS).
- **آزمون‌ها**: تایمر گلوبال **sticky** (همیشه دیده می‌شود)، گزینه‌ها ۴۸px با فاصلهٔ لمس استاندارد، دکمه‌های اقدام تمام-عرض، جدول‌ها اسکرول افقی، کارت سوال فشرده.
- **داشبورد همکاری**: کارت‌های آمار ۲→۱ ستون، نمودارها تمام-عرض، فرم درخواست ستونی.
- **کیوسک جغرافی (کشور/شهر)**: سلکت‌ها تمام-عرض ۱۶px.
- **گواهینامه‌ها**: متا/امضاها wrap، QR کوچک‌تر، دکمه‌های اشتراک‌گذاری تمام-عرض.
- Outreach CRM، جدول‌های عمومی افزونه و صفحه‌بندی: تک‌ستونه + اسکرول افقی + دکمه‌های ۳۸px.

### و) فایل‌های تغییر یافتهٔ این دور
- قالب (نسخهٔ **2.1.0 / v39**): `assets/css/td-mobile-fix.css` (**جدید**)، `wallet-refresh.css`، `inner-pages-refresh.css`، `myaccount-dashboard-refresh.css`، `functions.php` (صف جدید با اولویت ۱۰۲۰۰ + ۲۳ bump نسخه)، `style.css`، `sw.js` (کش td-v2.1.0).
- افزونه (نسخهٔ **2.8.2 / v26**): بلوک‌های «Round 17 — MOBILE PASS» به `tdp-chat.css`، `tdp-exam.css`، `tdp-affiliate.css`، `tdp-instructor-apply.css`، `tdp-geo.css`، `tdp-ui.css`، `tdp-certificate.css`، `tdp-outreach.css`، `tdp-instructor-exams.css`، `teach-demy-plus-public.css` + به‌روزرسانی نسخه در `teach-demy-plus.php` و `README.txt`.
- **QA انجام‌شده**: تعادل آکولاد همهٔ CSSها ✓، سینتکس PHP (۳۳ فایل) ✓، تطابق سلکتورها با کلاس‌های واقعی قالب/افزونه ✓، قوانین فقط داخل مدیاکوئری ✓ (دسکتاپ دست‌نخورده).

### ز) بعد از نصب — چک‌لیست ۲ دقیقه‌ای روی گوشی
1. صفحهٔ اصلی → هیچ اسکرول افقی وجود ندارد؟ عنوان و دکمه‌ها خوانا؟
2. منوی همبرگر باز می‌شود و Login/Become an Instructor داخلش هست؟
3. یک محصول → دکمهٔ خرید بالای صفحه؟ سپد خرید → لیست کارتی ستونی؟
4. حساب من → نوار قرصی افقی بالای محتوا؟
5. چت با استاد → ارسال پیام راحت با کیبورد باز؟

> نکته: اگر باز بخشی از صفحه‌تان روی گوشی مشکل داشت، **یک اسکرین‌شات + نام صفحه** بفرستید؛ لایهٔ جدید برای افزودن اصلاح نقطه‌ای در `< ۲۴ ساعت` آماده است.
