# Lassú Frissítések oldalak nagy hálózatoknál

> Opcionális lapozó kódrészlet a Custom Dashboard kiegészítővel, ha több száz Child-webhelynél lelassulnak a Frissítések oldalai.

Ez a fejezet olyan rendszergazdáknak szól, akik több száz Child-webhelyet kezelnek, és náluk már lassúak vagy nem reagálnak a **Frissítések** oldalak. Ha az oldalak normálisan töltenek be és reagálnak, maradj az alapértelmezett működésnél: a nagy webhelyszám önmagában nem ok a kódrészlet használatára.

A frissítési listák sok bővítmény-, sablon- és webhelysort tartalmazhatnak, az összecsukott szakaszokban lévőket is. Ezek megjelenítése jelentős terhelést ró a böngészőre. A kerülőmegoldás korlátozza az egy listába betöltött webhelyek számát, és lapozóvezérlőket ad, így kisebb csomagokban dolgozhatod végig a hálózatot.

A beépített lapozás a **Frissítések** oldalakhoz tervben van, határidő nélkül. Az alábbi kódrészlet ideiglenes, opcionális megoldás.

Előfeltétel: több száz csatlakoztatott Child-webhely, tapasztalható lassúság vagy a böngésző akadozása a **Frissítések** oldalakon, rendszergazdai jog és engedély egyedi PHP szerkesztésére a vezérlőpulton, valamint a **Custom Dashboard** kiegészítő telepítve és bekapcsolva a vezérlőpulton.

## Mikor segít a megoldás

Akkor érdemes használni, ha egy **Frissítések** oldal sokáig tölt, nehezen kezelhetővé válik, vagy nagy frissítési lista megjelenítésekor magas a böngésző processzorhasználata. A megoldás azt csökkenti, hány webhely ad sort az aktuális listához. Nem diagnosztizálja a lassú vezérlőpult minden okát, és nem garantál konkrét betöltési időt. A szerverhibák, a kapcsolati problémák és más kiegészítők adatbetöltése külön hibaelhárítást igényel.

Az oldalméret webhelyeket számol, nem bővítményeket, sablonokat vagy frissítési sorokat. 100 webhelyes oldalnál is lehet egy oldalon több száz frissítés. Azok a webhelyek is beleszámítanak a csomagba, amelyeknél nincs elérhető frissítés.

## A lapozó kódrészlet hozzáadása

