Pozor! Jakýkoliv neodborný zásah do databáze může mít fatální následky. Bez aktuální zálohy neprovádějte žádné úpravy!
Vystavujete se riziku, že poslední dostupná záloha na hostingu, která je obvykle vytvářena o půlnoci, nemusí obsahovat nejnovější obsah, objednávky ani jiná důležitá data. Mohli byste tak přijít o vše, co bylo změněno po poslední záloze!
WooCommerce využívá databázi WordPressu, přičemž všechny tabulky mají předponu (standardně „wp_“, lze však změnit). Databázová struktura zahrnuje jak standardní tabulky WordPressu (například posts, postmeta či comments), tak vlastní tabulky vytvořené pro potřeby e-shopu (např. pro správu objednávek, produktů, nastavení daní a dopravy). Tento článek poskytuje detailní přehled struktury, praktické příklady a doporučení, jak správně optimalizovat a udržovat databázi.
Všechny názvy databázových tabulek jsou uvedeny bez prefixu, standardně je to prefix wp_, to znamená, že tabulka se například nebude nazývat actionscheduler_actions, ale wp_actionscheduler_actions.
Hlavní tabulky a jejich popis
Níže uvedené shrnuti nejdůležitějších tabulek použití WooCommerce:
actionscheduler_actions: Plánované úlohy, které se vykonávají pomocí Action Scheduler, obdobně jako WP_Cron.
actionscheduler_claims: Obsahuje informace o dávkách akcí, které čekají na zpracování.
actionscheduler_groups: Skupiny plánovaných úloh.
actionscheduler_logs: Logy a protokoly událostí z Action Scheduleru.
woocommerce_sessions: Ukládá data uživatelských relací – obsah nákupního košíku, dočasné informace o uživatelích.
woocommerce_api_keys: Klíče pro REST API komunikaci s WooCommerce.
woocommerce_attribute_taxonomies: Definuje vlastnosti (atributy) produktů.
woocommerce_downloadable_product_permissions: Přístupová práva ke stažitelným produktům.
woocommerce_order_items: Jednotlivé položky objednávek (produkty, poplatky, doprava).
woocommerce_order_itemmeta: Metadata položek objednávek, např. množství, cena nebo unikátní klíče.
woocommerce_tax_rates: Daňové sazby nastavené v administraci.
woocommerce_tax_rate_locations: Lokace – PSČ, města spojené s danými sazbami.
woocommerce_shipping_zones: Doručovací zóny definované v administraci WooCommerce.
woocommerce_shipping_zone_locations: Lokace přiřazené jednotlivým doručovacím zónám.
woocommerce_shipping_zone_methods: Metody doručení navázané na jednotlivé zóny.
woocommerce_payment_tokens: Ukládá platební tokeny, např. pro uložení informací o platebních kartách.
woocommerce_payment_tokenmeta: Metadata příslušná k platebním tokenům.
woocommerce_log: Interní logy a sledování událostí v WooCommerce.
wc_webhooks: Webhooky registrované v nastavení WooCommerce (např. pro upozornění externích aplikací).
wc_download_log: Protokol stažení ke stažitelným produktům.
wc_product_meta_lookup: Indexuje vlastnosti produktů pro rychlejší vyhledávání (filtrace, řazení podle ceny, dostupnosti apod.).
wc_tax_rate_classes: Definice daňových tříd, které mohou ovlivňovat výpočet daní.
wc_reserved_stock: Rezervace položek na skladě, aby se předešlo konfliktům při paralelních objednávkách.
Ukládání objednávek a produktů
Objednávky
Objednávky jsou uloženy jako vlastní typ příspěvku (shop_order) a rozděleny mezi několik tabulek:
posts: Základní informace o objednávce (ID, datum, stav).
postmeta: Detailní metadata, například celková cena, adresa zákazníka nebo uživatelské informace.
woocommerce_order_items & woocommerce_order_itemmeta: Položky objednávky a jejich doplňková metadata (informace o jednotlivých produktech, množství, cenu za jednotku apod.).
comments: Ukládají se poznámky nebo interní komentáře ke konkrétní objednávce.
Produkty
Produkty jsou rovněž typem příspěvku a jejich data jsou rozdělena následovně:
posts: Základní informace – název, popis, stav publikace.
postmeta: Detailní nastavení produktu, jako cena, skladová dostupnost či vlastní atributy.
wc_product_meta_lookup: Optimalizovaný index pro rychlé vyhledávání a filtrování produktů dle jejich vlastností.
comments: Zde se ukládají recenze a hodnocení od zákazníků.
Chcete-li najít všechny produkty v tabulce wp_posts, můžete použít následující dotaz MySQL:
SELECT * FROM wp_posts WHERE post_type = 'product';
SQLChcete-li najít všechny zveřejněné produkty, můžete použít následující dotaz:
SELECT * FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish';
SQLUložení variant produktů v databázi
Ve WooCommerce je každý variabilní produkt zaznamenán jako standardní záznam v tabulce wp_posts
. Tento hlavní záznam slouží jako rodič pro své varianty. Jednotlivé varianty jsou rovněž uloženy v tabulce wp_posts
, ale s odlišným typem příspěvku (post_type
) nastaveným na 'product_variation'
. Propojení mezi hlavním produktem a jeho variantami je realizováno prostřednictvím sloupce post_parent
, který u variant odkazuje na ID rodičovského produktu.
Pro získání všech variant konkrétního produktu lze použít následující SQL dotaz:
/* Chcete-li najít všechny zveřejněné produkty, můžete použít následující dotaz */
SELECT * FROM wp_posts WHERE post_type = 'product_variation';
/* Pro získání všech variant konkrétního produktu lze použít následující SQL dotaz: */
SELECT * FROM wp_posts
WHERE post_parent = [ID_rodičovského_produktu]
AND post_type = 'product_variation';
SQLVe WooCommerce verze 9.0 a novějších se vztah mezi variabilním produktem a jeho variantami stále řídí sloupcem post_parent
v tabulce wp_posts
. Každá varianta produktu má v tomto sloupci uvedeno ID svého hlavního produktu, což vytváří hierarchii rodič-potomek. Tato struktura umožňuje efektivní organizaci a vyhledávání variant produktů ve vztahu k jejich hlavním produktům. Je důležité poznamenat, že s příchodem funkce High-Performance Order Storage (HPOS) ve verzi 9.0 byly zavedeny nové tabulky pro správu objednávek, avšak struktura ukládání produktů a jejich variant zůstala nezměněna.
Sloupce v tabulce wp_posts související s variantami produktů
post_parent
: Tento sloupec propojuje každou variantu s jejím hlavním produktem, což zajišťuje správné přiřazení variant na vašem WooCommerce webu.post_title
: Obsahuje název varianty produktu, který obvykle zahrnuje specifické atributy odlišující tuto variantu, jako je velikost nebo barva.post_status
: Určuje stav varianty produktu (např. ‚publish‘, ‚draft‘, ‚pending‘), což je důležité pro správu viditelnosti a dostupnosti jednotlivých variant.post_type
: Pro varianty produktů je nastaven na ‚product_variation‘, což je odlišuje od standardních produktů s typem ‚product‘.
Pro načtení všech variant konkrétního produktu můžete použít následující SQL dotaz:
SELECT * FROM wp_posts
WHERE post_parent = [ID_hlavního_produktu]
AND post_type = 'product_variation';
SQLUložení detailů variant produktu
Ve WooCommerce jsou podrobnosti o variantách produktů ukládány v tabulce wp_postmeta
, podobně jako hlavní data produktů. Každá varianta produktu, reprezentovaná záznamem v tabulce wp_posts
, má odpovídající záznamy v wp_postmeta
. Sloupec post_id
v wp_postmeta
odpovídá ID varianty produktu v wp_posts
, čímž se metadata přímo propojují s konkrétní variantou.
Pro načtení všech meta polí pro danou variantu můžete použít následující SQL dotaz:
SELECT * FROM wp_postmeta WHERE post_id = [ID_varianty];
SQLMetadata pro varianty produktů
Metadata pro varianty produktů obsahují podobná pole jako hlavní produkt, například _sku, total_sales, _price a další. Tyto meta pole hrají pro varianty podobnou roli jako pro standardní produkty a ukládají klíčové informace jako ceny, skladové jednotky a údaje o prodejích.
Jedinečným aspektem metadat variant produktů je ukládání atributů. Ve WooCommerce lze atributy definovat dvěma způsoby, což ovlivňuje jejich uložení v databázi:
- Atributy vytvořené přes Produkty > Atributy:
Když jsou atributy vytvořeny prostřednictvím sekce Produkty > Atributy v administraci, jsou zpracovány pomocí WordPress taxonomií. Odpovídající meta klíče pro tyto atributy v tabulce wp_postmeta mají předponu attribute_pa_. Například atribut pro barvu by byl uložen jako attribute_pa_barva. Tato předpona označuje, že atribut je globálně definovaný. - Atributy vytvořené na stránce úprav produktu > Atributy:
Pokud jsou atributy vytvořeny přímo na stránce úprav produktu, nejsou propojeny s globálními taxonomiemi. V tomto případě mají meta klíče jednoduše předponu attribute_. Například vlastní atribut jako ‚logo‘ by byl uložen jako attribute_logo. Tyto atributy jsou specifické pro jednotlivý produkt nebo variantu a nejsou sdíleny globálně.
Tento systém ukládání atributů zůstává konzistentní i ve WooCommerce 9.0 a vyšších verzích, což umožňuje efektivní správu a vyhledávání variant produktů v databázi.
Příklad načítání všech atributů varianty produktu:
/*Přidání podmínky post_status = 'publish' zajistí, že budou zahrnuty pouze publikované produkty, což výrazně zmenši množství zpracovávaných dat */
SELECT
p.ID as product_id,
p.post_title as product_name,
v.ID AS variation_id,
v.post_title as variation_name,
pm.meta_key AS attribute_name,
pm.meta_value AS attribute_value
FROM
wp_posts p
INNER JOIN
wp_posts v ON v.post_parent = p.ID AND v.post_type = 'product_variation'
INNER JOIN
wp_postmeta pm ON pm.post_id = v.ID AND pm.meta_key LIKE 'attribute_%'
WHERE
p.post_type = 'product'
AND p.post_status = 'publish'
SQL
Tento SQL dotaz extrahuje data o produktech WooCommerce, jejich variacích a atributech těchto variací:
- Získává základní informace o produktech (ID, název)
- Propojuje je s jejich variacemi (ID, název variace)
- Pro každou variaci vybírá její atributy (název atributu, hodnota atributu)
Dotaz je vytvořen tak, aby vracel jen publikované produkty, které mají alespoň jednu variaci s atributem.
Kde jsou uloženy typy produktů v databázi WooCommerce
Typy produktů v pluginu WooCommerce označují různé klasifikace produktů podle jejich funkcí a způsobu prodeje. Základní typy produktů WooCommerce zahrnují:
- Jednoduchý (Simple) – standardní, jednotlivé produkty
- Variabilní (Variable) – produkty s variantami jako velikost nebo barva
- Seskupený (Grouped) – kolekce souvisejících produktů, které lze zakoupit samostatně
- Externí/Affiliate – produkty prodávané na jiném webu, ale inzerované ve vašem obchodě
Typy produktů jsou uloženy pomocí stejného taxonomického systému jako kategorie produktů. Jsou uloženy jako taxonomie s názvem ‚product_type‘. Informace o tom, který taxonomický termín je spojen s konkrétním produktem, je uložena v tabulkách databáze WordPress, které zpracovávají taxonomie a jejich vztahy k příspěvkům (produktům). Tyto tabulky zahrnují wp_terms
, wp_term_taxonomy
a wp_term_relationships
.
Podobně jako při získávání kategorií lze informace o typu produktu získat pomocí následujícího databázového dotazu:
SELECT
rel.object_id AS product_id,
terms.name AS product_type
FROM
est_term_relationships AS rel
INNER JOIN est_term_taxonomy AS tt
ON
rel.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN est_terms AS terms
ON
terms.term_id = tt.term_id
WHERE
rel.object_id = 117486 AND tt.taxonomy = 'product_type'
LIMIT 1;
SQLEntity Relationship Diagram (ERD)
Pro lepší pochopení vztahů mezi tabulkami je doporučeno vytvářet ER diagram. Například diagram znázorni, jak je tabulka posts propojená s postmeta, woocommerce_order_items a následně s woocommerce_order_itemmeta. Pro jeho vytvoření lze použít nástroje jako MySQL Workbench nebo online služby. Diagram pomůže:
- Vizualizovat vztahy mezi objednávkami, produkty a uživateli.
- Identifikovat klíčová propojení pro optimalizaci dotazů.
- Snadněji diagnostikovat případné nesrovnalosti v datech.
Optimalizace databáze WooCommerce
Optimalizace databáze je zásadní pro udržení vysokého výkonu vašeho e-shopu. WooCommerce spolu s WordPressem ukládá řadu nadbytečných dat – od revizí, přes transients, až po systémové logy a staré relace. Pro jejich odstranění doporučuji pravidelnou údržbu, kterou můžete provádět buď automaticky pomocí pluginů, nebo manuálně.
Doporučené pluginy a nástroje
- WP-Optimize
Tento bezplatný plugin odstraní nepotřebná data, revize a spamové komentáře. Umožňuje také manuální čištění a automatickou optimalizaci tabulek, což výrazně zrychlí databázi. - WP-Sweep
Používá vestavěné WordPress funkce ke smazání nadbytečných revizí, metadat a dalších nepotřebných záznamů. Jeho výhodou je přehledný statistický výpis – snadno zjistíte, kolik dat bylo odstraněno. - Advanced Database Cleaner
Plugin nabízí čištění databáze (odstranění revizí, konceptů, odpadních komentářů) i možnost naplánovat automatickou údržbu. Před použitím doporučuji vždy provést kompletní zálohu databáze. - Manuální optimalizace prostřednictvím phpMyAdmin
- actionscheduler _actions a _logs Nezapomeňe, že na webu mam snippet, diky němuž mužete automatický čistit nepotřebné záznamy v actionscheduler _actions a _logs. Článek zde s návodem.
High-Performance Order Storage (HPOS)
S nedávnými verzemi WooCommerce byl zaveden koncept High-Performance Order Storage (HPOS). HPOS přesouvá některá data objednávek do vlastních tabulek, čímž se odlehčuje tradiční struktura postů a postmeta. Výhody HPOS:
- Zvýšení rychlosti při načítání objednávek.
- Lepší škálovatelnost při velkém objemu dat.
- Zjednodušená diagnostika a optimalizace databáze.
Doporučuji sledovat oficiální dokumentaci WooCommerce, neboť HPOS přináší změny, které mohou vyžadovat úpravy v custom řešeních.
Nejlepší postupy pro správu dat
Správná správa dat se nejen pozitivně odrazí na výkonnosti e-shopu, ale také výrazně usnadní diagnostiku a další rozvoj. Níže uvádím několik osvědčených přístupů spolu s doporučenými nástroji, které jsou zdarma dostupné:
Údržba a čištění
Naplánujte si pravidelnou údržbu – například každých pár měsíců zkontrolujte stav a velikost tabulek, případně odstraňte staré a nepotřebné položky. Kombinace výše uvedených pluginů v režimu automatického čištění vám pomůže udržet databázi v optimálním stavu.
Pravidelné zálohování databáze
Používejte plugin třeba UpdraftPlus k vytvoření pravidelných záloh. Automatizované zálohování zajistí, že v případě nepředvídané události můžete rychle obnovit původní stav. Pozor na kompletní zálohy webu včetně databáze. Většina hostingů zakazuje automatizované vlastní zálohování v rámci webového účtu. Zálohy proto provádějte na vzdálené úložiště, například Google Drive nebo OneDrive.
Zálohujte s rozvahou a ideálně vždy před aktualizací nebo zásadní změnou webu, abyste měli k dispozici poslední funkční zálohu. Tyto zálohy můžete dočasně uložit lokálně na hostingu nebo rovnou na vzdálené úložiště. Pokud je vše v pořádku, zálohu z hostingu smažte a deaktivujte zálohovací plugin.
Monitoring výkonu
Plugin Query Monitor sleduje pomalé SQL dotazy, chybné volání a další problémové kousky kódu. Tento nástroj vám pomůže rychle odhalit úzká místa a optimalizovat konkrétní dotazy.
Bezpečnostní opatření
Při přímé manipulaci s databází vždy používejte funkci $wpdb->prepare()
ke správnému ošetření vstupních dat. Dále doporučuji pravidelně kontrolovat oprávnění databázových uživatelů a omezit přístup pouze na autorizované IP adresy.
Příklady užitečných SQL dotazů
1. Výpis objednávek za poslední měsíc
Dotaz spojuje tabulky wp_posts
(kde jsou uloženy objednávky jako typ příspěvku shop_order
) a wp_postmeta
(kde jsou uloženy doplňující data, jako celková cena objednávky). Důraz je kladen na práci s indexovanými sloupci (např. post_date
a meta_key
):
SELECT p.ID, p.post_date, pm.meta_value AS total
FROM wp_posts AS p
JOIN wp_postmeta AS pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_order'
AND p.post_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
AND pm.meta_key = '_order_total';
SQL2. Rychlé vyhledání produktů podle ceny
Tento dotaz vyhledává produkty v určité cenové relaci, kde se cena ukládá v wp_postmeta
. Použití funkce CAST()
zajistí správné porovnání číselné hodnoty:
SELECT p.ID, p.post_title, meta.meta_value AS price
FROM wp_posts AS p
JOIN wp_postmeta AS meta ON p.ID = meta.post_id
WHERE p.post_type = 'product'
AND meta.meta_key = '_price'
AND CAST(meta.meta_value AS DECIMAL(10,2)) BETWEEN 100 AND 500;
SQL3. Seznam položek objednávky se získáním detailů
Pro získání komplexního přehledu o položkách objednávky je třeba spojit tabulky woocommerce_order_items
a woocommerce_order_itemmeta
:
SELECT oi.order_item_id, oi.order_item_name, oim.meta_key, oim.meta_value
FROM wp_woocommerce_order_items AS oi
JOIN wp_woocommerce_order_itemmeta AS oim ON oi.order_item_id = oim.order_item_id
WHERE oi.order_id = 1234;
SQLTyto dotazy lze dále optimalizovat pomocí příslušných indexů a přizpůsobit konkrétním potřebám.
Diagnostika a řešení problémů s databází
Při správě WooCommerce databáze se můžete setkat s následujícími problémy:
- Pomalé načítání: Zkontrolujte indexy, optimalizujte dotazy a odstraňte nepotřebná data. Nástroje jako Query Monitor vám pomohou identifikovat úzká místa.
- Chybějící data: Například nesprávně propojené záznamy mezi posts a postmeta mohou způsobit chyby při načítání objednávek či produktů. Proveďte validaci integrity dat.
- Přetížení databáze: Při masivních objemech dat zvažte rozdělení databáze, použití HPOS a pravidelné archivování starých dat.
Doporučení pro psaní SQL dotazů
- Specifikujte pouze potřebné sloupce:
Vyhýbejte se využíváníSELECT *
– vždy uveďte jen ty sloupce, které skutečně potřebujete, což významně snižuje zátěž serveru. - Používejte připravené dotazy:
Při vyvolávání SQL dotazů z PHP využijte$wpdb->prepare()
, abyste ochránili aplikaci před SQL injection útoky. - Optimalizujte dotazy indexováním:
Ujistěte se, že sloupce používané ve WHERE klauzulích mají odpovídající indexy. Například u filtrů dle data či jiné často dotazované sloupce, jako jepost_date
nebometa_key
. - Testujte a monitorujte výkon:
Nástroj Query Monitor vám pomuže zjistit, které dotazy jsou příliš pomalé a díky této informaci máte skvělý základ pro optimalizaci.
Bezpečnostní doporučení
Bezpečnost databáze by měla být vždy prioritou:
- Pravidelné zálohování: Před jakýmikoli zásahy nebo optimalizacemi vždy proveďte zálohu celé databáze.
- Bezpečný přístup: Ujistěte se, že přístup k databázi je omezen pouze na autorizované uživatele a používejte silná hesla.
- Ochrana proti SQL injection: Při psaní vlastních dotazů používejte připravené dotazy a sanitizaci vstupů.
- Aktualizace a monitoring: Sledujte bezpečnostní aktualizace WordPressu a WooCommerce a pravidelně monitorujte přístupové logy.