قبل
استایل فرم تماس روی صفحه اصلی بار میشود و اسکریپت اسلایدر روی صفحهای که اسلایدر ندارد.
بعد
همان فایل فقط جایی بار میشود که واقعاً لازم است.
هر افزونهای که نصب میکنید CSS و JS خودش را روی همه صفحهها بار میکند، حتی صفحههایی که هرگز از آن استفاده نمیکنند. این افزونه اول فهرست کامل آنچه بار میشود را نشان میدهد — شناسه، فایل، حجم و اینکه کجا دیده شده — و بعد اجازه میدهد هر کدام را بر اساس نوع محتوا، شناسه صفحه، بایگانی، نقش کاربر یا دستگاه خاموش کنید. حالت آزمایشی پیشفرض روشن است، پس تا وقتی خودتان نخواهید هیچ بازدیدکنندهای تغییری نمیبیند. معماری ماژولار است و ماژول خاموش، فایلش در درخواست بعدی اصلاً خوانده نمیشود.
یک سایت وردپرسی با گذشت زمان افزونه جمع میکند، و هر افزونه CSS و JS خودش را روی همه صفحهها بار میکند — حتی صفحههایی که هرگز از آن استفاده نمیکنند. فرم تماس روی صفحه اصلی بار میشود، اسلایدر روی صفحه تماس، و صفحهساز روی نوشتهای که با ویرایشگر عادی ساخته شده. هیچکس این را تصمیم نگرفته؛ یکییکی جمع شده است.
مشکل واقعی این نیست که کسی نمیداند این بد است. مشکل این است که نمیداند دقیقاً چه چیزی بار میشود. پس افزونه از همانجا شروع میکند: کلاس Asset_Scanner به wp_enqueue_scripts وصل میشود و فهرست کامل هر صفحه را به رابط مدیریت میدهد — شناسه، نوع، مسیر فایل، حجم فایل و نوع صفحههایی که در آنها دیده شده. اسکنر فقط درخواستهایی را ثبت میکند که کاربری با دسترسی مدیریت افزونه زده است، پس بازدید یک بازدیدکننده هرگز ردیفی نمینویسد.
هر قاعده یک جمله است: این شناسه، در این شرایط، بارگذاری نشود. شرطها عبارتاند از نوع محتوا، شناسه صفحه، قالب صفحه، بایگانیها، صفحه اصلی، نقش بازدیدکننده و دستگاه. قاعدهها از اولویت کوچک به بزرگ اجرا میشوند و آخرین قاعدهای که مطابقت کند برنده است — همین است که اجازه میدهد یک «همهجا خاموش» با یک «اما در برگه ۴۲ بماند» نرم شود. اگر چیزی که هنوز در صف است به یک شناسه وابسته باشد، آن شناسه حذف نمیشود؛ و حذف فقط dequeue است نه deregister، تا enqueue بعدی همان شناسه بیصدا شکست نخورد.
حالت آزمایشی پیشفرض روشن است. تا وقتی روشن است، قاعدهها فقط برای مدیران واردشده اعمال میشوند و بازدیدکننده سایت را دقیقاً مثل قبل میبیند. یعنی میتوانید هرقدر که میخواهید تهاجمی باشید و صفحههای مهم را قبل از اینکه چیزی به دست کسی برسد بررسی کنید. اگر صفحهای بههم ریخت هم، روشن کردن دوباره حالت آزمایشی سریعترین راه بازگشت است.
همهچیز ماژول است، و ماژولی که خاموش میکنید فقط پنهان نمیشود: رجیستری فقط نام کلاس را نگه میدارد نه نمونه ساختهشده، Module_Manager::is_active() اول گزینه ذخیرهشده را میخواند، و فایل ماژول اصلاً خوانده نمیشود. tests/unit/isolation-test.php این را با ماژولی که ساختهشدن خودش را میشمارد بررسی میکند، پس این ادعا نمیتواند بیسروصدا از کار بیفتد. CSS پنل هم با Tailwind و پیشوند hdmac- کامپایل شده، به .hd-mac محدود است و preflight آن خاموش است، پس هیچ استایلی از این افزونه به بقیه پیشخوان شما نمیرسد.
قبل
استایل فرم تماس روی صفحه اصلی بار میشود و اسکریپت اسلایدر روی صفحهای که اسلایدر ندارد.
بعد
همان فایل فقط جایی بار میشود که واقعاً لازم است.
قبل
میدانید سایت سنگین است. نمیدانید کدام شناسه مسئول آن است.
بعد
فهرست کامل، با شناسه، فایل، حجم و نوع صفحههایی که در آنها دیده شده.
قبل
برای حذف یک اسکریپت باید functions.php را دست بزنید و امیدوار باشید چیز دیگری نشکند.
بعد
قاعده را مینویسید، با حالت آزمایشی بررسی میکنید، بعد برای همه اعمالش میکنید.
فایل ZIP را از «افزونهها ← افزودن ← بارگذاری افزونه» نصب کنید. دو جدول ساخته میشود و ماژول بارگذاری شرطی از همان ابتدا روشن است.
در حالی که وارد شدهاید صفحه اصلی، یک نوشته، یک برگه و صفحه تماس را باز کنید. بعد در تب داراییها «بهروزرسانی» را بزنید تا فهرست پر شود.
کنار ردیفی که مطمئنید یک صفحه به آن نیاز ندارد «نوشتن قاعده» را بزنید، شرط را انتخاب کنید و ذخیره کنید. حالت آزمایشی هنوز روشن است، پس فعلاً فقط خودتان تفاوت را میبینید.
سایتهای وردپرسی که با گذشت زمان سنگین شدهاند · طراحان سایت و آژانسها · فروشگاههای ووکامرس · سایتهای ساختهشده با المنتور یا دیوی · سایتهای خبری و مجلهای · تیمهایی که پیشخوان را به مشتری تحویل میدهند · هر کسی که میخواهد پیش از خاموش کردن چیزی، ببیند دقیقاً چه چیزی روشن است.
سه ماژول رایگان و دو ماژول حرفهای، هر کدام پشت کلید خودش. آنچه روشن نکنید، اجرا نمیشود.
رجیستری نام کلاس را نگه میدارد نه نمونه ساختهشده، و بررسی فعال بودن اول گزینه ذخیرهشده را میخواند؛ پس فایل ماژول خاموش اصلاً خوانده نمیشود. tests/unit/isolation-test.php ساختهشدن کلاس را میشمارد تا این ادعا صادق بماند.
هر استایل و اسکریپتی که سایت در صف میگذارد، با شناسه، نوع، مسیر فایل، حجم فایل و نوع صفحههایی که در آنها دیده شده. فقط از بازدیدهای خودِ شما در حالت ورود ثبت میشود.
نوع محتوا، شناسه صفحه، قالب صفحه، بایگانیها، صفحه اصلی، نقش بازدیدکننده یا دستگاه. قاعدهها به ترتیب اولویت اجرا میشوند و آخرین مطابقت برنده است، پس یک استثنای باریک میتواند یک قاعده کلی را بشکند.
تا وقتی خاموشش نکنید، قاعدهها فقط برای مدیران واردشده اعمال میشوند. هیچ چیزی که امتحان کنید پیش از آنکه صفحههای مهم را دیده باشید به بازدیدکننده نمیرسد.
تا وقتی چیزی در صف به یک شناسه وابسته است، آن شناسه حذف نمیشود؛ و حذف فقط dequeue است نه deregister، تا enqueue بعدی همان شناسه بیصدا شکست نخورد.
فونتهای پیشفرض، مجموعه آیکونها، اسکریپتهای دیالوگ، فونتهای گوگل دیوی، ایموجی، wp-embed، jQuery Migrate و تگهای ژنراتور — هر کدام کلید خودش را دارد، نه یک کلید کلی.
المنتور برای هر صفحه یک ردیف CSS در wp_postmeta مینویسد و همانجا رها میکند. تعدادشان پیش از حذف نشان داده میشود، و المنتور در بازدید بعدی هرچه هنوز لازم دارد را دوباره میسازد.
wp-login.php را به آدرسی از خودتان منتقل کنید؛ هر کسی سراغ آدرس قدیمی برود به صفحه اصلی هدایت میشود. یک ثابت در wp-config.php آن را برمیگرداند، اگر خودتان بیرون ماندید.
تصمیم میگیرید هر نقش کدام منوهای اصلی را ببیند، و آنهایی که میماند چه نامی داشته باشند. منوی خود این افزونه هرگز پنهان نمیشود، وگرنه راهی برای بازگشت نمیماند.
لوگوی شما در صفحه ورود، نام شما در پاورقی پنل، حذف لوگوی وردپرس از نوار بالا و حذف تگهای ژنراتور از سورس صفحه.
گوگل تگ منیجر، ویجت گفتوگو یا هر تگ شخص ثالث دیگری را فقط روی صفحههایی که لازمش دارند بار کنید، آن هم بعد از اولین تعامل بازدیدکننده — یا حداکثر هشت ثانیه بعد، تا آمار صادق بماند.
Tailwind با پیشوند hdmac- کامپایل شده، به .hd-mac محدود است و preflight آن خاموش است. هیچ چیزی که این افزونه کامپایل میکند به عنصری بیرون از صفحههای خودش نمیرسد.
هفده فیلتر و هفت اکشن، هر کدام با یک نمونه کد کارکردنی در docs/hooks.md — از جمله ثبت ماژول خودتان و یاد دادن شرطی به موتور قاعده که هنوز نمیشناسد.
| امکان | توضیح | دارد |
|---|---|---|
| اسکن داراییهای هر صفحه | شناسه، نوع، مسیر فایل، حجم و نوع صفحهای که در آن دیده شده | |
| قاعده بر اساس نوع محتوا | برای هر post type ثبتشده در سایت | |
| قاعده بر اساس شناسه صفحه | یک برگه یا نوشته مشخص | |
| قاعده بر اساس قالب صفحه | از جمله صفحه ۴۰۴ و نتایج جستوجو | |
| قاعده روی بایگانیها | بایگانی دسته، برچسب و نوع محتوا | |
| قاعده روی صفحه اصلی | برای استایلهایی که فقط لندینگ لازم دارد | |
| قاعده بر اساس نقش کاربر | اسکریپتی که فقط برای کاربر واردشده معنی دارد | |
| قاعده بر اساس دستگاه | دسکتاپ یا موبایل | |
| اولویت و ترتیب اجرا | آخرین قاعدهای که مطابقت کند برنده است | |
| محافظ وابستگی | چیزی که هنوز در صف به آن وابسته است حذف نمیشود | |
| فقط dequeue، بدون deregister | تا enqueue بعدی همان شناسه بیصدا شکست نخورد | |
| حالت آزمایشی | قاعدهها فقط برای مدیران واردشده اعمال میشوند | |
| اسکنر فقط برای مدیر | بازدید یک بازدیدکننده هرگز در دیتابیس چیزی نمینویسد | |
| کش قاعدهها | یکبار در هر درخواست از transient خوانده میشود، نه از دیتابیس | |
| نگهداری گزارش مشاهده | پیشفرض ۳۰ روز، با یک فیلتر قابل تغییر | |
| حذف ایموجی و wp-embed | هر کدام کلید جداگانه | |
| حذف jQuery Migrate | برای سایتی که افزونه قدیمی ندارد | |
| فونت، آیکون و دیالوگ المنتور | سه کلید جداگانه، نه یک کلید کلی | |
| فونتهای گوگل دیوی | بدون دست زدن به فایلهای قالب | |
| حذف تگهای ژنراتور | نسخه وردپرس و صفحهساز از سورس صفحه | |
| شمارش و پاکسازی CSS تولیدشده | تعداد ردیفهای wp_postmeta پیش از حذف نشان داده میشود | |
| آدرس اختصاصی ورود | با راه بازگشت از طریق یک ثابت در wp-config.php | |
| منوهای پیشخوان بر اساس نقش | پنهان کردن و تغییر نام، برای هر نقش جداگانه | |
| وایتلیبل | لوگوی صفحه ورود، پاورقی پنل و حذف لوگوی وردپرس از نوار بالا | |
| اجرای شرطی اسکریپت | بعد از اولین تعامل بازدیدکننده یا حداکثر هشت ثانیه | |
| مالتیسایت | از جمله سایتهایی که بعد از فعالسازی به شبکه اضافه میشوند | |
| ترجمه کامل فارسی و پنل راستبهچپ | با شیوهنامه راستبهچپ اختصاصی پنل | |
| حذف داده فقط با اجازه صریح | گزینه حذف داده هنگام حذف افزونه، پیشفرض خاموش است |
| مورد | حداقل |
|---|---|
| وردپرس | ۶.۲ به بالا (تستشده تا ۶.۸) |
| PHP | ۸.۰ تا ۸.۳ |
| قالب | هر قالبی؛ افزونه فقط روی صفحههای پنل خودش CSS بار میکند |
| مالتیسایت | پشتیبانی میشود، از جمله سایتهایی که بعد از فعالسازی به شبکه اضافه میشوند |
| صفحهساز | المنتور یا دیوی، فقط اگر ماژول بهینهساز را میخواهید؛ بقیه افزونه به صفحهساز کاری ندارد |
سایتی که چند سال کار کرده و افزونه جمع کرده است. اگر سایت را هفته پیش با دو افزونه ساختهاید، خودتان میتوانید همه چیزی که بار میشود را نام ببرید و به این افزونه نیازی ندارید. جای این افزونه آنجاست که هیچکس در تیم با اطمینان نمیتواند بگوید کدام شناسه مسئول سنگینی است، و این جواب باید پیش از خاموش کردن چیزی پیدا شود. بیشترین استفاده را آژانسها میبرند، چون همین بررسی روی هر سایتی که تحویل میگیرند دوباره تکرار میشود.
در اصل بله، و محافظها دقیقاً برای همین هستند. حالت آزمایشی پیشفرض روشن است و قاعدهها را فقط روی مدیران واردشده اعمال میکند، پس اثر تغییر را پیش از بازدیدکننده میبینید. لودر تا وقتی چیزی در صف به یک شناسه وابسته است آن را حذف نمیکند، و فقط dequeue میکند نه deregister، تا enqueue بعدی همان شناسه بیصدا شکست نخورد. اگر باز هم صفحهای بههم ریخت، روشن کردن دوباره حالت آزمایشی بلافاصله همهچیز را برمیگرداند و بعد آخرین قاعده را حذف میکنید.
عدد صادقانهای برای دادن وجود ندارد، چون کاملاً بستگی دارد به اینکه سایت شما الان چه چیزی بار میکند و یک صفحه مشخص چقدر از آن را واقعاً لازم دارد. کاری که افزونه میکند این است که حجم فایل را کنار هر شناسه نشان میدهد و اجازه میدهد موارد مشخصی را حذف کنید، تا خودتان قبل و بعد را با هر ابزاری که به آن اعتماد دارید اندازه بگیرید. هر کسی بدون دیدن سایت شما درصدی به شما بدهد، حدس میزند.
بله. قاعدهها هنگام ساخته شدن صفحه ارزیابی میشوند، پس HTML کششده از همان اول نسخه سبکشده است. یک نکته که به هر افزونه کشی مربوط است و نه فقط به این یکی: اگر کش شما نسخههای جدا بر اساس نوع دستگاه نگه نمیدارد، از شرط «دستگاه» استفاده نکنید، چون نسخه اولین بازدیدکننده به همه سرو میشود.
یک فایل ZIP که همه ماژولها در آن است: بارگذاری شرطی داراییها با پنل کامل پایش و سازنده قاعده و حالت آزمایشی، بهینهساز المنتور و دیوی، شخصیسازی پیشخوان، وایتلیبل و اجرای شرطی اسکریپت. چیزی جدا دانلود نمیشود و هیچ ماژولی پشت یک بررسی قفل نشده؛ هر کدام کلید خودش را در تب ماژولها دارد و خودتان روشن و خاموشش میکنید.
این خط را به wp-config.php اضافه کنید: define( 'HD_MAC_DISABLE_LOGIN_SLUG', true ); و آدرس اصلی wp-login.php دوباره کار میکند. مدیر واردشده هم همیشه میتواند مستقیم به wp-login.php برود، که راه بازگشت دوم است. عادت خوب این است که آدرس جدید را در مرورگر دیگری تست کنید پیش از آنکه مرورگری را که با آن وارد شدهاید ببندید.
بهینهساز این دو را با نام هدف میگیرد، و صفحهسازها بین نسخهها نام شناسههایشان را عوض میکنند. بهجای اینکه منتظر بهروزرسانی افزونه بمانید، فهرست شناسههای پشت هر کلید با فیلتر hd_mac_builder_handles قابل تغییر است، پس شناسهای که نامش عوض شده در چند خط اضافه میشود. بارگذاری شرطی در هر حال تحت تأثیر نیست، چون از روی همان چیزی کار میکند که سایت شما واقعاً در صف گذاشته است.
بله، هر دو. فیلتر hd_mac_match_context شرطی را به موتور قاعده یاد میدهد که نمیشناسد — مثلاً یک بررسی is_woocommerce() — و از آن به بعد همهجا مثل شرطهای داخلی کار میکند. فیلتر hd_mac_register_modules یک کلاس را بهعنوان ماژول ثبت میکند و آن ماژول با کلید و تنظیمات خودش در تب ماژولها ظاهر میشود. docs/hooks.md برای هر دو یک نمونه کامل دارد.
هیچ، مگر خودتان خواسته باشید. گزینه «با حذف افزونه همه دادهها پاک شود» پیشفرض خاموش است، پس حذف و نصب دوباره قاعدههای شما را نگه میدارد. اگر روشنش کنید، حذف افزونه دو کلید تنظیمات، دو جدول، کارهای زمانبندیشده و ترنزینتها را برمیدارد — فهرستی کوتاه، و عمداً کوتاه.
رفع باگ افزونه، راهنمایی نصب و راهاندازی، و پاسخ به پرسشهای کاربردی. تصمیم درباره اینکه سایت شما بدون کدام شناسهها میتواند زندگی کند با خودتان است، نه یک درخواست پشتیبانی — پنل برای همین هست که آن تصمیم از روی شواهد گرفته شود. سفارشیسازی، توسعه امکانات جدید و مشکلاتی که از قالب یا افزونههای دیگر میآید جداگانه توافق میشود.