Jak hromadně vyhledat a nahradit text v databázi
Jak v databázi nahradit text ve všech řádcích najednou, například starou doménu za novou, a proč u WordPressu nestačí obyčejný SQL dotaz.
3 minuty čtení 10 kroků
Obsah návodu
Hromadnou náhradu textu v databázi potřebujete nejčastěji při změně domény, přechodu z http:// na https:// nebo při přesunu webu z dočasné adresy. Ruční úprava stovek řádků nepřipadá v úvahu, řešení je buď SQL dotaz, nebo u WordPressu specializovaný nástroj. Volba záleží na tom, jak jsou data v databázi uložená.
Náhradu nelze vrátit zpět. Před jakoukoli změnou databázi exportujte podle návodu Jak exportovat databázi?.
Proč je WordPress zvláštní případ
WordPress a řada jeho pluginů ukládají nastavení jako takzvaná serializovaná data. Jde o text, který obsahuje i délku každé hodnoty, například s:22:"http://stara-domena.cz". Pokud text nahradíte obyčejným SQL dotazem a nová hodnota má jinou délku, uložená délka přestane odpovídat a WordPress data zahodí. Projeví se to ztrátou nastavení šablony, widgetů nebo pluginů. Proto u WordPressu používejte nástroj, který serializovaná data rozpozná a délky přepočítá.
WordPress: plugin Better Search Replace
- V administraci přejděte do Pluginy → Instalace pluginů, vyhledejte Better Search Replace, nainstalujte a aktivujte.
- Otevřete Nástroje → Better Search Replace.
- Do pole Search for zadejte hledaný text (například
http://stara-domena.cz), do pole Replace with nový text (https://nova-domena.cz). Zadávejte adresy bez lomítka na konci. - V seznamu Select tables označte všechny tabulky (Ctrl+A nebo Cmd+A).
- Ponechte zaškrtnuté Run as dry run? a klikněte na Run Search/Replace. Plugin jen spočítá, kolik výskytů by změnil.
- Pokud výsledek odpovídá očekávání, volbu Run as dry run? odškrtněte a spusťte náhradu znovu.
Pokud se do administrace nedostanete (web po změně domény přesměrovává), upravte nejdříve řádky siteurl a home v tabulce wp_options přes phpMyAdmin a poté spusťte plugin.
WordPress: WP-CLI
Pokud máte přístup k příkazové řádce s nástrojem WP-CLI, stejnou práci udělá jeden příkaz spuštěný v kořenové složce webu:
wp search-replace 'http://stara-domena.cz' 'https://nova-domena.cz' --all-tables --dry-run
Přepínač --dry-run pouze vypíše počet nalezených výskytů. Po kontrole ho odstraňte a příkaz spusťte znovu. WP-CLI serializovaná data zpracuje správně.
Obyčejné tabulky: SQL dotaz
U vlastní aplikace nebo tabulek bez serializovaných dat stačí SQL dotaz v phpMyAdmin (viz Jak se přihlásit do phpMyAdmin a základní orientace).
- V levém panelu klikněte na databázi a otevřete záložku SQL.
- Nejprve si ověřte rozsah změny dotazem, který jen počítá řádky:
SELECT COUNT(*) FROM tabulka WHERE sloupec LIKE '%stare%'; - Poté spusťte náhradu:
UPDATE tabulka SET sloupec = REPLACE(sloupec, 'stare', 'nove'); - Klikněte na Proveď. phpMyAdmin vypíše počet změněných řádků.
Dotaz upravuje jeden sloupec jedné tabulky. Pro každou další kombinaci tabulky a sloupce ho spusťte znovu. Funkce REPLACE rozlišuje velká a malá písmena podle porovnávání sloupce, u běžného utf8mb4_unicode_ci je nerozlišuje.
Hledaný text volte co nejpřesněji. Náhrada stara-domena.cz zasáhne i e-mailové adresy info@stara-domena.cz. Pokud to nechcete, hledejte včetně protokolu, například https://stara-domena.cz.
Nejčastější chyby
- Po náhradě zmizelo nastavení šablony nebo widgety. Poškodila se serializovaná data. Obnovte databázi ze zálohy a použijte Better Search Replace nebo WP-CLI.
- Dotaz nic nezměnil. Hledaný text neodpovídá přesně (jiné lomítko,
www, protokol). Ověřte jej dotazemSELECT. - Web po náhradě stále zobrazuje starou adresu. Vymažte cache pluginu a prohlížeče, případně zkontrolujte
WP_HOMEvewp-config.php.