Acest ghid acoperă exclusiv tehnicile de optimizare viteză WooCommerce care nu se aplică pe un site WordPress obișnuit — problemele specifice magazinelor online: AJAX cart fragments, sesiuni care umflă baza de date, Action Scheduler, cache exclusions pe checkout și HPOS. Pentru fundamentele generale de optimizare WordPress (hosting, Redis, CDN, WebP, Core Web Vitals, compresie), vezi ghidul complet de optimizare site WordPress — acele tehnici sunt prerequisit, nu le duplicăm aici.
Un magazin WooCommerce standard, fără optimizare, încarcă în 4-7 secunde pe mobil — suficient cât să pierzi 53% din vizitatori (date Google, 2023). WooCommerce adaugă complexitate semnificativă față de un WordPress obișnuit: AJAX cart fragments pe fiecare pagină, mii de transienți specifici în baza de date, query-uri grele pentru produse variabile și sesiuni per vizitator. Toate tehnicile sunt testate pe WooCommerce 9.x cu HPOS activ, PHP 8.2+, pe proiecte livrate de Creative Side.
Tehnici generale aplicate pe WooCommerce
Înainte de tehnicile specifice de mai jos, asigură-te că ai fundamentele la punct:
Cu fundamentele în loc, iată cele 8 tehnici care contează doar pe WooCommerce.
1. Dezactivează Cart Fragments AJAX pe paginile non-shop
Cart fragments este singurul cel mai mare ucigaș de performanță WooCommerce. Scriptul wc-cart-fragments face un request AJAX la fiecare încărcare de pagină — inclusiv pe blog, homepage și pagini de prezentare — ca să actualizeze iconița de coș din header. Pe un site fără caching, acest request adaugă 0.5-1.5 secunde la fiecare pagină.
De ce e specific WooCommerce
Acest script nu există pe WordPress fără WooCommerce. E încărcat automat de WooCommerce pe toate paginile frontendului, indiferent dacă pagina are legătură cu shop-ul sau nu. Pe magazine cu 500+ vizitatori simultani, cart fragments generează 500-1.500 request-uri AJAX inutile pe minut.
Fix
add_action('wp_enqueue_scripts', function () {
if (!is_cart() && !is_checkout() && !is_product() && !is_shop() && !is_product_category()) {
wp_dequeue_script('wc-cart-fragments');
}
}, 100);
Alternativă pentru magazine care au nevoie de cart counter global
Dacă ai nevoie de cart counter pe toate paginile (un badge cu numărul de produse în coș), înlocuiește cart fragments cu un mini-cart static generat server-side:
// Înlocuiește cart fragments cu un endpoint REST lightweight
add_action('wp_enqueue_scripts', function () {
if (!is_cart() && !is_checkout()) {
wp_dequeue_script('wc-cart-fragments');
}
}, 100);
// Mini-cart count via REST API (apelat la 'added_to_cart' JS event)
add_action('rest_api_init', function () {
register_rest_route('cs/v1', '/cart-count', [
'methods' => 'GET',
'callback' => function () {
return ['count' => WC()->cart ? WC()->cart->get_cart_contents_count() : 0];
},
'permission_callback' => '__return_true',
]);
});
Acest approach elimină request-ul AJAX la page load și face request doar când utilizatorul adaugă un produs — reducere de la 100% din pageviews la ~2-5%.
Benchmark: Pe un magazin cu 8.000 vizite/zi, dezactivarea cart fragments a redus request-urile AJAX cu 7.200/zi și a scăzut TTFB-ul pe paginile non-shop de la 1.8s la 0.6s.
2. Curățare sesiuni WooCommerce expirate
WooCommerce creează o sesiune în baza de date pentru fiecare vizitator — inclusiv bots, crawlere și scanere de securitate. Tabela wp_woocommerce_sessions crește nelimitat dacă nu e curățată. Am văzut magazine cu 200.000+ sesiuni expirate care adăugau 500ms la fiecare query.
De ce se acumulează
WooCommerce are un cron job intern de curățare (woocommerce_cleanup_sessions), dar pe hosting-uri fără cron real (wp-cron bazat pe trafic), nu rulează consistent. Pe magazine cu trafic intermitent (mult ziua, zero noaptea), sesiunile se acumulează mai repede decât se curăță.
Diagnostic
-- Numără sesiuni expirate
SELECT COUNT() FROM wp_woocommerce_sessions
WHERE session_expiry < UNIX_TIMESTAMP();
-- Dimensiunea totală a tabelei
SELECT
ROUND(data_length / 1024 / 1024, 2) AS data_mb,
ROUND(index_length / 1024 / 1024, 2) AS index_mb,
table_rows
FROM information_schema.tables
WHERE table_name = 'wp_woocommerce_sessions';
Dacă tabela depășește 50MB sau are peste 50.000 rânduri expirate, curățarea are impact vizibil.
Fix: curățare programată forțată
add_action('init', function () {
if (!wp_next_scheduled('cs_cleanup_wc_sessions')) {
wp_schedule_event(time(), 'twicedaily', 'cs_cleanup_wc_sessions');
}
});
add_action('cs_cleanup_wc_sessions', function () {
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
time()
)
);
});
Edge case: magazine cu 10.000+ vizitatori zilnici
Pe magazine cu trafic mare, curățarea twicedaily poate nu e suficientă. Adaugă un cron system-level (nu wp-cron) care rulează la fiecare oră:
# crontab -e
0 cd /var/www/html && wp wc session cleanup --allow-root > /dev/null 2>&1
Benchmark: Pe un magazin cu 12.000 vizite/zi, tabela de sesiuni crescuse la 340MB cu 890.000 rânduri. După curățare, tabela a scăzut la 8MB. TTFB pe paginile de produs a scăzut de la 1.4s la 0.7s (înainte de alte optimizări).
3. Curățare Action Scheduler (log-uri WooCommerce)
WooCommerce folosește Action Scheduler ca sistem intern de cron — gestionează email-uri, sincronizări de stoc, procesare de comenzi, webhook-uri și analytics. Tabela wp_actionscheduler_actions crește cu 10.000-50.000 rânduri pe lună pe magazine active. Pe un magazin cu 2+ ani de operare, această tabelă poate conține 500.000+ rânduri.
Diagnostic
-- Contorizează acțiuni per status
SELECT status, COUNT() as total
FROM wp_actionscheduler_actions
GROUP BY status;
-- Dimensiunea tabelei
SELECT
ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb,
table_rows
FROM information_schema.tables
WHERE table_name = 'wp_actionscheduler_actions';
Acțiunile cu status complete și failed pot fi șterse în siguranță. Cele cu status pending sunt programate și nu trebuie atinse.
Fix: reduce retenția
// Schimbă retenția de la 30 zile (default) la 7 zile
add_filter('woocommerce_delete_completed_actions_after', function () {
return DAY_IN_SECONDS 7;
});
Fix agresiv pentru magazine cu tabel umflată (500.000+ rânduri)
Curăță manual din WP-CLI sau direct din SQL:
# Din WP-CLI - șterge acțiuni complete mai vechi de 7 zile
wp action-scheduler clean --batch-size=1000 --status=complete
-- Curățare directă SQL (backup obligatoriu înainte)
DELETE FROM wp_actionscheduler_actions
WHERE status IN ('complete', 'failed')
AND scheduled_date_gmt < DATE_SUB(NOW(), INTERVAL 7 DAY)
LIMIT 50000;
-- Rulează de mai multe ori dacă ai sute de mii de rânduri (în batch-uri de 50k)
Benchmark: Pe un magazin cu 680.000 acțiuni completate (tabel de 420MB), curățarea a redus tabela la 12MB. Query-urile WooCommerce Analytics care citeau din wp_actionscheduler_actions s-au redus de la 3.2s la 0.1s.
4. Cache exclusions specifice WooCommerce
Paginile de cart, checkout și my-account conțin date specifice utilizatorului (conținut coș, sesiune de plată, istoric comenzi) și nu pot fi cached. Dacă le cachezi, vizitatorul A vede coșul vizitatorului B. Dar paginile de produs, categorie și shop pot și trebuie cached agresiv.
Reguli de excludere pentru WP Rocket
// Settings → WP Rocket → Advanced Rules → Never Cache URLs
/cart/(.)
/checkout/(.)
/my-account/(.)
/wishlist/(.)
// Never Cache Cookies
woocommerce_cart_hash
woocommerce_items_in_cart
wp_woocommerce_session_(.)
Reguli de excludere pentru LiteSpeed Cache
// LiteSpeed Cache → Cache → Excludes → Do Not Cache URIs
/cart/
/checkout/
/my-account/
/wishlist/
// LiteSpeed Cache → Cache → Excludes → Do Not Cache Cookies
woocommerce_cart_hash
woocommerce_items_in_cart
ESI (Edge Side Includes) pe checkout
Checkout-ul complet nu poate fi cached, dar secțiunile statice (header, footer, terms & conditions) pot fi servite din cache. LiteSpeed Cache suportă ESI nativ:
// Activează ESI în LiteSpeed Cache → General → ESI
// Header-ul și footer-ul se servesc din ESI cache
// Body-ul checkout-ului se generează dinamic per user
do_action('litespeed_control_set_nocache');
Edge case: magazine cu geolocation-based pricing
Dacă folosești prețuri bazate pe locație (WooCommerce Multilingual sau plugin de geolocation), trebuie să variezi cache-ul pe țară. În LiteSpeed Cache, adaugă cookie-ul de geolocation la „Vary Cookie":
wc_geo_country
Benchmark: Configurarea corectă a cache exclusions pe un magazin cu LiteSpeed a crescut hit rate-ul de cache de la 45% la 87%. Paginile de produs se servesc din cache în 80ms în loc de 1.2s.
5. Încărcare asincronă a variațiilor (AJAX Variation Loading)
Produsele variabile (mărime, culoare, material) generează un JSON cu toate combinațiile posibile de variații la page load. Un produs cu 3 atribute x 10 valori fiecare = 1.000 combinații = JSON de 200-500KB. Pe magazine cu produse textile (4-5 atribute per produs), acest JSON poate ajunge la 1MB per pagină de produs.
Fix: pragul de AJAX variation loading
// Peste 10 variații, încarcă via AJAX la selecție (default WooCommerce: 30)
add_filter('woocommerce_ajax_variation_threshold', function () {
return 10;
});
Valoare implicită: 30. La produse complexe cu 50+ variații, redu la 10 sau chiar 5. Utilizatorul selectează primul atribut, și doar variațiile relevante se încarcă via AJAX.
Edge case: magazine cu 10.000+ produse variabile
Pe magazine fashion cu 5.000+ produse variabile, impactul cumulat e enorm. Un produs cu 80 variații trimite ~400KB JSON. Pe o pagină de categorie cu 24 produse variabile (chiar dacă nu afișezi variațiile), WooCommerce pre-procesează datele. Soluția suplimentară:
// Dezactivează preload variații pe paginile de categorie/shop
add_filter('woocommerce_product_get_default_attributes', function ($defaults, $product) {
if (is_shop() || is_product_category() || is_product_tag()) {
return [];
}
return $defaults;
}, 10, 2);
Benchmark: Pe un magazin de fashion cu 3.200 produse variabile (media 45 variații/produs), reducerea threshold-ului la 10 a scăzut dimensiunea paginii de produs de la 1.8MB la 320KB. Time to Interactive a scăzut de la 6.2s la 2.8s pe mobil.
6. Dezactivare Heartbeat API pe frontend
WordPress Heartbeat API face request-uri AJAX la fiecare 15-60 secunde. Pe frontend, e complet inutil pentru un magazin online — consumă resurse server fără niciun beneficiu.
Fix
add_action('init', function () {
// Dezactivează complet pe frontend
if (!is_admin()) {
wp_deregister_script('heartbeat');
}
});
// Reduce frecvența în admin (de la 15s la 60s) pentru a nu afecta autosave
add_filter('heartbeat_settings', function ($settings) {
$settings['interval'] = 60;
return $settings;
});
De ce contează pe WooCommerce mai mult decât pe WordPress simplu
Un site de prezentare are vizite scurte (2-3 minute). Un magazin online are vizite lungi — utilizatorul navighează 10-20 minute, compară produse, citește review-uri. În acele 20 de minute, Heartbeat face 20-80 request-uri AJAX per tab deschis. Pe un magazin cu 500 vizitatori simultani, asta înseamnă 10.000-40.000 request-uri inutile pe minut.
Benchmark: Pe un magazin cu 800 vizitatori simultani la ora de vârf, dezactivarea Heartbeat pe frontend a redus request-urile AJAX cu ~65% și a eliberat 2 PHP workers care erau constant ocupați cu Heartbeat.
7. Dezactivare WooCommerce scripts/styles pe paginile non-shop
WooCommerce încarcă CSS și JS pe fiecare pagină a site-ului — blog, Despre noi, Contact, portfolio. Pe un site cu 50% conținut non-shop, asta înseamnă CSS/JS inutil pe jumătate din pagini.
Fix: dequeue selectiv
add_action('wp_enqueue_scripts', function () {
if (!is_woocommerce() && !is_cart() && !is_checkout() && !is_account_page()) {
// Dezactivează WooCommerce CSS
wp_dequeue_style('woocommerce-general');
wp_dequeue_style('woocommerce-layout');
wp_dequeue_style('woocommerce-smallscreen');
wp_dequeue_style('wc-blocks-style');
wp_dequeue_style('wc-blocks-vendors-style');
// Dezactivează WooCommerce JS
wp_dequeue_script('wc-add-to-cart');
wp_dequeue_script('wc-cart-fragments');
wp_dequeue_script('woocommerce');
wp_dequeue_script('jquery-blockui');
wp_dequeue_script('jquery-cookie');
wp_dequeue_script('wc-add-to-cart-variation');
wp_dequeue_script('wc-single-product');
}
}, 99);
Edge case: teme care folosesc WooCommerce CSS pe non-shop pages
Unele teme (Astra, OceanWP) reutilizează clase CSS WooCommerce pe paginile non-shop (ex: .woocommerce-message pentru notificări). Dacă dequeue-ul sparge layout-ul pe alte pagini, adaugă excepții:
// Excepție pentru pagini care folosesc WooCommerce shortcodes
if (!is_woocommerce() && !is_cart() && !is_checkout() && !is_account_page()
&& !has_shortcode(get_post()->post_content ?? '', 'products')
&& !has_shortcode(get_post()->post_content ?? '', 'recent_products')) {
// dequeue aici
}
Benchmark: Pe un magazin cu 120 pagini (40 pagini shop + 80 pagini conținut), dequeue-ul WooCommerce assets a eliminat 6 fișiere CSS și 5 fișiere JS de pe paginile non-shop. Reducere: 180KB mai puțin de descărcat, 4 request-uri HTTP în minus. PageSpeed mobile pe pagina Blog a crescut de la 72 la 91.
8. HPOS (High-Performance Order Storage)
HPOS este noul sistem de stocare a comenzilor în WooCommerce 9.x — mută comenzile din tabela wp_posts (partajată cu articole, pagini, produse, attachment-uri) într-o tabelă dedicată wp_wc_orders. Rezultatul: query-uri de comenzi izolate de restul conținutului, cu indexare optimizată.
De ce contează
Tabela wp_posts pe un magazin matur conține: 5.000 produse + 50.000 comenzi + 200.000 attachment-uri + 10.000 articole/pagini = 265.000 rânduri. Query-urile pentru comenzi trebuie să filtreze prin toate aceste rânduri. Cu HPOS, comenzile au tabelă proprie cu indexare dedicată.
Activare
WooCommerce → Settings → Advanced → Features → „Order data storage" = „High-Performance Order Storage".
Ce trebuie verificat înainte de activare
wp_posts și în wp_wc_orders. Dezactivează după ce ai confirmat că totul funcționează (compatibility mode dublează write-urile).Cod HPOS-compatible pentru plugin-uri custom
Dacă ai plugin-uri custom care accesează comenzile, trebuie migrate de la get_post_meta() la API-ul HPOS:
// Vechi (pre-HPOS) - NU mai funcționează cu HPOS activ
$order_total = get_post_meta($order_id, '_order_total', true);
// Nou (HPOS-compatible)
$order = wc_get_order($order_id);
$order_total = $order->get_total();
// Query comenzi - vechi
$orders = get_posts([
'post_type' => 'shop_order',
'post_status' => 'wc-completed',
'meta_key' => '_billing_email',
'meta_value' => 'client@email.com',
]);
// Query comenzi - HPOS-compatible
$orders = wc_get_orders([
'status' => 'completed',
'billing_email' => 'client@email.com',
'limit' => -1,
]);
Benchmark: Pe un magazin cu 80.000 comenzi istorice și 5.000 produse:
wc_get_orders() pe 1.000 comenzi: de la 1.8s la 0.15sMagazinul tău WooCommerce încarcă în peste 3 secunde? Creative Side auditează și optimizează magazine WooCommerce — rezultate măsurabile pe fiecare metrică.
Rezultate agregate: înainte și după
Rezultate de pe un magazin WooCommerce real cu 3.200 produse variabile, 80.000 comenzi, pe VPS cu LiteSpeed + Redis, după aplicarea tuturor celor 8 tehnici:
| Metrică | Înainte | După | Tehnici principale |
|---|---|---|---|
| TTFB pagină produs | 2.3s | 0.4s | Redis + HPOS + sesiuni cleanup |
| TTFB pagină blog (non-shop) | 1.8s | 0.3s | Cart fragments off + dequeue assets |
| Query-uri SQL / pagină produs | 340 | 18 | Redis + HPOS + variation threshold |
| Request-uri AJAX / minut (500 vizitatori) | 2.800 | 180 | Cart fragments off + Heartbeat off |
| Total page size (produs) | 1.8MB | 320KB | Dequeue assets + variation AJAX |
| PageSpeed Mobile (homepage) | 28 | 87 | Toate cele de mai sus |
Întrebări frecvente
WooCommerce e prea lent pentru magazine mari?
Nu. WooCommerce gestionează magazine cu 100.000+ produse și milioane de comenzi — dar nu pe shared hosting cu zero optimizare. Cu HPOS activ, Redis, CDN și caching corect configurat, WooCommerce e competitiv cu orice platformă SaaS. Diferența e că trebuie configurat manual, nu vine optimizat din cutie.
Cât costă optimizarea unui magazin WooCommerce?
Un audit complet de performanță cu implementare (caching, Redis, CDN, curățare bază de date, dequeue assets, HPOS) costă între 3.000 și 8.000 lei în funcție de complexitate. Investiția se recuperează din creșterea ratei de conversie — un magazin care încarcă în 2s în loc de 5s convertește cu 20-30% mai mult (detalii prețuri).
WP Rocket sau LiteSpeed Cache pentru WooCommerce?
Dacă serverul rulează LiteSpeed sau OpenLiteSpeed, folosește LiteSpeed Cache — e gratuit și se integrează nativ cu serverul, inclusiv ESI pe checkout. Dacă serverul e Apache sau Nginx, WP Rocket e cel mai simplu de configurat pentru WooCommerce, cu reguli de excludere pre-configurate pentru cart/checkout.
Trebuie să aplic toate 8 tehnicile?
Nu neapărat. Prioritizează în ordine de impact: (1) Cart Fragments, (2) HPOS, (3) cache exclusions, (4) sesiuni cleanup, (5) Action Scheduler, (6) dequeue assets, (7) variation threshold, (8) Heartbeat. Pe un magazin mic (sub 500 produse), tehnicile 5 și 7 au impact minimal. Pe un magazin mare (5.000+ produse, 100.000+ comenzi), toate 8 sunt necesare.
Următorul pas
Un magazin WooCommerce rapid vinde mai mult — fiecare 100ms câștigate din timpul de încărcare cresc conversiile cu 0.7% (date Amazon). Optimizarea nu e cost, e investiție cu return direct.
Dacă ai un magazin WooCommerce care încarcă în peste 3 secunde, echipa Creative Side îl poate aduce sub 2 secunde cu un pachet complet de optimizare — cele 8 tehnici de mai sus plus fundamentele din ghidul general.
Solicită optimizare WooCommerce — audit + implementare cu rezultate garantate