Aktualizace WordPressu: Co se děje pod kapotou, když kliknete na tlačítko

Kliknete na „Update“ a za chvíli je hotovo. Jenže co se přesně stalo? WordPress stáhl balíček, přepsal stovky souborů, upravil databázi — a na pár vteřin váš web zmizel pro všechny návštěvníky. Většinou to proběhne bez problémů. Ale když se to rozbije, chcete přesně vědět kde a proč. Pojďme si celý proces rozebrat od začátku do konce.
1. Jedno kliknutí, spousta magie
WordPress admin vám zobrazí nenápadný banner: „WordPress 6.8 is available! Please update now.“ Vypadá to jednoduše. Pod tím UX se ale skrývá proces, který připomíná malý deployment.
Existují tři typy aktualizací, a každý funguje trochu jinak:
- Core update — samotný WordPress, buď minor (6.7.1 → 6.7.2) nebo major (6.7 → 6.8)
- Plugin update — přepis složky konkrétního pluginu
- Theme update — podobné pluginům, ale s vlastními riziky
Kliknutí na tlačítko spustí sérii operací, které připomínají malý deployment — jen schovaný za UI.
2. Komunikace s WordPress API
Než WordPress vůbec cokoliv stáhne, potřebuje vědět, co stáhnout. Pravidelně (zhruba každých 12 hodin) kontaktuje api.wordpress.org a ptá se na dostupné verze.
Výsledek si ukládá jako transient — dočasnou hodnotu v databázi:
// WordPress si výsledek kontroly ukládá jako transient
get_transient('update_core'); // informace o core update
get_transient('update_plugins'); // informace o pluginech
get_transient('update_themes'); // informace o šablonáchCode language: PHP (php)
Transient má nastavenou expiraci. Pokud chcete přinutit WordPress ke kontrole okamžitě (například po manuálním přidání pluginu), stačí transient smazat nebo použít:
wp transient delete --allCode language: PHP (php)
Pokud api.wordpress.org není dostupný — třeba kvůli firewallu na serveru nebo DNS problému — WordPress update nenabídne vůbec. To je první místo, kde může něco selhat ještě předtím, než cokoli stáhnete.
3. Stažení balíčku
Jakmile uživatel potvrdí update, WordPress stáhne ZIP archiv aktualizace. Ukládá ho do:
/wp-content/upgrade/Code language: PHP (php)
Ke stahování používá vlastní WP HTTP API — abstrakci nad cURL nebo fsockopen. Stažení může selhat kvůli:
- firewallu — server nemá povolené odchozí HTTPS spojení
- DNS — server nedokáže přeložit
downloads.wordpress.org - SSL problémům — zastaralé certifikáty nebo chybějící CA bundle
- timeoutu — pomalé připojení + velký balíček =
max_execution_timevyprší dříve, než se stahování dokončí
Pokud stahování selže, WordPress zobrazí chybovou hlášku a proces se zastaví. Žádný soubor se nepřepíše, web zůstane funkční.
4. Maintenance mode — klíčová část core update
Tady se core update liší od plugin/theme update nejvíc. Před tím, než WordPress začne přepisovat soubory, vytvoří v root složce webu soubor:
/.maintenanceCode language: PHP (php)
Jeho obsah je minimalistický:
<?php $upgrading = time(); ?>Code language: PHP (php)
WordPress při každém požadavku kontroluje, jestli tento soubor existuje a jestli je mladší než 10 minut. Pokud ano, všem návštěvníkům zobrazí stránku:
Briefly unavailable for scheduled maintenance. Check back in a minute.
Tento mechanismus chrání web před situací, kdy by návštěvník načetl stránku v době, kdy jsou core soubory z poloviny přepsané — tedy v nekonzistentním stavu.
Soubor .maintenance se po úspěšném dokončení update automaticky smaže. Pokud update selže uprostřed procesu — server spadne, vyprší čas, chyba oprávnění — soubor zůstane a web se „zasekne“ v maintenance mode. To je jeden z nejčastějších problémů, se kterými se vývojáři setkávají.
Řešení: smazat .maintenance manuálně přes FTP nebo SSH.
5. Rozbalení a práce se soubory
WordPress nepracuje se soubory přímo přes PHP file funkce. Používá abstrakční vrstvu — třídu WP_Filesystem. Důvod je jednoduchý: různé servery mají různá práva a různé způsoby přístupu k souborům.
Existují tři scénáře (tzv. FS metody):
| Metoda | Kdy se použije |
|---|---|
direct | PHP běží jako vlastník souborů (nejčastější na shared hostingu a VPS) |
ftpext / ftpsockets | PHP nemá práva zapisovat, WordPress si vyžádá FTP přihlašovací údaje |
ssh2 | Přístup přes SSH klíče |
Na většině moderních serverů funguje direct — PHP proces má stejného vlastníka jako soubory WordPressu. Pokud tomu tak není, admin zobrazí formulář pro FTP přihlašovací údaje, což je pro mnohé vývojáře nepříjemné překvapení.
Samotné rozbalení probíhá takto:
- ZIP archiv se rozbalí do dočasné složky v
/wp-content/upgrade/ - WordPress porovná soubory se stávající instalací
- Core soubory se přepíší (zejména složky
wp-admin/awp-includes/) wp-content/se nepřepisuje — to je záměrné, aby se zachovaly pluginy, šablony a uploady
Výjimkou jsou výchozí šablony (Twenty Twenty-Five apod.) — ty se při core update aktualizují, pokud jsou aktivní nebo přítomné.
6. Databázové změny
Po přepsání souborů WordPress zkontroluje, jestli aktuální verze databázového schématu odpovídá nové verzi WordPressu. Tato informace je uložená v option db_version.
Pokud se verze liší, spustí se:
wp_upgrade();Code language: PHP (php)
Tato funkce může:
- přidat nové tabulky
- změnit strukturu existujících tabulek (
ALTER TABLE) - migrovat data
Databázové změny jsou zpravidla zpětně kompatibilní — WordPress na to dává pozor. Ale přerušený databázový upgrade (výpadek serveru, timeout) může zanechat tabulky v nekonzistentním stavu. V takovém případě je nejlepší postup spustit upgrade manuálně:
wp core update-dbCode language: PHP (php)
7. Hooky a Upgrader API
WordPress má propracovaný systém hooků, které se spouštějí v různých fázích update procesu. Pluginy je hojně využívají:
// Spustí se před samotnou instalací
add_filter('upgrader_pre_install', function($response, $hook_extra) {
// např. deaktivace pluginu před update
return $response;
}, 10, 2);
// Spustí se po dokončení instalace
add_filter('upgrader_post_install', function($response, $hook_extra, $result) {
// např. purge cache
return $response;
}, 10, 3);
// Spustí se po dokončení celého procesu
add_action('upgrader_process_complete', function($upgrader, $options) {
// např. notifikace, logy, restart služeb
}, 10, 2);Code language: PHP (php)
Právě hook upgrader_process_complete využívají cache pluginy (W3 Total Cache, WP Super Cache, LiteSpeed Cache) k invalidaci cache po update. Pokud to plugin neudělá, může se stát, že web po update servíruje zastaralé verze stránek.
8. Rozdíl mezi core, plugin a theme update
Core update
Nejkomplexnější typ. Zahrnuje maintenance mode, přepis stovek souborů, potenciální databázové změny. Minor update (bezpečnostní záplata) bývá rychlý a bezpečný. Major update může rozbít pluginy, které závisí na interních API.
Plugin update
Jednodušší: WordPress přepíše pouze složku konkrétního pluginu v /wp-content/plugins/. Maintenance mode se nevytváří. Riziko je v nekompatibilitě — nová verze pluginu může vyžadovat vyšší verzi PHP nebo jiný plugin.
Theme update
Mechanicky podobné plugin update, ale s jedním specifickým rizikem: pokud jste upravovali soubory aktivní šablony přímo (bez child theme), aktualizace ty úpravy přepíše. Bez náhrady, bez varování. Proto je child theme naprostý základ pro jakékoliv úpravy šablony.
9. Co se může pokazit (a proč)
Tohle je nejpraktičtější část článku. Realita je taková, že update sem tam něco rozbije — a pokud víte proč, dokážete to opravit rychle.
White screen of death (WSOD)
Prázdná bílá stránka bez chybové hlášky. Nejčastější příčiny:
- Fatální chyba v PHP — nová verze WordPressu nebo pluginu není kompatibilní s vaší verzí PHP (nebo naopak)
- Konfliktní plugin — nová verze core změnila API, na které plugin spoléhal
- Nedostatek paměti — PHP
memory_limitje příliš nízký pro zpracování update
Zaseknutý maintenance mode
Web zůstane v „Briefly unavailable“ i po hodině. Příčina: update selhal, soubor .maintenance nebyl smazán.
Řešení: smazat /.maintenance přes FTP/SSH.
Permission denied
WordPress nemůže přepisovat soubory, protože PHP proces nemá oprávnění. Projevuje se formulářem pro FTP přihlašovací údaje.
Řešení:
# Nastavit správného vlastníka (nahradit www-data vlastním uživatelem webserveru)
chown -R www-data:www-data /var/www/html/wordpress
# Nebo nastavit práva
chmod -R 755 /var/www/html/wordpress
chmod -R 644 /var/www/html/wordpress/wp-contentCode language: PHP (php)
Timeout při stahování
Update selže s chybou „Download failed“. Příčiny: pomalé připojení, velký balíček, nízký max_execution_time.
Řešení: zvýšit max_execution_time v php.ini nebo stáhnout balíček manuálně a aktualizovat přes FTP.
10. Jak debugovat neúspěšný update
Pokud update selže, první krok je vždy zapnout debug mód. Do wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true); // zapíše chyby do /wp-content/debug.log
define('WP_DEBUG_DISPLAY', false); // nezobrazuj chyby návštěvníkům!Code language: PHP (php)
Pak zkontrolujte:
/wp-content/debug.log— PHP chyby a varování- PHP error log — typicky
/var/log/php-fpm/error.lognebo/var/log/apache2/error.log - Webserver log — nginx nebo Apache access/error log
Manuální update (jistý způsob)
Pokud automatický update opakovaně selhává, udělejte to ručně:
# 1. Stáhnout WordPress
wget https://wordpress.org/latest.zip
# 2. Rozbalit
unzip latest.zip
# 3. Přepsat soubory (ZACHOVAT wp-content!)
rsync -av --exclude='wp-content' wordpress/ /var/www/html/
# 4. Spustit databázový upgrade
wp core update-dbCode language: PHP (php)
Nebo jednoduše přes WP-CLI:
wp core update
wp plugin update --all
wp theme update --all
wp core update-dbCode language: PHP (php)
11. Automatické aktualizace
Od WordPressu 3.7 existují tzv. background updates — aktualizace, které proběhnou automaticky na pozadí, bez klikání v adminu.
Defaultně se automaticky aktualizují:
- Minor core verze (bezpečnostní záplaty, tedy 6.7.1 → 6.7.2)
- Překlady
Major verze a pluginy se automaticky neaktualizují, pokud to explicitně nepovolíte. Chování lze řídit v wp-config.php:
// Automaticky aktualizovat vše včetně major verzí
define('WP_AUTO_UPDATE_CORE', true);
// Zakázat automatické aktualizace úplně
define('WP_AUTO_UPDATE_CORE', false);
// Pouze minor aktualizace (výchozí chování)
define('WP_AUTO_UPDATE_CORE', 'minor');Code language: PHP (php)
Pro pluginy lze automatické aktualizace zapnout v adminu (WordPress 5.5+) nebo programaticky:
add_filter('auto_update_plugin', '__return_true');
add_filter('auto_update_theme', '__return_true');Code language: PHP (php)
Pozor: automatické aktualizace pluginů jsou pohodlné, ale riskantní. Nová verze pluginu se může nasadit v době špičky a rozbít web bez varování.
12. Proč (ne)aktualizovat hned
Bezpečnostní patch? Aktualizujte co nejdříve — tyto minor verze jsou zpravidla bezpečné a opravují konkrétní zranitelnosti.
Major verze? To je jiná situace. Je rozumné počkat týden nebo dva — v té době se obvykle vyrojí hlášení o nekompatibilních pluginech a autoři je rychle opravují.
Minimální hygienická sada před jakýmkoliv update:
- Záloha databáze —
wp db export backup.sqlnebo přes hosting panel - Záloha souborů — aspoň
wp-content/ - Otestovat na stagingu — ideálně klon produkce
- Update mimo špičku — kvůli maintenance mode a možnému výpadku
13. Best practices (shrnutí pro praxi)
- Nikdy neupravujte soubory šablony přímo — vždy child theme
- Udržujte pluginů minimum — každý plugin je potenciální bod selhání
- Sledujte changelogy před update, zejména u složitějších pluginů
- Na produkci aktualizujte vždy po záloze a vždy mimo špičku
- Automatické aktualizace pro core minor verze jsou v pořádku; pro pluginy zvažte důkladněji
Bonus: Co se děje na úrovni serveru
Update WordPressu není jen PHP operace — je to I/O zátěž:
- Disk I/O — rozbalení ZIPu, přepis desítek až stovek souborů
- File locks — souborový systém zamkne zapisované soubory; pokud PHP spadne uprostřed, lock může zůstat
- Disk space —
/wp-content/upgrade/musí mít místo pro rozbalený balíček; na přeplněných serverech to selže
Dopad na výkon po update
Po úspěšném update je potřeba počítat s:
- OPcache reset — PHP opcache obsahuje zkompilované verze PHP souborů; ty jsou po update neplatné a musí se znovu zkompilovat (první požadavky po update jsou pomalejší)
- Cache invalidace — cache pluginy by měly smazat cache automaticky přes
upgrader_process_completehook; pokud ne, udělejte to manuálně
CI/CD přístup místo klikání
Na větších projektech nebo při správě více webů je klikání v adminu neudržitelné. WP-CLI umožňuje celý proces automatizovat:
#!/bin/bash
# Záloha
wp db export backup-$(date +%Y%m%d).sql
# Update
wp core update
wp core update-db
wp plugin update --all
wp theme update --all
# Flush cache
wp cache flush
wp rewrite flushCode language: PHP (php)
Tento skript lze spustit přes cron, zakomponovat do CI/CD pipeline (GitHub Actions, GitLab CI) nebo nasadit přes deploy nástroj jako Deployer.
Závěr
Aktualizace WordPressu není tlačítko. Je to deployment — jen skrytý za UI.
Když to víte, přestanete se bát aktualizovat a začnete to dělat správně: se zálohou, na stagingu, ve správný čas. A pokud něco selže, budete přesně vědět, kde hledat příčinu.
Pokud vás celý ten proces nechce bavit a raději se soustředíte na samotný web, dává smysl to někomu předat. Víc o tom, jak to dělám, najdete tady.