SDWSKi Cache. Плагін кешування для WordPress
проєкт
Плагін сторінкового кешу для WordPress із режимом інтернет-магазину. SDWSKi Cache віддає готові HTML-сторінки ще до завантаження WordPress, одразу зберігає їх у стисненому вигляді й коректно оминає кеш там, де сторінка залежить від конкретного відвідувача: кошик, особистий кабінет, коментарі, закриті записи.
Цей проєкт — це GPL-плагін сторінкового кешу, написаний на основі стандартних правил кешування в системі WordPress: основу принципів кешування збережено, а ядро віддачі, режим WooCommerce, інтерфейс і захист від конфліктів написано повністю з нуля.
Завдання
Стандартні кеш-плагіни добре працюють на блогах і погано — у магазинах. Типові проблеми, які я хотів розв’язати:
- до кешу потрапляє сторінка з чужим лічильником кошика;
- у картці товару залишається старий залишок;
- багатомовний сайт віддає відвідувачу сторінку не його мовою;
- у разі збою оптимізації (мініфікація, об’єднання файлів) користувач бачить порожній екран;
- в адмінці повно реклами та посилань на сторонній сайт.
Архітектура
Плагін складається з трьох рівнів, кожен із яких виконує свою частину завдання.
1. Завантажувач (sdwski-cache.php). Вирішує лише одне: чи можна запускати рушій. Якщо на сайті вже активний оригінальний плагін або інша копія, завантажувач нічого не підключає, не реєструє хуки та показує сповіщення з кнопкою «Вимкнути й запустити». Усі класи, функції та константи рушія мають власні префікси, тому помилки на кшталт «Cannot redeclare» виключені, у якому б порядку WordPress не завантажив плагіни.
2. Рушій (sdwski-engine.php, inc/). Класичний рівень: генерування й очищення кешу, мініфікація та об’єднання CSS/JS, попереднє завантаження, правила виключень, CDN (зокрема Cloudflare), очищення Varnish, модуль безпеки, планувальник очищення, WP-CLI. Тут також перехоплюється виведення сторінки через буфер виведення.
3. Turbo-рівень (inc/turbo/). Мій основний внесок. Це drop-in advanced-cache.php, який WordPress підключає раніше за тему та плагіни, і ядро turbo-core.php, яке керує його налаштуваннями, станом і очищенням.
Як працює віддавання з drop-in
Порядок перевірок у advanced-cache.php побудовано так, щоб за будь-якого сумніву передати запит WordPress:
- Обробляються лише запити
GET. - Запити бота попереднього завантаження завжди спрямовуються до WordPress, щоб сторінку було створено або оновлено.
- Хост і схема (http/https) мають збігатися з адресою сайту, що охоплює варіанти з
wwwі без нього. - Якщо в cookie є ознаки авторизованого користувача, коментатора, захищеного паролем запису або сесії магазину, відвідувач отримує живу сторінку. Список можна розширити власними назвами cookie.
- Лише після цього виконується пошук готового файлу в кеші.
Якщо файл знайдено, відповідь формується без запуску WordPress. У заголовках передаються Vary: Accept-Encoding, ETag і X-ruzi-Turbo: HIT, який зручно перевіряти в браузері або через curl -I.
Попередньо стиснені копії та умовні запити
Стиснення виконується один раз під час створення сторінки, а не за кожного запиту. Поруч із index.html розташовані index.html.gz і, якщо на сервері є розширення brotli, index.html.br. Drop-in перевіряє заголовок Accept-Encoding і віддає відповідний варіант. На умовний запит зі збігом ETag відповідає 304 без читання файлу.
Під час очищення кешу видаляються всі варіанти сторінки: звичайний, gzip і brotli, а також посторінкова навігація та копії за мовами. Це захищає від «осиротілих» стиснених файлів, які інакше пережили б видалену сторінку.
Режим інтернет-магазину (WooCommerce)
Найбільш об’ємна частина роботи. Правила дублюються на трьох рівнях: у .htaccess, у drop-in і в рушії, тому захист не залежить від одного перемикача.
| Завдання | Рішення |
|---|---|
| Чужий кошик у кеші | Відвідувач із товарами в кошику або сесією магазину завжди отримує актуальну сторінку, його запит не створює спільний кеш |
| Кошик, оформлення замовлення, кабінет | Ці сторінки взагалі не кешуються |
| Застарілі залишок і ціна | Зміна товару, залишку, ціни, статусу або замовлення очищає кеш. Режим за замовчуванням: увесь кеш. Працюють хуки woocommerce_update_product, woocommerce_order_status_changed і transition_post_status |
| Імпорти в обхід WooCommerce | Максимальний вік кешу, за замовчуванням 3 години |
| Лічильник кошика в шапці | У кеші завжди нуль, фактичне число підставляється невеликим скриптом за заданим CSS-класом. На сервері скидання до нуля розпізнає також формати «(3)», «3 шт.» |
| Залишок у картці | Рядок залишку запитується заново під час кожного перегляду сторінки товару та каталогу |
| Мінікошик | Блок повністю оновлюється через фрагменти WooCommerce |
| Ціни, що залежать від валюти або групи | Необов’язковий режим «без кешу» для таких сторінок |
Усі налаштування магазину винесено на окрему вкладку «WooCommerce». Класи елементів можна вводити без крапки, наприклад cart-count.
Многоязычность
Кеш ведеться окремо для кожної мови, тому відвідувач з англійською версією не отримає кеш російської, і навпаки. Плагін SDWSKi Cache сумісний із плагінами багатомовності. Насамперед 100% гарантована сумісність із плагіном ШІ-перекладу SDWSKi Перекласти.
Відмовостійкість
- Відкат у разі збою оптимізації. Callback output buffer захищений: якщо мініфікація або об'єднання файлів завершилися помилкою, повертається початкова сторінка.
- Drop-in можна видалити будь-коли. Тоді WordPress просто продовжує працювати як зазвичай, про це сказано в самому заголовку файлу.
- Сторінка статусу Turbo показує за пунктами, чи все налаштовано: drop-in, права,
.htaccess, доступність brotli. - Безпечне видалення. Плагін не видаляє спільні дані, доки на сайті залишається інша копія рушія.
Що ще є всередині
Попереднє завантаження кешу за розкладом через WP-Cron, мініфікація HTML/CSS/JS, об’єднання файлів, відкладене завантаження зображень, правила винятків, очищення кешу окремих сторінок, налаштування для Nginx і Varnish, інтеграції з CDN, кешування у браузері, вимкнення emoji, WP-CLI. Інтерфейс і докладну вкладку «Інструкція» перекладено російською.
Стек
PHP, WordPress Plugin API (хуки, WP-Cron, output buffering, drop-in advanced-cache.php), правила Apache .htaccess, JavaScript і CSS для адмінінтерфейсу та «живих» елементів магазину, gettext (.pot, .po, .mo) для локалізації.
Встановлення
- Скопіюйте папку
sdwski-cacheу/wp-content/plugins/та активуйте плагін. - У меню «SDWSKi Cache» увімкніть «Cache System» і збережіть.
- Відкрийте «Налаштування → SDWSKi Cache: Turbo» і переконайтеся, що всі пункти статусу зелені.
- Перевірте результат: відкрийте сторінку в приватному вікні та знайдіть заголовок
X-ruzi-Turbo: HIT.
История версий
- 1.5.3-turbo.10 — окрема вкладка WooCommerce, «живий» залишок, «живий» мінікошик.
- 1.5.3-turbo.9 — захист кошика та залишків тепер завжди ввімкнено за активного WooCommerce, очищення кешу за будь-яких змін товару й замовлення, максимальний вік кешу — 3 години.
- 1.5.3-turbo.8 — лічильник кошика підставляється скриптом, виправлено збереження налаштувань режиму магазину.
- 1.5.3-turbo.2 — захист від конфлікту з оригінальним плагіном, власна папка, вкладка «Інструкція».
- 1.5.3-turbo.1 — режим магазину, drop-in, попередньо стиснені сторінки, ETag і 304, новий інтерфейс, рекламу видалено.
Ліцензія та походження
Проєкт поширюється на умовах GPLv2 або новішої версії. Він заснований на відкритому GPL-плагіні кешування сторінок: вихідний код належить його авторам, а мої зміни й доповнення оформлені окремо та описані вище.