Základní popis struktury databáze WooCommerce ⁽ᵘᵖᵈᵃᵗᵉ 2025⁾

Jak byl napsán tento článek:
Obsah článku

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';
SQL

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' AND post_status = 'publish';
SQL

Ulož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';
SQL

Ve 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';
SQL

Ulož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_idwp_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];
SQL

Metadata 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:

  1. 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ý.
  2. 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í:

  1. Získává základní informace o produktech (ID, název)
  2. Propojuje je s jejich variacemi (ID, název variace)
  3. 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_taxonomywp_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;
SQL

Entity 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:

  1. Vizualizovat vztahy mezi objednávkami, produkty a uživateli.
  2. Identifikovat klíčová propojení pro optimalizaci dotazů.
  3. 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

  1. 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.
  2. 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.
  3. 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.
  4. Manuální optimalizace prostřednictvím phpMyAdmin
  5. 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_datemeta_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';
SQL

2. 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;
SQL

3. 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_itemswoocommerce_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;
SQL

Tyto 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:

  1. 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.
  2. 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.
  3. 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ů

  1. 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.
  2. 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.
  3. 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 je post_date nebo meta_key.
  4. 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:

  1. Pravidelné zálohování: Před jakýmikoli zásahy nebo optimalizacemi vždy proveďte zálohu celé databáze.
  2. 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.
  3. Ochrana proti SQL injection: Při psaní vlastních dotazů používejte připravené dotazy a sanitizaci vstupů.
  4. Aktualizace a monitoring: Sledujte bezpečnostní aktualizace WordPressu a WooCommerce a pravidelně monitorujte přístupové logy.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *