Přejít k navigační liště

Zdroják » Databáze » Aktualizace WordPressu: Co se děje pod kapotou, když kliknete na tlačítko

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

Články Databáze

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_time vyprší 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):

MetodaKdy se použije
directPHP běží jako vlastník souborů (nejčastější na shared hostingu a VPS)
ftpext / ftpsocketsPHP nemá práva zapisovat, WordPress si vyžádá FTP přihlašovací údaje
ssh2Pří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:

  1. ZIP archiv se rozbalí do dočasné složky v /wp-content/upgrade/
  2. WordPress porovná soubory se stávající instalací
  3. Core soubory se přepíší (zejména složky wp-admin/ a wp-includes/)
  4. 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_limit je 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:

  1. /wp-content/debug.log — PHP chyby a varování
  2. PHP error log — typicky /var/log/php-fpm/error.log nebo /var/log/apache2/error.log
  3. 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:

  1. Záloha databázewp db export backup.sql nebo přes hosting panel
  2. Záloha souborů — aspoň wp-content/
  3. Otestovat na stagingu — ideálně klon produkce
  4. 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_complete hook; 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.

Komentáře

Odebírat
Upozornit na
guest
0 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
Zobrazit všechny komentáře

Je čas přejít na ESM-only. Ekosystém je připravený

V únoru 2025 vyzval Anthony Fu, autor populárních nástrojů kolem Vue, Nuxtu a Vite, ekosystém k opuštění duálního publikování npm balíčků a přechodu na ESM-only. S odstupem více než roku je jasné, že měl pravdu - a že se ekosystém posunul ještě rychleji, než sám čekal. Node.js dnes umí require() i na ESM moduly, podíl balíčků s podporou ESM přesáhl třetinu a komunita označuje rok 2026 za „rok plné adopce ESM".