<?php
// Dezactivează numărarea produselor în widget-urile de categorii pentru a evita query-uri grele
add_filter( 'woocommerce_product_reorder_requires_block_templates', '__return_false' );
add_filter( 'woocommerce_layered_nav_count', '__return_false' );
add_filter( 'woocommerce_rating_filter_count', '__return_false' );
// Oprește generarea de transient-uri inutile pentru numărarea categoriilor
add_filter( 'woocommerce_product_loop_start', function( $ob ) {
wp_defer_term_counting( true );
return $ob;
});WooCommerce e un monstru greu de stăpânit când baza de date începe să crească. Am avut de curând un magazin cu peste 15.000 de produse și vreo 80 de pluginuri active (clasic clientului român care vrea absolut orice funcționalitate mică). Site-ul se încărca în 6 secunde pe paginile de produs și murea complet în campaniile de promoții, chiar și pe un VPS destul de bunicel.
Am reușit să aducem timpul de încărcare sub 1.2 secunde pe mobil fără să facem upgrade la hosting. Vă povestesc mai jos exact cum am procedat, cu bune și cu rele.
Redis Object Cache: Salvarea bazei de date
WordPress face mii de interogări la baza de date pentru o singură pagină de produs. Multe dintre ele sunt repetitive: detalii despre taxonomie, atribute de produs, opțiuni de sistem. Aici intervine Redis. În loc ca MySQL să muncească la fiecare refresh, Redis ține aceste obiecte direct în memorie (RAM).
Am folosit pluginul Redis Object Cache în tandem cu un drop-in object-cache.php. Schimbarea a fost radicală: timpul de execuție al interogărilor a scăzut cu aproape 60%.
Dar vine și un trade-off sincer. Dacă ai pluginuri prost scrise (cum sunt unele module de curierat sau procesatoare de plată românești), acestea s-ar putea să nu folosească corect funcțiile WordPress precum wp_cache_set și wp_cache_delete. Am pățit ca un client să vadă în coș produsele altui utilizator pentru că sesiunile erau stocate greșit în cache-ul global. Trebuie să testezi intens fluxul de checkout după ce activezi Redis.
Cloudflare APO: TTFB de 80ms pentru vizitatori
Dacă nu folosești Cloudflare APO (Automatic Platform Optimization) pentru WordPress, pierzi enorm. Costă 5 dolari pe lună, dar face o magie: stochează paginile HTML direct pe serverele lor de tip edge. Practic, când un vizitator nou intră pe site, el nu mai atinge deloc serverul tău din România. Primește pagina gata randată din cel mai apropiat punct Cloudflare.
Timpul până la primul octet (TTFB) a scăzut de la 1.8 secunde la doar 80ms.
Limita majoră a acestei tehnologii? Merge brici doar pentru vizitatorii neautentificați. În momentul în care un client adaugă un produs în coș, WooCommerce setează cookie-ul woocommerce_items_in_cart. Cloudflare detectează acest cookie și dă bypass total la cache, trimițând toate cererile direct către serverul tău. Deci, APO te ajută enorm pe SEO și pe landing page-uri, dar checkout-ul tot pe spatele serverului tău rămâne.
Curățenia din wp_options și query-urile ucigașe
Cea mai mare problemă la WooCommerce o reprezintă datele reziduale. Am găsit în tabela wp_options peste 1.2 GB de transient-uri expirate și sesiuni vechi de WooCommerce care nu se mai ștergeau din cauza unor erori de cron.
După ce am curățat acele tabele, am dezactivat o funcție nativă din WooCommerce care pur și simplu omoară baza de date pe magazinele mari: numărarea produselor din categorii pentru widget-urile de filtrare. Chestia aia rulează un query uriaș cu JOIN pe zeci de mii de rânduri doar ca să afișeze textul „Pantaloni (45)” în sidebar. Am oprit acest comportament din cod.
Voi cum gestionați cache-ul pe WooCommerce? Mergeți pe Redis sau preferați ceva mai simplu direct în fișiere, cum e WP Rocket?