[{"data":1,"prerenderedAt":726},["ShallowReactive",2],{"wpis-zmiana-domeny-wordpress-aktualizacja-bazy-danych":3},{"id":4,"title":5,"body":6,"date":712,"description":713,"extension":714,"kategoria":715,"meta":716,"navigation":292,"obrazek":717,"obrazekAlt":718,"path":719,"seo":720,"sitemap":721,"stem":722,"szkic":723,"zaktualizowano":724,"__hash__":725},"wpisy/zmiana-domeny-wordpress-aktualizacja-bazy-danych.md","Zmiana domeny w WordPress — jak zaktualizować bazę danych",{"type":7,"value":8,"toc":700},"minimark",[9,18,21,26,57,65,68,72,75,126,129,133,136,139,161,168,184,191,209,213,216,396,411,414,449,453,456,490,493,501,508,511,517,521,531,537,543,547,554,560,578,619,625,629,643,647,650,661,665,671,677,690,693,696],[10,11,12,13,17],"p",{},"Po przeniesieniu WordPressa na nową domenę adresy w bazie zostają stare. Najszybciej naprawia to jedna komenda WP-CLI: ",[14,15,16],"code",{},"wp search-replace 'https://stara-domena.pl' 'https://nowa-domena.pl'",". Jeśli nie masz dostępu do konsoli, niżej znajdziesz wersję przez phpMyAdmin.",[10,19,20],{},"Zanim jednak skopiujesz pierwsze lepsze zapytanie z internetu: dwa z popularnie powielanych poleceń potrafią rozbić ustawienia motywu i wtyczek tak, że objawy wyjdą dopiero po kilku dniach. Opisuję je w dalszej części.",[22,23,25],"h2",{"id":24},"dlaczego-zmiana-adresu-w-kokpicie-nie-wystarcza","Dlaczego zmiana adresu w kokpicie nie wystarcza",[10,27,28,29,32,33,36,37,40,41,44,45,48,49,52,53,56],{},"WordPress trzyma adres strony w kilku miejscach naraz. W tabeli ",[14,30,31],{},"wp_options"," siedzą pola ",[14,34,35],{},"home"," i ",[14,38,39],{},"siteurl",". W ",[14,42,43],{},"wp_posts"," każdy wstawiony obrazek, link wewnętrzny i osadzony materiał zapisany jest jako adres bezwzględny, czyli ",[14,46,47],{},"https://stara-domena.pl/wp-content/uploads/2024/03/zdjecie.jpg"," zamiast samego ",[14,50,51],{},"/zdjecie.jpg",". Własne adresy zapisują też motywy i wtyczki, w ",[14,54,55],{},"wp_postmeta"," i we własnych tabelach.",[10,58,59,60,36,62,64],{},"Zmiana ",[14,61,35],{},[14,63,39],{}," przestawia tylko to, pod jakim adresem WordPress widzi sam siebie. Treść wpisów zostaje nietknięta i dalej wskazuje starą domenę.",[10,66,67],{},"Ta sama zasada dotyczy sklepów. W WooCommerce dochodzą jeszcze adresy w danych produktów i konfiguracji bramek płatności, więc migracja sklepu wymaga sprawdzenia większej liczby miejsc niż zwykła witryna.",[22,69,71],{"id":70},"zacznij-od-kopii-bazy","Zacznij od kopii bazy",[10,73,74],{},"Każda operacja z tego tekstu zmienia dane nieodwracalnie:",[76,77,82],"pre",{"className":78,"code":79,"language":80,"meta":81,"style":81},"language-bash shiki shiki-themes one-dark-pro","mysqldump -u uzytkownik -p nazwa_bazy > kopia-przed-migracja.sql\nls -lh kopia-przed-migracja.sql\n","bash","",[14,83,84,114],{"__ignoreMap":81},[85,86,89,93,97,101,104,107,111],"span",{"class":87,"line":88},"line",1,[85,90,92],{"class":91},"sVbv2","mysqldump",[85,94,96],{"class":95},"sVC51"," -u",[85,98,100],{"class":99},"subq3"," uzytkownik",[85,102,103],{"class":95}," -p",[85,105,106],{"class":99}," nazwa_bazy",[85,108,110],{"class":109},"sn6KH"," > ",[85,112,113],{"class":99},"kopia-przed-migracja.sql\n",[85,115,117,120,123],{"class":87,"line":116},2,[85,118,119],{"class":91},"ls",[85,121,122],{"class":95}," -lh",[85,124,125],{"class":99}," kopia-przed-migracja.sql\n",[10,127,128],{},"Drugie polecenie nie jest ozdobnikiem. Kopia o zerowym rozmiarze wygląda w panelu hostingu identycznie jak poprawna i przekonujesz się o tym w najgorszym momencie.",[22,130,132],{"id":131},"sposób-pierwszy-wp-cli","Sposób pierwszy: WP-CLI",[10,134,135],{},"Mając dostęp do konsoli, używaj wyłącznie tej metody. WP-CLI rozumie dane serializowane i przelicza je przy zamianie, czego zwykłe zapytanie SQL nie potrafi.",[10,137,138],{},"Najpierw przebieg próbny, który niczego nie zmienia, a pokazuje liczbę trafień:",[76,140,142],{"className":78,"code":141,"language":80,"meta":81,"style":81},"wp search-replace 'https://stara-domena.pl' 'https://nowa-domena.pl' --dry-run\n",[14,143,144],{"__ignoreMap":81},[85,145,146,149,152,155,158],{"class":87,"line":88},[85,147,148],{"class":91},"wp",[85,150,151],{"class":99}," search-replace",[85,153,154],{"class":99}," 'https://stara-domena.pl'",[85,156,157],{"class":99}," 'https://nowa-domena.pl'",[85,159,160],{"class":95}," --dry-run\n",[10,162,163,164,167],{},"Gdy liczby się zgadzają, to samo bez ",[14,165,166],{},"--dry-run",":",[76,169,171],{"className":78,"code":170,"language":80,"meta":81,"style":81},"wp search-replace 'https://stara-domena.pl' 'https://nowa-domena.pl'\n",[14,172,173],{"__ignoreMap":81},[85,174,175,177,179,181],{"class":87,"line":88},[85,176,148],{"class":91},[85,178,151],{"class":99},[85,180,154],{"class":99},[85,182,183],{"class":99}," 'https://nowa-domena.pl'\n",[10,185,186,187,190],{},"Domyślnie WP-CLI przechodzi po tabelach z prefiksem instalacji. Jeśli wtyczki założyły tabele poza tym prefiksem, dołóż ",[14,188,189],{},"--all-tables",".",[10,192,193,194,197,198,201,202,205,206,190],{},"Adres podawaj bez ukośnika na końcu i dokładnie w takiej postaci, w jakiej występuje w bazie. Zamianę powtórz osobno dla każdego wariantu: ",[14,195,196],{},"https://",", ",[14,199,200],{},"http://"," oraz wersji z ",[14,203,204],{},"www",", jeśli była używana. Próba załatwienia wszystkiego jednym wyrażeniem kończy się adresami w rodzaju ",[14,207,208],{},"https://www.https://nowa-domena.pl",[22,210,212],{"id":211},"sposób-drugi-zapytania-sql","Sposób drugi: zapytania SQL",[10,214,215],{},"Kiedy zostaje tylko phpMyAdmin albo Adminer, wykonaj poniższe zapytania. Dotykają wyłącznie pól, w których dane nie są serializowane, więc są bezpieczne.",[76,217,221],{"className":218,"code":219,"language":220,"meta":81,"style":81},"language-sql shiki shiki-themes one-dark-pro","UPDATE wp_options\nSET option_value = REPLACE(option_value, 'https://stara-domena.pl', 'https://nowa-domena.pl')\nWHERE option_name IN ('home', 'siteurl');\n\nUPDATE wp_posts\nSET post_content = REPLACE(post_content, 'https://stara-domena.pl', 'https://nowa-domena.pl');\n\nUPDATE wp_posts\nSET post_excerpt = REPLACE(post_excerpt, 'https://stara-domena.pl', 'https://nowa-domena.pl');\n\nUPDATE wp_comments\nSET comment_content = REPLACE(comment_content, 'https://stara-domena.pl', 'https://nowa-domena.pl');\n","sql",[14,222,223,232,261,287,294,302,325,330,337,360,365,373],{"__ignoreMap":81},[85,224,225,229],{"class":87,"line":88},[85,226,228],{"class":227},"seHd6","UPDATE",[85,230,231],{"class":109}," wp_options\n",[85,233,234,237,240,244,247,250,253,255,258],{"class":87,"line":116},[85,235,236],{"class":227},"SET",[85,238,239],{"class":109}," option_value ",[85,241,243],{"class":242},"sjrmR","=",[85,245,246],{"class":242}," REPLACE",[85,248,249],{"class":109},"(option_value, ",[85,251,252],{"class":99},"'https://stara-domena.pl'",[85,254,197],{"class":109},[85,256,257],{"class":99},"'https://nowa-domena.pl'",[85,259,260],{"class":109},")\n",[85,262,264,267,270,273,276,279,281,284],{"class":87,"line":263},3,[85,265,266],{"class":227},"WHERE",[85,268,269],{"class":109}," option_name ",[85,271,272],{"class":227},"IN",[85,274,275],{"class":109}," (",[85,277,278],{"class":99},"'home'",[85,280,197],{"class":109},[85,282,283],{"class":99},"'siteurl'",[85,285,286],{"class":109},");\n",[85,288,290],{"class":87,"line":289},4,[85,291,293],{"emptyLinePlaceholder":292},true,"\n",[85,295,297,299],{"class":87,"line":296},5,[85,298,228],{"class":227},[85,300,301],{"class":109}," wp_posts\n",[85,303,305,307,310,312,314,317,319,321,323],{"class":87,"line":304},6,[85,306,236],{"class":227},[85,308,309],{"class":109}," post_content ",[85,311,243],{"class":242},[85,313,246],{"class":242},[85,315,316],{"class":109},"(post_content, ",[85,318,252],{"class":99},[85,320,197],{"class":109},[85,322,257],{"class":99},[85,324,286],{"class":109},[85,326,328],{"class":87,"line":327},7,[85,329,293],{"emptyLinePlaceholder":292},[85,331,333,335],{"class":87,"line":332},8,[85,334,228],{"class":227},[85,336,301],{"class":109},[85,338,340,342,345,347,349,352,354,356,358],{"class":87,"line":339},9,[85,341,236],{"class":227},[85,343,344],{"class":109}," post_excerpt ",[85,346,243],{"class":242},[85,348,246],{"class":242},[85,350,351],{"class":109},"(post_excerpt, ",[85,353,252],{"class":99},[85,355,197],{"class":109},[85,357,257],{"class":99},[85,359,286],{"class":109},[85,361,363],{"class":87,"line":362},10,[85,364,293],{"emptyLinePlaceholder":292},[85,366,368,370],{"class":87,"line":367},11,[85,369,228],{"class":227},[85,371,372],{"class":109}," wp_comments\n",[85,374,376,378,381,383,385,388,390,392,394],{"class":87,"line":375},12,[85,377,236],{"class":227},[85,379,380],{"class":109}," comment_content ",[85,382,243],{"class":242},[85,384,246],{"class":242},[85,386,387],{"class":109},"(comment_content, ",[85,389,252],{"class":99},[85,391,197],{"class":109},[85,393,257],{"class":99},[85,395,286],{"class":109},[10,397,398,399,402,403,406,407,410],{},"Prefiks ",[14,400,401],{},"wp_"," bywa inny. Sprawdź go w ",[14,404,405],{},"wp-config.php"," w zmiennej ",[14,408,409],{},"$table_prefix"," i podmień w zapytaniach.",[10,412,413],{},"Po wykonaniu policz, czy coś zostało:",[76,415,417],{"className":218,"code":416,"language":220,"meta":81,"style":81},"SELECT COUNT(*) FROM wp_posts WHERE post_content LIKE '%stara-domena.pl%';\n",[14,418,419],{"__ignoreMap":81},[85,420,421,424,427,430,433,436,438,440,443,446],{"class":87,"line":88},[85,422,423],{"class":227},"SELECT",[85,425,426],{"class":242}," COUNT",[85,428,429],{"class":109},"(*) ",[85,431,432],{"class":227},"FROM",[85,434,435],{"class":109}," wp_posts ",[85,437,266],{"class":227},[85,439,309],{"class":109},[85,441,442],{"class":227},"LIKE",[85,444,445],{"class":99}," '%stara-domena.pl%'",[85,447,448],{"class":109},";\n",[22,450,452],{"id":451},"pułapka-pierwsza-dane-serializowane","Pułapka pierwsza: dane serializowane",[10,454,455],{},"W sieci krąży wersja tej instrukcji z dodatkowym zapytaniem na metadanych:",[76,457,459],{"className":218,"code":458,"language":220,"meta":81,"style":81},"UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, 'stara', 'nowa');\n",[14,460,461],{"__ignoreMap":81},[85,462,463,465,468,470,473,475,477,480,483,485,488],{"class":87,"line":88},[85,464,228],{"class":227},[85,466,467],{"class":109}," wp_postmeta ",[85,469,236],{"class":227},[85,471,472],{"class":109}," meta_value ",[85,474,243],{"class":242},[85,476,246],{"class":242},[85,478,479],{"class":109},"(meta_value, ",[85,481,482],{"class":99},"'stara'",[85,484,197],{"class":109},[85,486,487],{"class":99},"'nowa'",[85,489,286],{"class":109},[10,491,492],{},"To właśnie ono psuje strony po migracji. PHP zapisuje tam tablice w formacie serializowanym, w którym przed każdym tekstem stoi jego długość:",[76,494,499],{"className":495,"code":497,"language":498,"meta":81},[496],"language-text","a:1:{s:3:\"url\";s:32:\"https://stara-domena.pl/logo.png\";}\n","text",[14,500,497],{"__ignoreMap":81},[10,502,503,504,507],{},"Liczba ",[14,505,506],{},"32"," to liczba znaków adresu. Po zamianie na krótszą lub dłuższą domenę adres się zmienia, a liczba zostaje. PHP próbuje odczytać 32 znaki tam, gdzie jest ich 30, i porzuca odczyt całej tablicy.",[10,509,510],{},"Objawy wychodzą z opóźnieniem: znikają ustawienia motywu, przestaje działać suwak na stronie głównej, konfiguracja formularza kontaktowego wraca do stanu domyślnego, pola dodatkowe przy wpisach są puste. Baza wygląda na kompletną, bo dane fizycznie w niej są. Po prostu nie da się ich odczytać.",[10,512,513,514,190],{},"Pola serializowane zostaw narzędziom, które przeliczają długości od nowa: WP-CLI, wtyczce Better Search Replace albo skryptowi Search Replace DB. Nigdy zwykłemu ",[14,515,516],{},"REPLACE",[22,518,520],{"id":519},"pułapka-druga-kolumna-guid","Pułapka druga: kolumna guid",[10,522,523,524,527,528,530],{},"Ta sama popularna instrukcja każe zaktualizować ",[14,525,526],{},"guid"," w tabeli ",[14,529,43],{},". Nie rób tego.",[10,532,533,534,536],{},"Mimo że ",[14,535,526],{}," wygląda jak adres, pełni rolę trwałego identyfikatora wpisu. Czytniki RSS rozpoznają po nim, które wpisy już pokazały. Po zmianie wartości wszystkie archiwalne wpisy zostaną uznane za nowe i subskrybenci dostaną powiadomienia o kilkuset publikacjach naraz. Dokumentacja WordPressa wprost odradza modyfikowanie tej kolumny.",[10,538,539,540,542],{},"Stara domena w ",[14,541,526],{}," niczego nie psuje, bo ta wartość nie służy do budowania odnośników na stronie.",[22,544,546],{"id":545},"cztery-rzeczy-do-sprawdzenia-po-zamianie","Cztery rzeczy do sprawdzenia po zamianie",[10,548,549,553],{},[550,551,552],"strong",{},"Wyloguj się i zaloguj ponownie."," Ciasteczko sesji jest przypisane do starej domeny, więc kokpit potrafi odsyłać do ekranu logowania w kółko.",[10,555,556,559],{},[550,557,558],{},"Zapisz ustawienia odnośników."," Kokpit, Ustawienia, Bezpośrednie odnośniki, przycisk Zapisz bez zmieniania czegokolwiek. To przebudowuje reguły przepisywania adresów i usuwa błędy 404 na podstronach.",[10,561,562,567,568,36,571,574,575,577],{},[550,563,564,565,190],{},"Zajrzyj do ",[14,566,405],{}," Stałe ",[14,569,570],{},"WP_HOME",[14,572,573],{},"WP_SITEURL"," nadpisują wartości z bazy, więc dopóki zostaje w nich stary adres, zmiana w ",[14,576,31],{}," niczego nie da:",[76,579,583],{"className":580,"code":581,"language":582,"meta":81,"style":81},"language-php shiki shiki-themes one-dark-pro","define( 'WP_HOME', 'https://nowa-domena.pl' );\ndefine( 'WP_SITEURL', 'https://nowa-domena.pl' );\n","php",[14,584,585,604],{"__ignoreMap":81},[85,586,587,590,593,596,599,601],{"class":87,"line":88},[85,588,589],{"class":242},"define",[85,591,592],{"class":109},"(",[85,594,595],{"class":99}," 'WP_HOME'",[85,597,598],{"class":109},",",[85,600,157],{"class":99},[85,602,603],{"class":109}," );\n",[85,605,606,608,610,613,615,617],{"class":87,"line":116},[85,607,589],{"class":242},[85,609,592],{"class":109},[85,611,612],{"class":99}," 'WP_SITEURL'",[85,614,598],{"class":109},[85,616,157],{"class":99},[85,618,603],{"class":109},[10,620,621,624],{},[550,622,623],{},"Ustaw przekierowania ze starej domeny."," Przekierowanie stałe 301 przenosi na nową domenę wypracowaną pozycję w wyszukiwarce. Tymczasowe 302 tego nie zrobi.",[22,626,628],{"id":627},"multisite-to-osobna-historia","Multisite to osobna historia",[10,630,631,632,36,635,638,639,642],{},"W instalacji wielowitrynowej adresy siedzą dodatkowo w ",[14,633,634],{},"wp_blogs",[14,636,637],{},"wp_site",", a każda witryna ma własny zestaw tabel z numerem w prefiksie. Zapytania z tego tekstu obejmą wyłącznie witrynę główną. Przy multisite użyj WP-CLI z parametrem ",[14,640,641],{},"--url"," wskazującym konkretną witrynę.",[22,644,646],{"id":645},"w-jakiej-kolejności-to-robić","W jakiej kolejności to robić",[10,648,649],{},"Przy przenoszeniu stron klientów trzymam się tej samej kolejności. Najpierw kopia bazy i plików. Potem import na nowy serwer bez dotykania adresów. Dopiero gdy strona odpowiada pod nowym adresem, choćby krzywo, robię zamianę przebiegiem próbnym i sprawdzam liczbę trafień.",[10,651,652,653,655,656,658,659,190],{},"Zero trafień znaczy, że adres w bazie zapisany jest inaczej, niż zakładam — najczęściej z ",[14,654,200],{}," zamiast ",[14,657,196],{}," albo z przedrostkiem ",[14,660,204],{},[22,662,664],{"id":663},"trzy-pytania-które-i-tak-padną","Trzy pytania, które i tak padną",[10,666,667,670],{},[550,668,669],{},"Czy da się to zrobić bez dostępu do bazy?","\nTak, wtyczką Better Search Replace z poziomu kokpitu. Ma tryb podglądu, który pokazuje liczbę zmian przed ich wykonaniem, i poprawnie obsługuje dane serializowane.",[10,672,673,676],{},[550,674,675],{},"Dlaczego po zmianie adresu widzę błąd 404 na podstronach?","\nReguły przepisywania adresów zostały zapisane dla starej domeny. Wejdź w Ustawienia, Bezpośrednie odnośniki i kliknij Zapisz — to je przebuduje.",[10,678,679,682,683,36,686,689],{},[550,680,681],{},"Czy trzeba zmieniać adresy w plikach motywu?","\nZwykle nie, o ile motyw buduje odnośniki funkcjami WordPressa. Sprawdź ",[14,684,685],{},"header.php",[14,687,688],{},"functions.php"," pod kątem adresów wpisanych na sztywno, bo zamiana w bazie ich nie obejmie. W motywach pisanych od zera tego problemu nie ma, bo adresy budowane są funkcjami od początku.",[691,692],"hr",{},[10,694,695],{},"Migracja to moment, w którym najłatwiej coś przeoczyć, a skutki wychodzą tygodniami. Zrób kopię bazy przed zamianą, użyj WP-CLI zamiast surowego SQL-a i przejdź listę z góry, zanim uznasz przeprowadzkę za zakończoną.",[697,698,699],"style",{},"html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}",{"title":81,"searchDepth":116,"depth":116,"links":701},[702,703,704,705,706,707,708,709,710,711],{"id":24,"depth":116,"text":25},{"id":70,"depth":116,"text":71},{"id":131,"depth":116,"text":132},{"id":211,"depth":116,"text":212},{"id":451,"depth":116,"text":452},{"id":519,"depth":116,"text":520},{"id":545,"depth":116,"text":546},{"id":627,"depth":116,"text":628},{"id":645,"depth":116,"text":646},{"id":663,"depth":116,"text":664},"2026-09-12","Po zmianie adresu obrazki i linki wciąż prowadzą do starej domeny. Komenda WP-CLI, gotowe zapytania SQL i dwie pułapki, które po cichu psują bazę.","md","WordPress",{},"/img/blog/zmiana-domeny-wordpress-aktualizacja-bazy-danych.jpg","Praca przy kodzie na ekranie komputera","/zmiana-domeny-wordpress-aktualizacja-bazy-danych",{"title":5,"description":713},{"loc":719},"zmiana-domeny-wordpress-aktualizacja-bazy-danych",false,null,"SIhcHBq-3cYXvmXACdWXQpcpJO7Gv45YQA-uzJNenew",1789981061228]