# Kötegelt műveletek az Abilities API-ban

> A 200 webhelynél nagyobb műveletek sorba állítása, az azonnali és a sorba állított válasz, a feladat állapotának lekérdezése és a hibakezelés.

A 200-nál több webhelyet érintő műveletek automatikusan háttérfeladatként, sorba állítva futnak. Ez megelőzi az időtúllépést, és a nagy műveleteknél követhető az előrehaladás.

## A kötegelési küszöb

Az alapértelmezett küszöb 200 webhely. A küszöb alatti műveletek szinkron futnak, és azonnal visszaadják az eredményt. A küszöböt a `mainwp_abilities_batch_threshold` szűrővel módosíthatod:

```php
// Alapérték: 200 webhely
$threshold = apply_filters( 'mainwp_abilities_batch_threshold', 200 );
```

## Érintett képességek

Ezek a képességek támogatják a sorba állítást:

| Képesség | Mit csinál |
|---|---|
| `mainwp/sync-sites-v1` | Több webhely szinkronizálása |
| `mainwp/run-updates-v1` | Frissítések végrehajtása több webhelyen |
| `mainwp/update-all-v1` | Az összes frissítés alkalmazása |
| `mainwp/reconnect-sites-v1` | Kötegelt újracsatlakoztatás |
| `mainwp/disconnect-sites-v1` | Kötegelt kapcsolatbontás |
| `mainwp/check-sites-v1` | Kötegelt elérhetőség-ellenőrzés |
| `mainwp/suspend-sites-v1` | Kötegelt felfüggesztés |

## Frissítések megerősítése és jogosultságai

A `run-updates-v1` és az `update-all-v1` műveletet a 6.3-tól előbb `dry_run: true` értékkel tekintsd meg, majd az átnézett kijelölést küldd el `confirm: true` értékkel. Az előnézet nem állít sorba frissítési feladatot. A megerősítő jelzőkről és a frissítési tiltásokról a Frissítések képességei fejezet szól.

A sorba állított feladatok a kérést indító felhasználó jogosultságaival futnak. A MainWP a frissítések végrehajtása előtt újra ellenőrzi a webhelyhozzáférést, a műveleti jogokat és a vonatkozó frissítési tiltásokat. Ha a hozzáférés a sorba állítás után megváltozik, az újrapróbálás előtt nézd át a feladat hibáit és a kihagyott elemeket. Az egyes eredményeket akkor is ellenőrizd, ha a feladat állapota `completed`.

## Válaszminták

### Azonnali válasz (legfeljebb 200 webhely)

```json
{
  "queued": false,
  "synced": [
    {"id": 1, "url": "https://example.com", "name": "1. webhely"}
  ],
  "errors": [],
  "total_synced": 1,
  "total_errors": 0
}
```

### Sorba állított válasz (200-nál több webhely)

```json
{
  "queued": true,
  "job_id": "sync_abc123def456",
  "status_url": "https://a-te-vezerlopultod.hu/wp-json/mainwp/v2/jobs/sync_abc123def456",
  "sites_queued": 350
}
```

## mainwp/get-batch-job-status-v1

Egy sorba állított kötegelt művelet aktuális állapotát adja vissza. Csak olvas, GET.

```bash
curl -G -u "admin:xxxx" \
  --data-urlencode 'input_json={"job_id":"sync_abc123def456"}' \
  "https://a-te-vezerlopultod.hu/wp-json/wp-abilities/v1/abilities/mainwp/get-batch-job-status-v1/run"
```

| Név | Típus | Kötelező | Leírás |
|---|---|---|---|
| `job_id` | szöveg | igen | A sorba állított művelet feladatazonosítója |

A válasz:

