قبل
سر ماه باید بنویسید چه کردهاید، و جواب را از تاریخچه گیت و حافظه بیرون میکشید.
بعد
سابقه تاریخدار از قبل روی سایت خودِ مشتری ثبت شده. فقط بازش میکنید.
شما سایتهایی را نگه میدارید که مال خودتان نیست. این افزونه روی سایت خودِ مشتری نصب میشود، سابقه تاریخدار بهروزرسانیها و ورودها و تغییرات را نگه میدارد، سلامت پایگاه داده را میشمارد، و به مشتری یک صفحه میدهد که جواب «سایت من خوب است؟» را بدهد. نسخه حرفهای آمار بازدید GA4، آپتایم، گزارش PDF برندشده و وایتلیبل کامل را اضافه میکند. کل افزونه دور یک قید نوشته شده: نباید پیشخوان مشتری را کند کند.
آخر هر ماه کسی میپرسد «این ماه چه کار کردی؟» و شما جواب را از تاریخچه گیت، صفحه بهروزرسانیها و حافظهتان بازسازی میکنید. در همان حال مشتری یک پیشخوان کامل وردپرس دارد که نخواسته و نمیتواند بخواند. این افزونه آن سابقه را روی سایت خودِ مشتری نگه میدارد و به او یک صفحه میدهد بهجای بقیه پیشخوان.
چون روی سایت کسی دیگر نصب میشود، یک قید بالای همه بوده: نباید پیشخوان مشتری را کند کند. سه تصمیم از همین قید بیرون آمد. ماژولی که خاموش است اصلاً بارگذاری نمیشود — رجیستری نام کلاس نگه میدارد نه نمونه، و فقط ماژول فعال ساخته میشود. پورتال هرگز کوئری زنده نمیزند؛ همه اعداد از یک اسنپشات کششده میآیند و صفحه با PHP روی سرور ساخته میشود، بدون REST و بدون جاوااسکریپت. و کار سنگین روی کرون و پشت قفل اجرا میشود؛ ساخت PDF گرانترین کار اینجاست و هرگز هنگام بارگذاری صفحه اتفاق نمیافتد.
افزونه هفت ماژول دارد و همه در همین بستهاند: گزارش فعالیت با جدول ایندکسشده و هرس زمانبندیشده، بررسی سلامت پایگاه داده که اول میشمارد و فقط آنچه تیک بزنید را پاک میکند، پورتال مشتری، آمار بازدید GA4 با حساب سرویس، آپتایم، گزارش PDF زمانبندیشده، و وایتلیبل روی افزونه و گزارشها و در صورت تمایل خودِ پیشخوان.
PDF فارسی اینجا واقعاً درست است و این با چشم بررسی شده، نه با حدس: PDF ساخته شد، به تصویر تبدیل شد و بازبینی شد. فونت وزیر متن داخل بسته قرار دارد و با useOTL ثبت شده — همین یک تنظیم است که باعث میشود حروف فارسی به هم بچسبند، و همان چیزی است که بیشتر افزونهها فراموش میکنند. خروجی راستچین است، خطوط ترکیبی فارسی و لاتین درست خوانده میشوند، و شماره صفحه روی LTR قفل شده تا «۱ / ۲» وارونه نشود.
آپتایم را میتوانید از UptimeRobot یا Better Stack بخوانید، یا هر کرونی را به نقطه پایانی هارتبیت وصل کنید. آن نقطه پایانی تنها مسیر عمومی افزونه است و با HMAC-SHA256 روی مهر زمانی احراز هویت میشود، با مقایسه hash_equals، در پنجرهای یکدقیقهای، و مهر زمانی آینده رد میشود. مهمتر از همه: هر URL امضاشده فقط یکبار کار میکند. بدون آن، هر کسی که یک آدرس هارتبیت را در لاگ سرور میدید میتوانست تکرارش کند و یک قطعی واقعی را بپوشاند.
قبل
سر ماه باید بنویسید چه کردهاید، و جواب را از تاریخچه گیت و حافظه بیرون میکشید.
بعد
سابقه تاریخدار از قبل روی سایت خودِ مشتری ثبت شده. فقط بازش میکنید.
قبل
مشتری کل پیشخوان وردپرس را دارد، چیزی از آن نمیفهمد، و به شما زنگ میزند.
بعد
یک صفحه: امتیاز سلامت، بهروزرسانیهای در انتظار، فضای مصرفی، فعالیت اخیر و راه تماس با شما.
قبل
مشتری میگوید سهشنبه سایت بالا نمیآمد و شما هیچ عددی برای نشان دادن ندارید.
بعد
درصد آپتایم، از سرویس پایش خودتان یا از هارتبیت امضاشدهای که تکرارش پذیرفته نمیشود.
افزونه را روی سایت مشتری فعال کنید و در صفحه «گزارشدهی مشتری» تیک ماژولهایی را بزنید که میخواهید. آنچه خاموش بماند فایلش هم بارگذاری نمیشود.
در تنظیمات مشخص کنید کدام نقش پورتال را ببیند و اطلاعات تماس پشتیبانی خودتان را وارد کنید. مشتری از همان لحظه یک صفحه دارد.
در نسخه حرفهای برند خودتان را وارد کنید، دوره را هفتگی یا ماهانه بگذارید و گیرندهها را مشخص کنید. بقیهاش روی کرون اجرا میشود.
آژانسهای طراحی وب · فریلنسرهای نگهداری سایت · تیمهای پشتیبانی وردپرس · شرکتهای میزبانی که سرویس مدیریتشده میفروشند · استودیوهای دیجیتال · مشاوران وردپرس · هر کسی که قرارداد ماهانه نگهداری دارد و باید سر ماه چیزی برای نشان دادن داشته باشد.
همه چیز داخل خود افزونه است. بدون Composer در زمان اجرا، بدون سرویس ابری، بدون افزونه همراه.
ماژول خاموش بارگذاری نمیشود، پورتال از اسنپشات کششده میخواند، و ساخت PDF روی کرون و پشت قفل اجرا میشود. CSS و JS فقط روی صفحات خود افزونه بار میشوند و jQuery در کار نیست.
سابقه تاریخدار از بهروزرسانی هسته و افزونه و پوسته، ورود و ورود ناموفق، ساخت و حذف کاربر و تغییر نقش، گزینههای تحت نظر و انتشار محتوا. هر رویداد درجه اهمیت دارد.
نسخههای قدیمی، پیشنویس رهاشده، زبالهدان، هرزنامه، ترنزینت منقضی و متادیتای بیصاحب. اول فقط تعداد را میبینید؛ چیزی حذف نمیشود مگر تیک بزنید و تأیید کنید.
یک صفحه با امتیاز سلامت، بهروزرسانیهای در انتظار، فضای مصرفی، فعالیت اخیر و راه تماس با شما. با PHP روی سرور ساخته میشود — بدون REST، بدون جاوااسکریپت، بدون spinner.
مدیریت افزونه و دیدن پورتال دو سؤال جداگانهاند. نقشی که پورتال را میبیند در تنظیمات انتخاب میشود و هر دو تصمیم با فیلتر قابل بازنویسی است.
نشست، کاربر، بازدید صفحه و پربازدیدترین صفحهها با حساب سرویس گوگل. افزونه خودش JWT را امضا میکند، پس هیچ SDK گوگلی همراه بسته نیست.
از UptimeRobot یا Better Stack با کلید خودتان، یا از هارتبیتی که هر کرونی میتواند بزند. فاصله بیش از دو برابر بازه تنظیمشده بین دو پینگ، قطعی حساب میشود.
HMAC-SHA256 روی مهر زمانی، مقایسه با hash_equals، پنجره یکدقیقهای و رد مهر زمانی آینده. هر URL امضاشده فقط یکبار پذیرفته میشود، پس تکرار آن یک قطعی واقعی را نمیپوشاند.
هفتگی یا ماهانه، با ارسال خودکار به گیرندههایی که تعیین میکنید. فایلها در پوشهای محافظتشده با نام تصادفی نوشته میشوند و دانلودشان قابلیت و nonce میخواهد.
فونت وزیر متن همراه بسته است و با useOTL ثبت شده تا حروف به هم بچسبند. خروجی راستچین است و شماره صفحه روی LTR قفل شده. بررسیشده با تبدیل PDF به تصویر و نگاه کردن.
نام و لوگو و رنگ آژانس شما روی افزونه و گزارشها، و در صورت تمایل روی خودِ پیشخوان مشتری: لوگوی صفحه ورود، فوتر پیشخوان و پنهان کردن افزونه از دید مشتری.
کلید خصوصی حساب سرویس GA4 و کلید API پایش در هر ماژول اعلام میشوند، از هر پاسخ REST حذف میشوند و بهصورت فیلد فقط نوشتنی رندر میشوند. ارسال خالی یعنی همان قبلی بماند.
بیش از سی اکشن و فیلتر مستند در docs/hooks.md. ماژول شما یک کلاس است که با فیلتر hd_wlcr_register_modules ثبت میشود؛ فقط boot آن اجازه ثبت هوک دارد.
| امکان | توضیح | دارد |
|---|---|---|
| گزارش فعالیت تاریخدار | بهروزرسانی هسته، افزونه و پوسته و تعویض پوسته | |
| ثبت ورود و ورود ناموفق | با محدودیت نرخ روی ورودهای ناموفق | |
| ثبت تغییر کاربران | ساخت، حذف و تغییر نقش | |
| گزینههای تحت نظر | فهرست قابل تغییر با فیلتر hd_wlcr_watched_options | |
| جدول ایندکسشده فعالیت | چهار ایندکس ترکیبی، متناسب با کوئریهای واقعی افزونه | |
| هرس زمانبندیشده لاگ | بازه نگهداری پیشفرض ۹۰ روز، قابل تنظیم | |
| درجه اهمیت روی هر رویداد | تا رویدادهای مهم جدا خوانده شوند | |
| شمارش پیش از حذف | چیزی بدون تیک و تأیید پاک نمیشود | |
| پاکسازی پشت قفل | دو مدیر نمیتوانند همزمان یک پاکسازی را شروع کنند | |
| نگهداری چند نسخه از هر نوشته | پیشفرض ۵، سقف ۵۰ | |
| پورتال سرور-رندر | بدون REST، بدون جاوااسکریپت، بدون spinner | |
| اسنپشات کششده سلامت | پانزده دقیقه، قابل تغییر با فیلتر hd_wlcr_health_ttl | |
| سقف پیمایش رسانه | پنجاه هزار فایل، با کش یکساعته | |
| انتخاب نقش بیننده پورتال | پیشفرض ویرایشگر، قابل بازنویسی با فیلتر | |
| آمار GA4 با حساب سرویس | افزونه خودش JWT را امضا میکند، بدون SDK گوگل | |
| آپتایم از سرویس پایش | UptimeRobot یا Better Stack با کلید خودتان | |
| هارتبیت امضاشده | HMAC-SHA256 روی مهر زمانی، مقایسه با hash_equals | |
| مصرف یکباره هر URL امضاشده | تکرار همان آدرس رد میشود | |
| رد مهر زمانی آینده | آدرس معتبر از پیش ساخته نمیشود | |
| گزارش PDF برندشده | هفتگی یا ماهانه، ارسال با wp_mail | |
| فونت وزیر متن همراه بسته | ثبتشده با useOTL تا حروف فارسی بچسبند | |
| شماره صفحه قفل روی LTR | «۱ / ۲» وارونه نمایش داده نمیشود | |
| mPDF تریمشده و وندورشده | با Autoloader دستی، بدون Composer در زمان اجرا | |
| پوشه محافظتشده گزارشها | نام تصادفی، و دانلود با بررسی قابلیت و nonce | |
| وایتلیبل | نام آژانس، لوگو، رنگ، فوتر و لوگوی صفحه ورود | |
| کلیدهای مخفی فقط نوشتنی | از هر پاسخ REST حذف میشوند | |
| بیش از سی اکشن و فیلتر | همه در docs/hooks.md مستند شدهاند | |
| ترجمه کامل فارسی | فایل pot و po و mo همراه افزونه | |
| حذف داده فقط با اجازه صریح | گزینهای که پیشفرض خاموش است |
| مورد | حداقل |
|---|---|
| وردپرس | ۶.۲ به بالا، تستشده تا ۶.۸ |
| PHP | ۸.۰ تا ۸.۳ |
| کرون وردپرس | برای گزارش زمانبندیشده و هرس لاگ لازم است؛ روی سایت کمبازدید یک کرون واقعی سرور مطمئنتر است |
| پوشه آپلود | قابل نوشتن — گزارشهای PDF در یک زیرپوشه محافظتشده ساخته میشوند |
| سرویسهای بیرونی | فقط اگر بخواهید: یک حساب سرویس گوگل برای GA4 و یک حساب UptimeRobot یا Better Stack برای آپتایم. هارتبیت به هیچ حسابی نیاز ندارد |
بله. معیار این است که سایتهایی را نگه دارید که مال خودتان نیست. افزونه روی سایت هر مشتری جداگانه نصب میشود و همانجا سابقه را نگه میدارد. گزارش فعالیت بهتنهایی جواب سؤال «این ماه چه کار کردی» را میدهد؛ برند خودتان، آمار بازدید، آپتایم و PDF ماهانه وقتی معنا پیدا میکنند که بخواهید همان گزارش را به اسم خودتان به مشتری بدهید.
این قید طراحی افزونه بوده، نه یک ادعای بعدی. ماژولی که خاموش است اصلاً بارگذاری نمیشود، چون رجیستری نام کلاس نگه میدارد و فقط ماژول فعال ساخته میشود. پورتال کوئری زنده نمیزند و از یک اسنپشات کششده میخواند که TTL آن قابل تغییر است. ساخت PDF روی کرون و پشت قفل اجرا میشود. CSS و JS فقط روی صفحات خود افزونه بار میشوند و jQuery در کار نیست. عدد و درصدی برای سرعت نمیدهم؛ اینها تصمیم معماری است، نه نتیجه یک بنچمارک.
نه، چون چیزی برای دیدن وجود ندارد. هر نصب مستقل است و فقط داده همان سایت را دارد؛ هیچ هاب مرکزیای داده مشتریها را کنار هم جمع نمیکند. اگر وایتلیبل را روشن کنید و افزونه را از دید مشتری پنهان کنید، او فقط پورتال را میبیند و نه صفحات مدیریتی شما. روی دیگر سکه را هم بگویم: به همین دلیل یک داشبورد واحد برای همه مشتریهایتان هم وجود ندارد.
هفت ماژول، همه فعال: گزارش فعالیت، سلامت پایگاه داده، پورتال مشتری، آمار بازدید GA4، آپتایم (چه از سرویس پایش چه از هارتبیت)، گزارش PDF زمانبندیشده با ارسال ایمیل، و وایتلیبل. بهعلاوه صفحه تنظیمات، مسیرهای REST، ترجمهها و همه هوکها. ماژولی که خاموشش کنید اصلاً بارگذاری نمیشود، و جز GA4 و سرویس پایش — که خودتان تصمیم میگیرید — افزونه به هیچ جا وصل نمیشود.
بسته ۳۰۳ فایل و حدود ۹۴۰ کیلوبایت است، و تقریباً همهاش بابت دو چیز است که داخل بسته قرار دارند: کتابخانه mPDF و فونت وزیر متن در دو وزن. mPDF بهصورت تریمشده همراه است — ۳.۸ مگابایت سورس بهجای ۵۵ — و با یک Autoloader دستی بارگذاری میشود تا در زمان اجرا هیچ چیزی نصب نشود. این فایلها فقط وقتی خوانده میشوند که واقعاً یک گزارش ساخته شود.
بله، و این با چشم بررسی شده نه با حدس: PDF ساخته شد، به تصویر تبدیل شد و بازبینی شد. فونت وزیر متن داخل بسته است و با useOTL ثبت شده؛ همین یک تنظیم است که باعث میشود حروف عربی‑فارسی به هم بچسبند و همان چیزی است که بیشتر افزونهها فراموش میکنند. خروجی راستچین است، جدولها و خطوط ترکیبی فارسی و لاتین درست خوانده میشوند، و شماره صفحه روی LTR قفل شده تا «۱ / ۲» بهشکل «۲ / ۱» درنیاید.
به یک حساب سرویس گوگل کلاود و فایل کلید آن نیاز دارید، و کسی که به پراپرتی GA4 دسترسی مدیریتی دارد باید ایمیل آن حساب سرویس را بهعنوان بیننده اضافه کند. معمولاً آن شخص مشتری است، پس این تنها بخشی است که نمیتوانید یکتنه راه بیندازید. افزونه خودش JWT را با دامنه analytics.readonly امضا میکند و هیچ SDK گوگلی همراه ندارد؛ کلید خصوصی هم فیلد فقط نوشتنی است و در هیچ پاسخی برنمیگردد. اگر دسترسی نگرفتید، این ماژول را خاموش بگذارید و بقیه افزونه سر جایش کار میکند.
بله. هر کرون یا مانیتوری را به نقطه پایانی هارتبیت وصل کنید و افزونه از فاصله بین پینگها آپتایم را حساب میکند؛ فاصله بیش از دو برابر بازهای که تنظیم کردهاید قطعی شمرده میشود. آدرس با HMAC-SHA256 روی مهر زمانی امضا میشود، مقایسه با hash_equals انجام میشود، مهر زمانی باید حدود یک دقیقه به ساعت سرور نزدیک باشد، مهر زمانی آینده رد میشود، و هر آدرس امضاشده فقط یکبار پذیرفته میشود. همین آخری مهم است: بدون آن هر کسی که یک آدرس هارتبیت را در لاگ سرور میدید میتوانست تکرارش کند و یک قطعی واقعی را بپوشاند. دستور curl آماده در راهنمای فارسی هست.
هیچچیز، مگر خودتان خواسته باشید. یک گزینه «حذف داده هنگام حذف افزونه» وجود دارد که پیشفرض خاموش است، چون حذف و نصب دوباره یک افزونه نباید یک سال گزارش فعالیت را ببرد. غیرفعالسازی هم فقط رویدادهای زمانبندیشده و کشها را پاک میکند و به داده دست نمیزند. اگر آن گزینه را روشن کنید، حذف افزونه هر دو جدول، تنظیمات و PDFهای ساختهشده را پاک میکند.
رفع اشکال افزونه، راهنمایی نصب و راهاندازی — از جمله تنظیم GA4 و هارتبیت — و پاسخ به سؤالهای استفاده. سفارشیسازی، توسعه امکانات جدید و مشکلاتی که از پوسته یا افزونههای دیگر میآید بیرون از پشتیبانی است و جداگانه توافق میشود.