And-MenuManager
Nagy méretű (több száz / több ezer oldalas) oldalstruktúrák navigációs menüinek gyors, stabil kezelése. Szabályalapú menük, automatikus aloldal-hozzáadás, drag & drop rendezés, szerepkör alapú hozzáférés és modern, minimalista kezelőfelület.
Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/galandras12/and-menumanager/archive/refs/heads/main.zipWordPress admin plugin több száz / több ezer oldalas oldalstruktúrák navigációs menüinek kezelésére.
A beépített WordPress menükezelő minden menüpontot külön bejegyzésként (nav_menu_item) tárol, és a szerkesztőben egyszerre tölti be az összes oldalt. Néhány száz aloldal fölött ez belassul, lefagy, vagy időtúllépéssel elszáll. Az And-MenuManager ezt a problémát az alapoknál oldja meg.
Mitől gyors?
| Beépített WordPress menü | And-MenuManager | |
|---|---|---|
| Tárolás | minden menüpont = 1 bejegyzés + 8-10 metaadat | menünként néhány szabály-elem |
| 800 aloldal a menüben | ~800 bejegyzés + ~7000 meta sor | 1 sor (egy szabály: „ez az oldal + minden aloldala”) |
| Szerkesztő betöltése | az összes oldal egyszerre, teljes objektumként | csak a szabály-elemek, az aloldalak igény szerint, lapozva |
| Új aloldal | kézzel hozzá kell adni | magától megjelenik |
| Oldallista lekérdezése | teljes WP_Post objektumok |
egyetlen szűk oszloplistás lekérdezés, gyorsítótárazva |
Három tervezési döntés adja a sebességet:
- Szabályalapú menü. A menü nem tárolja az aloldalakat, hanem egy szabályt tárol róluk. A tényleges fa megjelenítéskor áll össze, és gyorsítótárba kerül.
- Oldalhierarchia-index. Egyetlen lekérdezés hozza az összes oldal azonosítóját, szülőjét, címét és slugját (nem teljes bejegyzés-objektumokat), ebből épül a fa. Ez memóriában marad, így a permalinkek előállítása sem indít lekérdezéseket. Nagyon nagy oldalszám fölött (alapból 25 000) automatikusan „közvetlen” módra vált, ahol csak az éppen kért szint kerül lekérdezésre.
- A felület soha nem rajzol ki több ezer sort. A fában csak a szabály-elemek látszanak; az aloldalak kinyitásra, lapozva töltődnek be.
Funkciók
Menükezelés
- Korlátlan számú menü, kereséssel és lapozással
- Drag & drop rendezés tetszőleges mélységben, körkörös hivatkozás elleni védelemmel
- Billentyűzetes mozgatás is (↑ ↓ → ←) az akadálymentességért
- Oldal, bejegyzés, egyedi link, archívum és nem kattintható címsor mint menüelem
- Menü másolása, exportálás / importálás JSON-ben
Automatizmusok
- Aloldalak automatikus hozzáadása – bekapcsolható elemenként; az új aloldalak azonnal megjelennek, kézi beavatkozás nélkül
- Automatikus mélységkorlát elemenként és menü szinten
- Automatikus rendezés: oldal sorrend (
menu_order), cím, slug vagy dátum szerint - Új gyökér-oldal automatikus felvétele a kiválasztott menü(k)be
- Árva elemek takarítása: törölt oldal menüpontja magától eltűnik
- Élő címek: az oldal átnevezésekor a menü is frissül (kivéve, ahol felülírtad a címkét)
- Időzített megjelenés: menüpontonként kezdő és záró időpont
- Szerepkör alapú láthatóság: menüpont csak bejelentkezve / kijelentkezve / adott szerepköröknek
- Napi karbantartás: állapotjelentés és gyorsítótár-előmelegítés cronból
Szülő oldalak és kizárások
- Bármely oldal felvehető menügyökérként (a „Tartalom hozzáadása” panelről, kereséssel vagy lefúrással)
- Az automatikusan megjelenő aloldalak egyenként elrejthetők (kizárás) és visszakapcsolhatók
- Az automatikus aloldal rögzíthető külön menüelemként, ha át kell nevezni vagy sorba rendezni
- A menü élő előnézete egy kattintással
Beillesztés
| Mód | Használat |
|---|---|
| Sablonpozíció | Beállítások → Sablonpozíciók: a téma menühelyére (pl. felső navigáció) rendelve, a téma módosítása nélkül |
| Blokk | „And-MenuManager menü” blokk a szerkesztőben (élő előnézettel) |
| Widget | „And-MenuManager menü” widget az oldalsávba |
| Shortcode | [amm_menu id="fomenu" style="horizontal" depth="2"] |
| Sablonfüggvény | <?php amm_menu( 'fomenu' ); ?> |
Megjelenési módok: függőleges, lenyíló (harmonika), vízszintes (lenyíló almenükkel), oszlopos (nagy menükhöz).
Hozzáférés
Két saját jogosultság, szerepkörönként külön bekapcsolható a Beállítások → Hozzáférés mátrixban:
amm_manage_menus– menük szerkesztéseamm_manage_settings– beállítások és hozzáférés kezelése
Az adminisztrátor jogosultsága nem vehető el, így nem lehet kizárni magad a felületről.
Telepítés
- Másold a plugin mappáját a
wp-content/plugins/and-menumanagerkönyvtárba. - Aktiváld a WordPress bővítménykezelőjében.
- Nyisd meg a bal oldali Menükezelő menüpontot.
Aktiváláskor létrejön két saját tábla ({prefix}amm_menus, {prefix}amm_items), és az adminisztrátor megkapja a jogosultságokat.
Átállás a meglévő menükről
A Menükezelő → WordPress menük átemelése gomb a beépített menüket másolatként áthozza, a sablonpozíció-hozzárendelésekkel együtt. Az eredeti WordPress menük érintetlenek maradnak, így bármikor visszaállhatsz.
Első lépések nagy oldalszámnál
- Hozz létre egy menüt (Új menü).
- A jobb oldali Tartalom hozzáadása panelen keresd meg a fő szülő oldalt, és add hozzá (
+). - A fában az elem alatt megjelenik az „Aloldalak automatikusan” jelölés a darabszámmal – ez egyetlen szabály, nem több száz sor.
- Az Aloldalak kezelése gombbal nyisd ki a listát, és rejtsd el, amit nem szeretnél megjeleníteni.
- A Menü fülön állítsd be a megjelenést és a mélységkorlátot, majd a Beállítások → Sablonpozíciók alatt rendeld a téma menühelyéhez.
WP-CLI
wp amm list-menus # menük és méretük
wp amm flush # gyorsítótár ürítése
wp amm prewarm # oldalindex előmelegítése
wp amm import-core # beépített WordPress menük átemelése
wp amm purge-orphans # árva menüelemek törlése
wp amm export --file=menuk.json
Fejlesztőknek
Sablonfüggvények
amm_menu( 'fomenu', array( 'style' => 'horizontal', 'depth' => 2 ) ); // kiírja
$html = amm_get_menu( 'fomenu' ); // visszaadja
$tree = amm_get_menu_tree( 'fomenu' ); // nyers fa tömbként
amm_menu_exists( 'fomenu' );
Hookok
apply_filters( 'amm_resolved_tree', $tree, $menu ); // a feloldott fa
apply_filters( 'amm_menu_html', $html, $menu, $args ); // a kész HTML
apply_filters( 'amm_item_visible', $visible, $item ); // egyedi láthatósági szabály
apply_filters( 'amm_post_statuses', $statuses ); // figyelembe vett státuszok
apply_filters( 'amm_cache_context_parts', $parts ); // gyorsítótár-kulcs (pl. többnyelvűséghez)
do_action( 'amm_menu_created', $menu_id, $data );
do_action( 'amm_menu_updated', $menu_id, $data );
do_action( 'amm_menu_deleted', $menu_id );
do_action( 'amm_auto_added_item', $menu_id, $post_id );
REST API
Névtér: /wp-json/and-menumanager/v1 – menus, menus/{id}/tree, menus/{id}/items, menus/{id}/reorder, menus/{id}/exclusions, objects, settings, roles, tools/{action}, health, export, import.
Felépítés
and-menumanager.php bootstrap, autoloader
includes/
class-amm-plugin.php komponensek összefűzése
class-amm-installer.php táblák, verziókezelés
class-amm-pages.php oldalhierarchia-index (a sebesség lelke)
class-amm-tree.php szabályok feloldása fává
class-amm-renderer.php HTML kimenet
class-amm-cache.php verziószámos gyorsítótár
class-amm-automations.php tartalomváltozásra reagáló automatizmusok
class-amm-rest.php REST végpontok
class-amm-admin.php admin felület betöltése
class-amm-importer.php import / export / átállás
class-amm-cli.php WP-CLI parancsok
assets/ admin és látogatói oldali CSS + JS (build lépés nélkül)
blocks/menu/ Gutenberg blokk
Gyorsítótár
Minden menü feloldott fája gyorsítótárba kerül (objektum-cache, ha van; egyébként transient). Az érvénytelenítés verziószám-léptetéssel történik, így soha nem kell több ezer kulcsot törölni. A cache automatikusan ürül, ha egy oldal címe, slugja, szülője, sorrendje vagy státusza megváltozik – más mentések nem indítanak felesleges újraépítést.
Verziók
0.5.3
- Javítva: a sablonpozíciós menü szétesett a témában. A plugin saját osztályokkal (
amm-item,amm-submenu,amm-link) és egy extra nyitógombbal adta ki a menüt, amit a téma CSS-e nem ismert fel – ezért csúsztak szét a menüpontok. Sablonpozíción a kimenet mostantól a WordPress beépített menüjével azonos:menu-item,menu-item-type-*,menu-item-object-*,menu-item-has-children,sub-menu,current-menu-item,current-menu-ancestor,current-menu-parent. A link csupasz<a href>, extra elem nélkül, és nem kerül bele saját nyitógomb – az almenüket a téma saját szkriptje kezeli, ahogy a beépített menünél is. - A menüpont egyedi CSS osztálya továbbra is megmarad, a plugin sajátjai nem kerülnek ki.
- Ez a kimenet a shortcode-ból is kérhető:
[amm_menu id="fomenu" compat="1"]. A widget, a blokk és az alapértelmezett shortcode továbbra is a plugin saját, önálló stílusát használja. - Szűrővel kikapcsolható:
add_filter( 'amm_theme_location_compat', '__return_false' );
0.5.2
- Javítva: a menü kétszer jelent meg a látogatói oldalon, ha sablonpozícióhoz (pl. „Elsődleges menü”) volt rendelve. A
pre_wp_nav_menuszűrő kiírta a menüt és vissza is adta, a WordPress pedig a visszaadott értéket még egyszer kiírta. A szűrő mostantól csak visszaad — a kiírás a WordPress dolga. - A téma
menu_idértéke rákerül a<ul>elemre, így a témára írt CSS (pl.#primary-menu) továbbra is illeszkedik. - Ha a téma kifejezetten konténer nélkül kéri a menüt (
container => false), a plugin sem tesz köré sajátot — így nem esik szét a téma elrendezése.
0.5.1
- Javítva: a fa visszaugrott a tetejére. Egy menüpontra kattintva a felület újraépítette a teljes fát, így több száz elemnél minden kijelölés után vissza kellett görgetni. A kijelölés most már csak az érintett sorok jelölését és az oldalsó panelt frissíti, a fa DOM-ja marad; a többi újrarajzolás (mentés, hozzáadás, törlés, ki- és becsukás) pedig megőrzi a görgetési pozíciót a fában, a menülistában és a választóban is.
0.5
-
Javítva: a hozzáadott oldal rossz helyre került. A „Tartalom hozzáadása” panelről felvett oldal
parent_id = 0értékkel mentődött, vagyis a menü gyökérszintjének a végére – egy több száz elemes menüben ez gyakorlatilag megtalálhatatlan. Mostantól a plugin felfelé haladva megkeresi az oldal legközelebbi olyan ősét, ami már szerepel a menüben, és az alá teszi. -
Odagörgetés és kiemelés. Hozzáadás után a felület a fában odaugrik az új menüponthoz, megvillantja, és az értesítés is kiírja, melyik menüpont alá került.
-
Új: „Hiányzó aloldalak pótlása”. Menünként (Menü fül) és minden menüre (Beállítások → Karbantartás). Végigjárja a menü oldalra mutató elemeit, és minden hiányzó aloldalt felvesz alájuk valódi menüpontként, a kizárásokat tiszteletben tartva. Ez a tételesen tárolt, WordPressből átemelt menükhöz való.
A „pótlás” és a „szinkronizálás” két út ugyanahhoz a célhoz: a pótlás valódi menüpontokat hoz létre (a meglévő, tételes szerkezetbe illeszkedve), a szinkronizálás pedig szabályt kapcsol be, ami az összes – és minden ezután létrehozott – aloldalt magától megjeleníti, sorok létrehozása nélkül.
0.4
- Javítva: az átemelés elakadása nagy menüknél. Minden egyes menüpont beszúrása után lefutott egy külön adatbázis-írás és egy teljes gyorsítótár-ürítés (opció-írással). Ezer menüpontnál ez ezer fölösleges írás volt, ami időtúllépésbe vihette a kérést – miközben a szerver a háttérben tovább dolgozott. A kötegelt műveletek (átemelés, tömeges hozzáadás, aloldal-szinkron) mostantól felfüggesztik a gyorsítótárat, és egyszer, a végén ürítenek.
- Javítva: üres hibasáv. Hálózati hiba vagy időtúllépés esetén a hibaobjektum gyakran üres, ezért a piros sáv szöveg nélkül jelent meg. A hibaszöveg most több forrásból áll össze (üzenet, hibakód, HTTP állapot), és soha nem üres.
- Élő állapotkövetés. Hosszú művelet közben a folyamatsáv 3 másodpercenként mutatja az aktuális menü- és menüpontszámot, a bal oldali lista elemszámai pedig a felület újraépítése nélkül frissülnek – nem kell újratölteni az oldalt.
- Követés megszakadt kérés után. Ha a kérés elhal, de a szerver tovább dolgozik, a felület figyeli a menüpontok számát; amikor az három körön át nem változik, lezárja a folyamatot és frissít. A követés kézzel is leállítható.
- Aloldalak szinkronizálása. Új gomb menünként (Menü fül) és az összes menüre (Beállítások → Karbantartás), választható mélységgel. Minden olyan menüpontnál bekapcsolja az automatikus aloldal-kezelést, aminek van aloldala – így a WordPress menüből kimaradt aloldalak is megjelennek, új menüpontok létrehozása nélkül.
- Hibanapló. A Beállítások oldal végén időbélyeggel gyűjti a szerver- és felületoldali hibákat (legfeljebb 200 bejegyzés),
.txtfájlba exportálható. A „Gyorsítótár ürítése” gomb a naplót is kiüríti.
0.3
- A „WordPress menük átemelése” újrafuttatható, és nem duplikál. A korábban átemelt menüket megkeresi (elmentett eredet, majd slug és név szerint – így a 0.3 előtt átemelt menük is felismerhetők), összeveti a WordPress menü tartalmával, és csak a hiányzó menüpontokat pótolja. A kézzel hozzáadott elemeket érintetlenül hagyja, csak jelenti őket. A művelet végén összefoglalót ad: hány menü jött létre, hány lett újraellenőrizve, hány menüpont pótlódott.
- A sablonpozíciót az újraellenőrzés csak akkor tölti ki, ha az még üres – a szándékosan másra állított pozíciót nem írja felül.
- Azonos nevű menü létrehozásakor buborék kérdez rá: „Ezen a néven már van egy menü… Szeretnél létrehozni még egyet ugyanezen a néven?” Az ellenőrzés a szerveren fut, így a szűrt vagy lapozott lista sem téveszti meg. Ha az ellenőrzés nem fut le, nem blokkolja a munkát.
- A hosszabb műveletek futás közben pörgő ikont mutatnak a megnyomott gombon (a felirat is átvált, pl. „Átemelés folyamatban…”), és a felület tetején egy folyamatjelző sáv is megjelenik. Érintett műveletek: WordPress menük átemelése, gyorsítótár ürítése, oldalindex előmelegítése, árva elemek törlése, kijelölt oldalak tömeges hozzáadása.
- A futó művelet gombja a befejezésig letiltva marad, így egy kattintással nem indítható el kétszer.
- A jelzés
aria-busyésaria-liveattribútumokkal képernyőolvasóval is követhető, és tiszteletben tartja a csökkentett mozgás (prefers-reduced-motion) beállítást.
0.2
- Javítva: a REST hívások sima (nem „szép”) permalink-beállítás mellett elromlottak. A REST gyökér ilyenkor maga is lekérdezés-paraméter (
?rest_route=…), így a hozzáfűzött paraméterek egy második?-et eredményeztek, és az útvonal érvénytelen lett. Emiatt az új menü létrejött ugyan az adatbázisban, de a lista sosem töltődött be, így nem jelent meg. A felület mostantól awp.apiFetch-et használja, ami mindkét URL-formát kezeli. - Az Új menü létrehozása a felületbe épített beviteli mezővel történik, felugró böngészőablak helyett (Enter is elküldi, Esc bezárja).
- Menü a Beállítások oldalról is létrehozható.
- A hibák tartós hibasávban jelennek meg a felület tetején, nem csak néhány másodpercre felvillanó értesítésben, és a szerver hibaüzenete is látszik.
- Önjavító adatbázis-ellenőrzés: ha a táblák hiányoznak (pl. félbemaradt aktiválás miatt), a plugin újra létrehozza őket. A Beállítások → Állapot panel kiírja a táblák, a séma és a plugin állapotát.
0.1
- Első kiadás.
Követelmények
- WordPress 5.8+
- PHP 7.4+
Licenc
GPL-2.0-or-later