Shortcode pentru WooCommerce este lent

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?

1 Like

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.

1 Like

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

1 Like

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

1 Like

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:

  1. sa ascunzi problema crescand valoarea timeoutului — va duce la o incarcare greoaie a aplicatiei in conditii de productie
  2. 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.

2 Likes

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
1 Like

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.