```json
{
  "job_id": "sync_abc123def456",
  "type": "sync",
  "status": "processing",
  "progress": 45,
  "processed": 90,
  "total": 200,
  "succeeded": 88,
  "failed": 2,
  "started_at": "2026-01-15T10:30:00Z",
  "completed_at": null,
  "errors": [
    {
      "site_id": 15,
      "code": "mainwp_site_offline",
      "message": "Site is unreachable"
    }
  ]
}
```

### Állapotértékek

| Állapot | Jelentés |
|---|---|
| `queued` | Indulásra vár |
| `processing` | Éppen fut |
| `completed` | A feldolgozás befejeződött; egyes elemek közben hibázhattak |
| `failed` | Hibával leállt |

## Lekérdezési munkamenet

A tipikus menet: indítsd el a műveletet, nézd meg, hogy sorba lett-e állítva, és ha igen, kérdezd le néhány másodpercenként a feladat állapotát, amíg az `completed` vagy `failed` nem lesz.

```bash
#!/bin/bash

# 1. A művelet indítása
RESPONSE=$(curl -s -X POST -u "admin:xxxx" \
  -H "Content-Type: application/json" \
  -d '{"input":{"site_ids_or_domains":[]}}' \
  "https://a-te-vezerlopultod.hu/wp-json/wp-abilities/v1/abilities/mainwp/sync-sites-v1/run")

# 2. Sorba lett állítva?
QUEUED=$(echo $RESPONSE | jq -r '.queued // false')
JOB_ID=$(echo $RESPONSE | jq -r '.job_id // empty')

if [ "$QUEUED" = "true" ] && [ -n "$JOB_ID" ]; then
  echo "Feladat sorba állítva: $JOB_ID"

  # 3. Az állapot lekérdezése
  while true; do
    STATUS=$(curl -s -G -u "admin:xxxx" \
      --data-urlencode "input_json=$(jq -cn --arg job_id "$JOB_ID" '{job_id: $job_id}')" \
      "https://a-te-vezerlopultod.hu/wp-json/wp-abilities/v1/abilities/mainwp/get-batch-job-status-v1/run")

    PROGRESS=$(echo $STATUS | jq -r '.progress')
    STATE=$(echo $STATUS | jq -r '.status')
    SUCCEEDED=$(echo $STATUS | jq -r '.succeeded')
    FAILED=$(echo $STATUS | jq -r '.failed')

    echo "Előrehaladás: $PROGRESS% - Állapot: $STATE - Sikeres: $SUCCEEDED - Sikertelen: $FAILED"

    if [ "$STATE" = "completed" ] || [ "$STATE" = "failed" ]; then
      echo "A feladat véget ért: $STATE"
      echo $STATUS | jq '.errors'
      break
    fi

    sleep 10
  done
else
  echo "Azonnal lefutott"
  echo $RESPONSE | jq '.'
fi
```

## A feladat életciklusa

| Tulajdonság | Érték | Leírás |
|---|---|---|
| Élettartam | 24 óra | A feladat a befejezése után lejár |
| Időkorlát | 4 óra | A legnagyobb futásidő |
| Adagméret | 20 webhely | Egy cron-futásban feldolgozott webhelyek |
| Újraütemezési késleltetés | 30 másodperc | Az adagok közötti várakozás |

Ha a feladat lejárt, az állapotlekérdezés `mainwp_job_not_found` hibát ad.

## Hibakezelés

Ha egy kötegelt feladat hibába ütközik, az egyes hibákat feljegyzi, és a maradék elemek feldolgozását folytatja. A részleteket az állapotválasz `errors` tömbje tartalmazza:

```json
{
  "errors": [
    {
      "site_id": 15,
      "code": "mainwp_site_offline",
      "message": "Site is unreachable"
    },
    {
      "site_id": 23,
      "code": "mainwp_child_version_outdated",
      "message": "MainWP Child plugin needs update"
    }
  ]
}
```

Ha legalább egy művelet sikerült, a feladat `completed` állapottal zárul, akkor is, ha voltak hibák. Ha minden művelet sikertelen volt, az állapot `failed`.
