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. Тут жа перахопліваецца вывад старонкі праз output buffer.
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 Перакласці.
Адмоваўстойлівасць
- Адкат пры збоі аптымізацыі. Буфер вываду зваротнага выкліку абаронены: калі мініфікацыя або аб'яднанне файлаў завяршыліся памылкай, вяртаецца зыходная старонка.
- 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-убудове кэшавання старонак: зыходны код належыць яго аўтарам, а мае змены і дапаўненні аформлены асобна і апісаны вышэй.