1. Nyisd meg a **Kiegészítők → Custom Dashboard** oldalon a **PHP** fület. Közvetlen cím: `/wp-admin/admin.php?page=Extensions-Mainwp-Custom-Dashboard-Extension&tab=php`. Szerkesztés előtt őrizz meg egy másolatot a már ott lévő PHP-kódról.
2. Másold be a teljes alábbi kódblokkot a PHP-szerkesztőbe. Nyitó vagy záró PHP-címke nélkül kell beilleszteni. A szerkesztőben már meglévő, nem kapcsolódó kódrészleteket hagyd meg. A lapozó kódrészletet csak egyszer add hozzá: ha már van korábbi változata, cseréld le, ne vegyél fel másodikat. A megvalósításhoz a teljes kód kell, a navigációs vezérlőkkel együtt.

   ```php
   // MainWP Updates: load sites in pages. Paste WITHOUT an opening PHP tag.
   // Start with 100 sites/page; reduce to 50 if needed. Use a positive whole number.
   ( static function () {
       $per_page = 100;
       if ( ! is_admin() || wp_doing_ajax() ||
           'updatesmanage' !== ( isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '' ) ) {
           return;
       }

       $tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : 'plugins-updates';
       if ( ! in_array( $tab, array( 'plugins-updates', 'themes-updates', 'wordpress-updates', 'translations-updates' ), true ) ) {
           return;
       }

       $state = null;
       $get_state = static function () use ( &$state, $per_page ) {
           if ( null !== $state ) {
               return $state;
           }
           $db = \MainWP\Dashboard\MainWP_DB::instance();
           $is_staging = 'no';
           if ( ( is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' ) ||
               is_plugin_active( 'mainwp-timecapsule-extension/mainwp-timecapsule-extension.php' ) ) &&
               'staging' === \MainWP\Dashboard\MainWP_System_Utility::get_select_staging_view_sites() ) {
               $is_staging = 'yes';
           }
           // Count the connected, accessible sites without fetching update JSON.
           $params = array( 'connected' => 'yes', 'is_staging' => $is_staging, 'count_sql' => true, 'others_fields' => array() );
           if ( \MainWP\Dashboard\MainWP_System::instance()->is_multi_user() ) {
               $params['where'] = 'wp.userid = ' . (int) get_current_user_id();
           }
           $total = (int) $db->get_var_field( $db->get_sql_websites_for_current_user_by_params( $params ) );
           $pages = max( 1, (int) ceil( $total / $per_page ) );
           $current = 1;
           if ( isset( $_GET['current_page'], $_GET['_opennonce'] ) &&
               wp_verify_nonce( sanitize_key( wp_unslash( $_GET['_opennonce'] ) ), 'mainwp-admin-nonce' ) ) {
               $current = max( 1, (int) $_GET['current_page'] );
           }
           $state = array( 'total' => $total, 'pages' => $pages, 'current' => min( $current, $pages ) );
           return $state;
       };

       add_filter( 'mainwp_manage_updates_limit_loading', static function ( $limit, $context ) use ( $per_page ) {
           return 'updates' === $context ? $per_page : $limit;
       }, 10, 2 );

       // Keep this request's page stable even if another admin opens a different page.
       add_filter( 'mainwp_get_sql_websites', static function ( $params ) use ( $per_page, $get_state ) {
           if ( ! empty( $params['limit_sites'] ) && isset( $params['connected'] ) && 'yes' === $params['connected'] ) {
               $state = $get_state();
               $params['per_page'] = $per_page;
               $params['page'] = $state['current'];
           }
           return $params;
       }, 100 );

       add_action( 'mainwp_updates_after_nav_tabs', static function () use ( $per_page, $get_state, $tab ) {
           $state = $get_state();
           $first = $state['total'] ? ( $state['current'] - 1 ) * $per_page + 1 : 0;
           $last = min( $state['total'], $state['current'] * $per_page );
           echo '<div id="bk-updates-site-pages" class="ui segment" style="margin:1em 0">';
           echo '<strong>' . esc_html( sprintf( 'Sites %d-%d of %d | Page %d of %d', $first, $last, $state['total'], $state['current'], $state['pages'] ) ) . '</strong>';
           if ( $state['pages'] > 1 ) {
               $base = add_query_arg( array(
                   'page' => 'UpdatesManage', 'tab' => $tab,
                   'current_page' => 999999999, '_opennonce' => wp_create_nonce( 'mainwp-admin-nonce' ),
               ), admin_url( 'admin.php' ) );
               $links = paginate_links( array(
                   'base' => str_replace( '999999999', '%#%', $base ), 'format' => '',
                   'current' => $state['current'], 'total' => $state['pages'],
                   'type' => 'array', 'prev_text' => 'Previous', 'next_text' => 'Next',
                   'add_args' => false,
               ) );
               echo '<nav aria-label="Updates site pages" style="display:flex;flex-wrap:wrap;gap:.5em">';
               foreach ( $links as $link ) {
                   echo '<span class="ui small basic label">' . wp_kses_post( $link ) . '</span>';
               }
               echo '</nav>';
           }
           echo '</div>';
       } );
   } )();
   ```

3. Kattints a **Save Changes** gombra. Ha a szerkesztő szintaktikai hibát jelez, ellenőrizd, hogy a teljes blokkot másoltad-e be, PHP-címke és Markdown-kódkerítés nélkül.
4. Nyisd meg a **Frissítések → Bővítmények** oldalt (közvetlen cím: `/wp-admin/admin.php?page=UpdatesManage&tab=plugins-updates`). A lista fölött megjelenik a webhelytartomány és az oldalszám. A számozott oldalakkal, a **Previous** és a **Next** hivatkozással léphetsz a csomagok között. A kódrészlet a **Sablonok**, a **WordPress** és a **Fordítások** frissítési oldalakra is érvényes, amikor azok elérhetők.

