Technikai

WordPress átírási szabályok ütközése: amikor egy bővítmény elviszi az URL-eidet

Egy WordPress foglalási rendszer vagy webshop bővítmény elviheti a meglévő URL-eidet. Így találod meg az átírási szabályok ütközését WP-CLI-vel.

Scheo · · Frissítve: · olvasási idő ~10 perc · Szerző: Schmidt Péter

A lényeg dióhéjban: A WordPress minden kérést egy regex-alapú átírási szabálylistán enged át, és az első illeszkedő szabály nyer. Ha egy webshop bővítmény vagy egy WordPress foglalási rendszer ugyanarra az útvonal-előtagra regisztrál, mint egy meglévő oldalad, az oldal nem törlődik, csak soha nem kerül rá a sor, és 404-et kapsz. Foglalási rendszert ezért érdemes úgy választani, hogy az előtagja felületről átírható legyen, és aktiválás előtt staging környezetben összevesd a szabálylistát a meglévő oldalaid slugjaival.

Ha egy WordPress oldalon egyik napról a másikra 404-et ad a webhely fele, a keresés általában a szerveren indul. Megnézed a tárhelyet, a .htaccess fájlt, a PHP-hibanaplót, és semmi. Közben a válasz többnyire egy szinttel feljebb van, a WordPress saját átírási szabálykészletében, ahol két bővítmény ugyanarra az útvonal-előtagra pályázik, és az nyer, amelyik előrébb került a listán. Ez a cikk végigviszi, hogyan épül fel ez a lista, mi rontja el, és hogyan találod meg a tettest húsz perc alatt.

WordPress átírási szabályok ütközése: amikor egy bővítmény elviszi az URL-eidet
WordPress átírási szabályok ütközése: amikor egy bővítmény elviszi az URL-eidet

Hogyan dönti el a WordPress, melyik oldalt mutassa egy URL-re?

A WordPress egyetlen kérést sem old fel fájlként. Minden bejövő URL az index.php fájlba fut be, és egy regex-listán halad végig, amíg valamelyik minta nem illeszkedik rá. Hivatalosan igazolt, hogy ezt a listát a WP_Rewrite osztály építi fel, és a wp_options táblában, a rewrite_rules kulcs alatt tárolódik szerializált tömbként.

Egy sor a listában két részből áll, egy mintából és egy lekérdezésből. A minta illeszkedik az URL útvonal-részére, a lekérdezés pedig megmondja a WordPress-nek, mit keressen az adatbázisban. Így néz ki egy tipikus pár.

(.?.+?)/page/?([0-9]{1,})/?$ párja index.php?pagename=$matches[1]&paged=$matches[2]

A lényeg a sorrend. A lista tetején az úgynevezett top rules állnak, alul a bottom rules, és a feldolgozás az elsőtől halad lefelé. Amint egy minta illeszkedik, a WordPress megáll, lefuttatja a hozzá tartozó lekérdezést, és ami utána jönne, azt meg sem nézi. Az oldalak (page) gyűjtőszabálya, a (.?.+?)/?$, a lista legvégén ül, mert bármire illeszkedik. Ez a részlet magyarázza a 404-esek nagy részét.

Miért viszi el egy webshop vagy foglalási bővítmény a meglévő útvonalaidat?

Mert saját tartalomtípust regisztrál, és ahhoz saját előtagot kér, az új szabály pedig a lista elejére kerül, jóval az oldalak gyűjtőszabálya elé. Az oldalad megvan az adatbázisban, csak soha nem kerül rá a sor.

A bővítmény aktiváláskor vagy az init hookon lefuttat valami ilyesmit.

