Salut! Am o problema cu site-ul meu cu WordPress cu WooCommerce.
Nu pot introduce shortcode pentru a afisa produse.
Daca introduc in pagina un shortcode de produse si salvez, dureaza foarte mult pana se salveaza iar cand intru in pagina, tot asa, se incarca greu si nu se afiseaza produsele.
Am incercat sa schimb tema, degeaba.
Nu primesc erori si nu stiu ce sa fac. Ma poate ajuta cineva cu un sfat?
Te uiți în logs, vezi dacă apare vreo eroare. Dacă apare, vezi cum faci să le rezolvi pe alea.
Apoi dezactivezi toate pluginurile și încearci tema default.
Dacă merge, începi să activezi câte un plugin, testezi, activezi încă un plugin, iar testezi etc.
in logs nu e nimic
Daca dezactivez un anumit plugin, functioneaza. Am testat si pe un site de test cu acel plugin si functioneaza.
Este posibil sa fie o problema la produsele mele din site? O fi o problema din baza de date? Am 5000 de produse in site
Am gasit ceva
[04-Aug-2022 11:08:30 UTC] Eroare bază de date WordPress MySQL server has gone away pentru interogarea
SELECT wp_posts.ID
FROM wp_posts LEFT JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) LEFT JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id AND mt1.meta_key = 'shop_manager_hide_product' ) LEFT JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id ) LEFT JOIN wp_postmeta AS mt3 ON ( wp_posts.ID = mt3.post_id AND mt3.meta_key = 'shop_manager_hide_product' ) LEFT JOIN wp_postmeta AS mt4 ON ( wp_posts.ID = mt4.post_id )
WHERE 1=1 AND (
wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (7,9)
)
AND
wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (12075)
)
) AND (
wp_postmeta.meta_key = 'total_sales'
AND
(
(
mt1.post_id IS NULL
OR
( mt2.meta_key = 'shop_manager_hide_product' AND mt2.meta_value = 'no' )
)
AND
(
mt3.post_id IS NULL
OR
( mt4.meta_key = 'shop_manager_hide_product' AND mt4.meta_value = 'no' )
)
)
) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value+0 DESC
LIMIT 0, 8
efectuată de require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/shoptimizer/404.php'), shoptimizer_404_template, do_action('shoptimizer_404_template'), WP_Hook->do_action, WP_Hook->apply_filters, shoptimizer_entry_content_404_page_template, get_template_part, locate_template, load_template, require('/themes/shoptimizer/content-404.php'), shoptimizer_do_shortcode, WC_Shortcodes::best_selling_products, WC_Shortcode_Products->get_content, WC_Shortcode_Products->product_loop, WC_Shortcode_Products->get_query_results, WP_Query->__construct, WP_Query->query, WP_Query->get_posts
ruleaza query-ul de mai sus intr-un client de mysql si vezi cat dureaza.
este o erare de timeout si mysql a inchis conexiunea
https://dev.mysql.com/doc/refman/8.0/en/gone-away.html
poti sa schimbi acesta durata
pe host #2006 - MySQL server has gone away
iar in localhost Showing rows 0 - 7 (8 total, Query took 49.0103 seconds.)
Este o problema de timeout pe host
Se poate modifica timeout-ul din config
sau vezi de ce face query-ul ala atata. ca nu e ok
Pt a afisa ceva in headerul siteului se face o interogare extrem de scumpa computational. Toate acele join-uri duc la incarcarea multor date (cand baza de date creste). Este posibil ca lical sa ai putine date, de acee sa primesti totusi rezultate.
Ai doua optiuni:
- sa ascunzi problema crescand valoarea timeoutului — va duce la o incarcare greoaie a aplicatiei in conditii de productie
- sa afli cauza si sa o remediezi; daca un plugin 3rd party e cauza, poate insemna ca ai nevoie sa cauti o solutie diferita
Sfat: pt a usura munca celor carora le ceri sfatul, e indicat sa folosesti un sql formatter, ca de ex acesta.
Dupa formatare vei observa ca se fac mult prea multe join-uri cu tabela wp_postmeta fara ca acestea sa aduca valoare prin folosirea altui criteriu (clauzele de ON sunt la fel. O explicatie sumara a left join.
In wp_postmeta sunt ~1,101,915 Rows
Cred ca aici este o problema, cand sau sa vad ultimele e gol, am dat de 10 ori in stanga si tot gol
Pe pagina 1759 se termina coloanele cu adevarat
si vorbeste cu cel care se ocupa daca chiarvai nevoie de acele 1.9 milione de randuri pt header
nu ma pricep la wordpress, dar vad ceva cu header
not great, not terrible.
vezi daca tabelele au indecsii cum trebuie, da un explain la query-ul ala si vezi daca chiar se si folosesc indecsii. vezi si ce date sunt acolo si daca chiar e nevoie de toate, undeva probabil ca e ceva data hoarding.
WP este notoriu pentru modul în care măcelărește JOIN
-urile pentru meta_query
, prin urmare apar cinci join-uri în loc de unul-două.
Ce opțiuni sunt:
- deschizi un tichet la cei de unde ai luat tema
- cauți un om capabil să-ți optimizeze treaba asta
- schimbi tema
Iaca și SQL formatat.
SELECT wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'shop_manager_hide_product')
LEFT JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id)
LEFT JOIN wp_postmeta AS mt3 ON (wp_posts.ID = mt3.post_id AND mt3.meta_key = 'shop_manager_hide_product')
LEFT JOIN wp_postmeta AS mt4 ON (wp_posts.ID = mt4.post_id)
WHERE 1 = 1
AND (
wp_posts.ID NOT IN (SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (7, 9))
AND
wp_posts.ID NOT IN (SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (12075))
)
AND (
wp_postmeta.meta_key = 'total_sales'
AND
(
(
mt1.post_id IS NULL
OR
(mt2.meta_key = 'shop_manager_hide_product' AND mt2.meta_value = 'no')
)
AND
(
mt3.post_id IS NULL
OR
(mt4.meta_key = 'shop_manager_hide_product' AND mt4.meta_value = 'no')
)
)
)
AND wp_posts.post_type = 'product'
AND ((wp_posts.post_status = 'publish'))
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value + 0 DESC
LIMIT 0, 8
Ajuta dacă ai cache configurat in WordPress. O varianta de cache e la nivel de server web LiteSpeed (trebuie să aibă hostul acest server web și instalezi pluginul LiteSpeed Cache).
Un alt nivel de cache util e în Redis.
Găsești la noi pachete de hosting WordPress cu aceste tipuri de cache.