A kódrészlet alapból 100 webhelyet tölt be oldalanként.

## A webhelyek számának megválasztása oldalanként

A kódrészlet tetején lévő alapértelmezett sor:

```php
$per_page = 100;
```

Ha a lista még így is nehéz, módosítsd erre:

```php
$per_page = 50;
```

Mentsd a kódrészletet, és nyisd meg újra a **Frissítések → Bővítmények** oldalt, így az első oldalról indulsz. Pozitív egész számot használj. A kisebb csomagok kevesebb sort töltenek be egyszerre, de több oldalváltást kívánnak. A legjobb érték attól függ, hány frissítés van egy-egy webhelyen, és mennyire érzed gyorsnak a listát.

## A megoldás korlátai

| Elem | Viselkedés a kódrészlettel |
|---|---|
| A frissítési lista és a darabszámai | Az aktuális oldalon lévő webhelyek frissítéseit tartalmazzák. |
| A listában lévő tömeges frissítési műveletek | A betöltött webhelyoldalra vonatkoznak. A teljes hálózathoz oldalanként végig kell menned. |
| Az oldalsáv frissítési összesítői | Továbbra is a teljes hálózatot mutatják, ezért magasabbak lehetnek, mint az aktuális lista darabszámai. |
| Globális figyelmen kívül hagyás | Továbbra is globálisan érvényes, a lapozás nem szűkíti. |
| Elem-, webhely- és címkenézet | Az éppen betöltött csomag frissítéseit csoportosítják. A csoportosítás váltása nem tölti be a hálózat többi részét. |
| Automatikus frissítések és szinkronizálási ütemezések | A kódrészlet nem állítja be és nem módosítja őket. |
| Más vezérlőpult-oldalak és kiegészítők | Nem kapnak lapozást a kódrészlettől. A Lighthouse-jelentések adatbetöltését sem érinti. |

A kódrészlet egyedi PHP-t ad a meglévő MainWP-hookokhoz, a MainWP bővítményfájljait nem módosítja. A hookok és az oldalak viselkedése a későbbi kiadásokban változhat: távolítsd el a kerülőmegoldást, amikor áttérsz a beépített lapozásra.

## A lapozóvezérlők hibaelhárítása

### Nincs Next vagy Previous hivatkozás

A vezérlők csak akkor jelennek meg, ha a jogosult csatlakoztatott webhelyek több oldalra oszlanak. Ha az összes belefér a beállított korlátba, a webhelytartomány megjelenik, de nincs második oldal.

### Egy oldalon nincs elérhető frissítés

Egy csomagban lehetnek olyan webhelyek, amelyeknél a kiválasztott kategóriában nincs frissítés. A lapozóvezérlőkkel lépj tovább. Az üres csomag nem jelenti, hogy az egész hálózat naprakész.

### Egy régi oldalhivatkozás az első oldalra visz

A lapozási hivatkozások időkorlátos WordPress-nonce-t tartalmaznak. Nyisd meg újra a **Frissítések → Bővítmények** oldalt, és a friss vezérlőket használd, ne mentett lapozási címet.

### Az oldal még mindig lassú

Csökkentsd az oldalankénti webhelyek számát, és hasonlítsd össze a reakcióidőt. Ha alig javul, távolítsd el a kódrészletet az alábbiak szerint, és fordulj a MainWP támogatásához: add meg az érintett frissítési fület, a webhelyek hozzávetőleges számát, és hogy a késés az oldal betöltésekor vagy a lista használatakor jelentkezik.

## A kerülőmegoldás eltávolítása

1. Nyisd meg a **Kiegészítők → Custom Dashboard → PHP** oldalt (`/wp-admin/admin.php?page=Extensions-Mainwp-Custom-Dashboard-Extension&tab=php`).
2. Csak a lapozó kódrészletet töröld, és kattints a **Save Changes** gombra. A nem kapcsolódó PHP-kódot hagyd meg.
3. Töltsd újra a **Frissítések → Bővítmények** oldalt: a MainWP visszatér a normál, teljes listás betöltéshez.