register_post_type('foglalas', array('public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'szolgaltatasok')));

Ettől a pillanattól kezdve a /szolgaltatasok/ kezdetű útvonalakra a foglalási tartalomtípus szabálya illeszkedik elsőként. Ha neked eddig volt egy Szolgáltatások nevű oldalad, és alatta hat aloldalad, a hat aloldal egyszerre lesz 404-es, mert a foglalási bővítmény szabálya azt mondja a WordPress-nek, hogy keressen egy foglalás típusú bejegyzést ilyen névvel, és olyan nincs.

Ugyanez történik a taxonómiák alapjával is. A WooCommerce termékkategória-alapja gyárilag product-category, magyar telepítéseknél sokan termek vagy kategoria értékre állítják, és ha közben egy másik bővítmény is regisztrál egy termek nevű archívumot, a kettő versenyezni kezd. Hivatalosan igazolt, hogy a WooCommerce ezeket az alapokat a permalink-beállítások képernyőjén engedi felülírni, tehát kódmódosítás nélkül is rendezhető.

Mit jelent a szabályok újragenerálása, és mikor elég a permalink mentése?

Az újragenerálás annyit tesz, hogy a WordPress eldobja a tárolt szabálylistát, és az összes aktív bővítmény és téma regisztrációi alapján újraépíti. Ezt hívja a kód flush_rewrite_rules() néven, és pontosan ez fut le akkor is, amikor a Beállítások, Közvetlen hivatkozások képernyőn megnyomod a Módosítások mentése gombot.

Kétféle újragenerálás van. A soft flush csak az adatbázisban lévő listát írja újra. A hard flush emellett a .htaccess fájlt is újraírja, ami Apache alatt számít, nginx alatt viszont nincs jelentősége, mert ott a szabályokat a szerver konfigurációja tartalmazza. Hivatalosan igazolt, hogy a WordPress fejlesztői dokumentációja költséges műveletnek nevezi a flush-t, és kifejezetten arra kéri a bővítmények íróit, hogy ne minden oldalbetöltésnél hívják meg, hanem csak aktiváláskor.

Saját tapasztalat, hogy a fórumokon örökzöld „mentsd el a permalinkot" tanács azért gyógyít meg annyi esetet, mert a bővítmény frissítéskor új szabályt regisztrált, de az aktiválási hook nem futott le újra, így a tárolt lista elavult maradt. Ilyenkor a mentés tényleg elég.

Amit viszont fontos látni, hogy az újragenerálás nem döntőbíró. Ha két bővítmény ugyanazt az előtagot kéri, a flush után is ugyanaz a kettő fog versenyezni, csak frissen. A flush az elavult listát javítja, az ütközést nem.

Azt, hogy a mentés változtatott-e bármin, egy sorszámlálással is eldöntheted. Futtasd le a wp rewrite list --format=csv | wc -l parancsot a mentés előtt és után. Ha a két szám megegyezik, és a problémás URL ugyanúgy 404-et ad, akkor a lista nem volt elavult, vagyis ütközést keresel, és a következő szakasz lépéseire van szükséged.

Hogyan derítsd ki, melyik szabály viszi el az URL-t?

Az alábbi sor staging környezetben fut le tisztán, éles oldalon csak az első három lépést javaslom. Mindegyikhez WP-CLI kell.

  1. Mentsd el a jelenlegi állapotot, mielőtt bármihez hozzányúlsz. wp option get rewrite_rules --format=json > elotte.json
  2. Kérdezd meg, melyik szabály fogja meg a problémás címet. wp rewrite list --match=/szolgaltatasok/karpittisztitas/ --format=table --fields=match,query,source A source oszlop megmondja, melyik forrásból (page, post-type-archive, category, egyedi) származik a szabály.
  3. Keress ütköző előtagokat a teljes listában. wp rewrite list --format=csv --fields=match,source | grep szolgaltatas Ha ugyanarra az előtagra két különböző source is megjelenik, megvan az ütközés.
  4. Nézd meg, mely tartalomtípusok milyen előtagot kérnek. wp post-type list --fields=name,public,has_archive majd a gyanús típusra wp eval 'print_r(get_post_type_object("foglalas")->rewrite);'
  5. Mentsd el a permalink-beállítást parancssorból, és nézd meg, változik-e a helyzet. wp rewrite flush --hard
  6. Kapcsold ki a gyanús bővítményt, generálj újra, és hasonlítsd össze a két listát. wp plugin deactivate foglalo-bovitmeny && wp rewrite flush && wp option get rewrite_rules --format=json > utana.json majd diff <(jq -S . elotte.json) <(jq -S . utana.json)
  7. Ellenőrizd a választ HTTP-szinten, ne csak böngészőből, mert a böngésző gyorsítótára félrevezet. curl -sI https://pelda.hu/szolgaltatasok/karpittisztitas/ | head -n 1

A hatodik lépés diffje a legbeszédesebb. Ha a bővítmény kikapcsolása után visszakerül a listába az a húsz sor, ami a te oldalaidhoz tartozik, akkor bizonyítottad az ütközést, nem csak feltételezed. Utána kapcsold vissza a bővítményt, és a megoldást az előtag szintjén keresd.

Mit nézz meg, ha hirtelen megszaporodnak a 404-es hibák?

A hirtelen jelző a legfontosabb nyom. Ami egyszerre, sok URL-en romlik el, az szinte sosem tartalmi hiba, hanem szabály- vagy konfigurációs változás. Ez az ellenőrzőlista a leggyorsabb sorrendben halad.

Tényleg hiba ez, vagy csak két bővítmény ugyanarra az előtagra pályázik?

Saját tapasztalat, hogy az ilyen ügyek túlnyomó részében egyik bővítmény sem hibás. Mindkettő pontosan azt csinálja, amit a dokumentációja ígér, csak ugyanaz a szó kellett nekik. A magyar nyelvű telepítéseken a szűkös készlet a probléma, mert a szolgaltatas, termek, foglalas, esemeny, program, blog és kosar előtagokra rengeteg bővítmény pályázik.

Ebből az következik, hogy a hibajegy helyett névtér-osztásra van szükség. A legtöbb komoly bővítmény ad felületi beállítást az előtagjához. Ahol nincs ilyen, ott szűrővel is átírható, és a módosítást egy saját kis bővítménybe vagy a gyerektéma functions.php fájljába érdemes tenni.

add_filter('register_post_type_args', function($args, $type) { if ($type === 'foglalas') { $args['rewrite']['slug'] = 'idopontfoglalas'; } return $args; }, 10, 2);

A szűrő után kötelező egy újragenerálás, különben a régi lista marad. Ami viszont ennél is fontosabb, az a már indexelt címek sorsa. Ha a bővítmény URL-jei hónapok óta élnek, és a keresőben szerepelnek, az előtag megváltoztatása egy új 404-hullámot indít, csak a másik oldalon. Ilyenkor a régi előtagról 301-es állandó átirányítás kell az újra, és a belső linkeket is át kell írni.

Az átirányítás formája attól függ, mi marad a régi előtag alatt. Ha az előtag teljesen kiürül, egyetlen mintaszabály elég. Apache alatt ez a .htaccess fájlba kerül RedirectMatch 301 ^/regi-elotag/(.*)$ /uj-elotag/$1 formában, nginx alatt a szerver konfigurációjába rewrite ^/regi-elotag/(.*)$ /uj-elotag/$1 permanent; alakban.

Ha viszont a régi előtag alatt a saját oldalaid tovább élnek, mint a fenti példában a Szolgáltatások aloldalai, a mintaszabály azokat is elvinné. Ilyenkor listázd ki a bővítmény bejegyzéseit a wp post list --post_type=foglalas --fields=ID,post_name paranccsal, és csak ezekre a címekre vegyél fel egyenkénti átirányítást. A végén ellenőrizd, hová mutat a régi cím. curl -sI https://pelda.hu/regi-elotag/pelda-bejegyzes/ | grep -i location

Mit jelent egy eltűnt URL a keresőnek és az AI-válaszmotoroknak?

Hivatalosan igazolt, hogy a Google a tartósan 404-et adó címeket kiveszi az indexből, és hogy a 301-es átirányítást tekinti az állandó költözés jelzésének. Ez önmagában ismert, a helyreállítás pedig idővel jó eséllyel megtörténik, bár sem a sebességre, sem a korábbi pozíciók visszaszerzésére nincs garancia.

Az AI-válaszmotorok felől nézve a kockázat más súlyú. Szakmai feltételezés, hogy a nyelvi modellekre épülő válaszrendszerek ritkábban és rendszertelenebbül járják újra a forrásaikat, mint a klasszikus keresőrobotok, mert a válaszaikat részben indexelt pillanatképekből és részben élő lekérésből állítják össze. Ha egy ilyen rendszer egyszer megtanulta, hogy egy adott URL-en van a válasz, és az az URL 404-et kezd adni, az idézés megszakad, a hivatkozás pedig a felhasználó szemében is hibásnak látszik. Ezért éri meg egy átirányítási térképet vezetni minden slug-változásról, és ezért nem érdemes az URL-eket kozmetikai okból mozgatni.

Hogyan előzd meg a következő ütközést?

Az egész ügy attól lesz kezelhető, hogy a szabálylistát adatnak tekinted, amit ki lehet íratni, el lehet menteni és össze lehet hasonlítani. Amíg a WordPress útvonal-feloldása fekete doboz marad, minden ilyen eset órákat visz el. Amint kiíratod, tizenöt perc.

Milyen URL-eket hoz létre egy WordPress foglalási rendszer?

Egy WordPress foglalási rendszer jellemzően háromféle útvonalat hoz létre. Az első a saját tartalomtípusok archívuma és egyedi oldalai (szolgáltatás, munkatárs, helyszín, esemény), a második ezek taxonómiái, a harmadik a foglalási folyamat végpontjai. Ütközést az első kettő okoz, mert ezek szabályai kerülnek a lista elejére.

Az, hogy egy adott bővítmény melyiket használja, a felépítésétől függ. Saját tapasztalat, hogy a gyakorlatban négy típussal találkozol.

A magyarított telepítéseken a gond többnyire akkor jelentkezik, amikor valaki a beállításokban az angol alapértelmezett előtagot magyarra írja át, és éppen azt a szót választja, amelyik már oldalként él a webhelyen. Hogy a te telepítéseden mit regisztrált a bővítmény, azt egy szűrt lista megmutatja. wp rewrite list --format=csv --fields=match,source | grep -iE 'foglal|booking|service|appointment|event'

Hogyan válassz WordPress foglalási rendszert úgy, hogy ne üssön ki meglévő oldalakat?

Olyan WordPress foglalási rendszert válassz, amelynek az URL-előtagja felületről átírható, és amelyet aktiválás előtt staging környezetben össze tudsz vetni a meglévő oldalaid slugjaival. A funkciólista mellett ez a két szempont mutatja meg előre, lesz-e 404-hullám a bevezetés napján.

Az alábbi sorrend staging környezetre készült, éles oldalon csak az első lépést futtasd.

  1. Listázd ki a legfelső szintű oldalaid slugjait, mert ezek a foglalt előtagjaid. wp post list --post_type=page --post_parent=0 --fields=ID,post_name,post_title
  2. Nézd meg a bővítmény dokumentációjában, milyen tartalomtípusokat és taxonómiákat regisztrál, és milyen alapértelmezett előtaggal. Ha a dokumentáció erről hallgat, a következő lépés úgyis megmutatja.
  3. Mentsd el a szabálylistát, aktiváld a bővítményt, mentsd el újra, és hasonlítsd össze a kettőt ugyanazzal a diff paranccsal, amit a diagnózisnál láttál. Az új sorok előtagjait vesd össze az első lépés listájával.
  4. Ellenőrizd, hogy az előtag a beállítások között átírható-e. Ha csak szűrővel módosítható, azt a kódot a bővítmény minden nagyobb frissítése után neked kell újra ellenőrizned.
  5. Kapcsold ki, amire nincs szükséged. Több bővítmény engedi, hogy a tartalomtípus archívumát vagy a nyilvános egyedi oldalait letiltsd. Ha a foglalás rövidkóddal megy egy saját oldalon, ezekre az útvonalakra nincs szükség.
  6. Próbáld ki a kikapcsolást is. Deaktiválás és újragenerálás után a bővítmény sorainak el kell tűnniük a listából, a saját oldalaidnak pedig 200-as választ kell adniuk.
  7. Zárd a kört HTTP-szintű ellenőrzéssel a legfontosabb oldalakon, a foglaló oldalt is beleértve.

Szakmai feltételezés, hogy hosszabb távon az jár jobban, aki a keresőből látogatott szolgáltatás-oldalait hagyományos WordPress oldalként tartja, és a foglalót csak beágyazza rájuk. Így ha később foglalási rendszert cserélsz, a naptár változik, az URL-ek viszont a helyükön maradnak, és sem átirányítási térképre, sem újraindexelésre nem lesz szükség.

Források és további olvasnivalók

A legfontosabbak
  • A WordPress nem fájlokat szolgál ki, hanem regex-szabályok sorrendje dönti el, melyik tartalmat mutatja egy URL-re.
  • Az egyedi tartalomtípusok és taxonómiák szabályai a lista elejére kerülnek, az oldalak gyűjtőszabálya a végére, ezért az oldal veszít az ütközésben.
  • Egy WordPress foglalási rendszer saját tartalomtípusokat, taxonómiákat és végpontokat hozhat létre, a rövidkóddal beágyazott foglaló viszont nem regisztrál saját útvonalat.
  • A permalink-beállítás mentése újragenerálja a szabálylistát, de két azonos előtagot nem békít ki.
  • A WP-CLI rewrite list és a szabálylista előtte-utána összehasonlítása perceken belül megmutatja, melyik bővítmény vitte el az útvonalat.
  • Slug-váltás után 301-es átirányítás kell, különben a már indexelt és AI-válaszokban hivatkozott URL-ek megszakadnak.

Gyakori kérdések

Miért lesz 404-es az oldalam, ha az adatbázisban megvan?

Mert a WordPress az URL-t regex-szabályok sorrendjében oldja fel, és az első illeszkedő szabály nyer. Ha egy bővítmény egyedi tartalomtípusa ugyanarra az előtagra regisztrált, az ő szabálya előrébb áll az oldalak gyűjtőszabályánál, így az oldalad lekérdezése soha nem fut le.

Tényleg segít a permalink-beállítás mentése?

Gyakran igen, de csak akkor, ha a tárolt szabálylista elavult, például mert egy bővítmény frissítéskor nem futtatta le az újragenerálást. Két bővítmény azonos előtagját a mentés nem oldja meg, mert az újragenerálás után is ugyanaz a két szabály versenyez.

Melyik WP-CLI paranccsal látom, hogy egy konkrét URL-t melyik szabály visz el?

A wp rewrite list --match=/az/url/ parancs kiírja az illeszkedő szabályokat, a --fields=match,query,source kapcsolóval pedig azt is látod, melyik forrásból származnak. Ez perceken belül megmutatja, hogy oldal, archívum vagy taxonómia szabálya fogta meg a címet.

Mi a különbség a soft és a hard flush között?

A soft flush csak az adatbázisban tárolt szabálylistát írja újra, a hard flush emellett a .htaccess fájlt is. Apache alatt a hard flush számít, nginx alatt nincs jelentősége, mert ott a szabályok a szerver konfigurációjában vannak.

Átírhatom egyszerűen egy bővítmény URL-előtagját?

Technikailag igen, felületi beállítással vagy a register_post_type_args szűrővel, utána egy újragenerálással. Ha viszont a régi címek már indexelve vannak, a váltáshoz 301-es átirányítás is kell a régiről az újra, különben a keresőből és az AI-válaszokból érkező hivatkozások megszakadnak.

Honnan tudom, hogy mikor kezdődött a 404-hullám?

A szerver hozzáférési naplója adja a legpontosabb kezdőpontot, mellette a Search Console lefedettségi jelentése mutatja, mely URL-ek estek ki és mikortól. Ezt érdemes összevetni a bővítmény- és téma-frissítések időpontjaival.

Elronthatja egy WordPress foglalási rendszer a meglévő oldalaim URL-jeit?

Igen, ha saját tartalomtípust regisztrál olyan előtaggal, amelyik alatt már oldalaid élnek. Az oldalak nem törlődnek, de a foglalási rendszer szabálya előrébb áll a listán, ezért az érintett címek 404-et adnak. A rövidkóddal vagy blokkal beágyazott foglaló nem regisztrál saját útvonalat, ott ez a kockázat nem áll fenn.

Mit ellenőrizzek, mielőtt WordPress foglalási rendszert telepítek?

Listázd ki a legfelső szintű oldalaid slugjait, majd staging környezetben mentsd el a szabálylistát a bővítmény aktiválása előtt és után, és hasonlítsd össze a kettőt. Nézd meg azt is, hogy a foglalási rendszer előtagja átírható-e a beállítások között, és hogy kikapcsolás után eltűnnek-e a szabályai.

Források és további olvasnivalók

Ezen az oldalon a hivatalosan igazolt információt elsődleges forrásokból építjük fel; a saját tapasztalatot és a szakmai becslést mindig külön jelöljük a szövegben.

A cikk szerzője

Schmidt Péter, online marketing szakértő, a Scheo Tanácsadó Kft. alapítója. Székesfehérvárról, országosan dolgozó csapattal végzünk keresőoptimalizálást, AI-láthatóság mérést, Google és Meta hirdetéskezelést, weboldalkészítést. Amit itt leírunk, azt ügyfélmunkában is használjuk. Rólunk bővebben · Szolgáltatásaink

Kapcsolódó olvasnivaló

Kapcsolódó

Ha egy AI már hivatkozik egy oldaladra: URL-változtatás és átalakítás szabályai

Kapcsolódó

Lassú adatbázis-lekérdezések azonosítása WordPress oldalon

Kapcsolódó

A fejlesztőm elérhetetlenné vált - ki veszi át a wordpress oldalam karbantartását?: amit tudnod kell róla

Helyi szolgáltatás a környékeden

Országosan dolgozunk, online és személyesen. Válaszd ki a városodat, és nézd meg, hogyan segítünk helyben:

Online marketing & AI SEO SzekszárdOnline marketing & AI SEO SalgótarjánOnline marketing & AI SEO SzékesfehérvárOnline marketing & AI SEO BudapestOnline marketing & AI SEO VeszprémOnline marketing & AI SEO Dunaújváros

Weboldalkészítés városra bontva

Ha először a honlap kell, itt városonként arról írtunk:

Weboldalkészítés DebrecenWeboldalkészítés SzegedWeboldalkészítés MiskolcWeboldalkészítés PécsWeboldalkészítés KecskemétWeboldalkészítés Nyíregyháza

Mind a 20 városunk és az összes szolgáltatás →

15 perces AI-láthatósági gyorselemzés - díjmentesen

Megnézzük három, számodra fontos keresőkérdésnél, hogy megjelenik-e a céged a ChatGPT, a Gemini és a Google AI-válaszaiban, mely versenytársakat ajánlják helyetted, és melyik három területen érdemes először javítani. A weboldaladat előzetesen átnézzük, tehát nem sablonos, automata riportot kapsz.

Adataidat kizárólag a kapcsolatfelvételhez használjuk. Kapcsolat: m@rketinges.hu
💬 Konzultáció