# REST API: hitelesítés, olvasás, írás és biztonság

> A SEOPress REST API alapjai: hitelesítési módok, bejegyzés- és tagmetaadatok olvasása és írása, beállítások lekérése, és a nyilvános útvonalak biztonsági szabályai.

A SEOPress a WordPress REST API-ján keresztül is elérhető. Ez a fejezet a hitelesítést, a bejegyzések és tagok SEO-metaadatainak olvasását és írását, a globális beállítások lekérését, az Instant Indexing előzményét és az átirányítások lekérését írja le. A többi útvonal (séma, videótérkép, AI, tartalomelemzés, analitika, Insights) a [REST API: további útvonalak](https://hub.hellowp.io/hu/plugins/wp-seopress-pro/fejlesztoknek-rest-api-vegpontok/) fejezetben van.

Minden útvonal a `/wp-json/seopress/v1/` alatt érhető el.

## Hitelesítés

### WordPress-sütikkel

Ezeket a fejléceket küldd a kéréssel:

- `X-WP-Nonce`: a böngészőkonzolba írd be, hogy `wpApiSettings`, és másold ki a nonce értékét.
- `Cookie`: a böngészőben az Application (Alkalmazás) lapon másold ki a `wordpress_logged_in_` kezdetű süti nevét ÉS értékét.

### Alkalmazásjelszóval

Ez az ajánlott megoldás. Hozz létre alkalmazásjelszót a WordPress-profilodon, majd a WordPress-felhasználóneveddel és ezzel az új jelszóval hitelesíts (Postmanben vagy hasonló eszközben válaszd az „alap hitelesítést”, Basic Authentication).

## Metaadatok írása: a kérés törzse

Az alábbi JSON-objektumokat küldd a kérés törzseként, az útvonaltól függően.

Cím és meta leírás:

```json
{
    "title": "Ez a SEO-cím",
    "description": "Ez a meta leírás"
}
```

Fókuszkulcsszavak:

```json
{
    "_seopress_analysis_target_kw": "kulcsszo1, kulcsszo2"
}
```

Közösségi metaadatok:

```json
{
    "_seopress_social_fb_title": "Facebook-cím",
    "_seopress_social_fb_desc": "Facebook-leírás",
    "_seopress_social_fb_img": "a Facebook-kép URL-je",
    "_seopress_social_fb_img_attachment_id": "a Facebook-kép mellékletazonosítója",
    "_seopress_social_fb_img_width": "a Facebook-kép szélessége",
    "_seopress_social_fb_img_height": "a Facebook-kép magassága",
    "_seopress_social_twitter_title": "X-cím",
    "_seopress_social_twitter_desc": "X-leírás",
    "_seopress_social_twitter_img": "az X-kép URL-je",
    "_seopress_social_twitter_img_attachment_id": "az X-kép mellékletazonosítója",
    "_seopress_social_twitter_img_width": "az X-kép szélessége",
    "_seopress_social_twitter_img_height": "az X-kép magassága"
}
```

Meta robots:

```json
{
    "_seopress_robots_index": "yes",
    "_seopress_robots_follow": "yes",
    "_seopress_robots_archive": "yes",
    "_seopress_robots_snippet": "yes",
    "_seopress_robots_imageindex": "yes",
    "_seopress_robots_canonical": "az egyedi canonical URL",
    "_seopress_robots_primary_cat": "az elsődleges kategória azonosítója",
    "_seopress_robots_breadcrumbs": "egyedi navigációs morzsa"
}
```

Más nyilvános, hierarchikus taxonómia elsődleges tagjának saját kulcsa van: `_seopress_robots_primary_term_{taxonomy}` (például `_seopress_robots_primary_term_genre`). Tag-azonosítót vár, vagy üres értéket az eltávolításhoz. A kategóriáknál és a termékkategóriáknál továbbra is a `_seopress_robots_primary_cat` a kulcs.

Átirányítás:

```json
{
    "_seopress_redirections_enabled": "yes",
    "_seopress_redirections_logged_status": "both|only_logged_in|only_not_logged_in",
    "_seopress_redirections_type": "301|302|307",
    "_seopress_redirections_value": "az átirányítás URL-je"
}
```

Egy másik webhelyre mutató átirányítást csak `manage_options` vagy `unfiltered_html` jogosultságú felhasználó állíthat be (lásd lejjebb a biztonsági részt).

### Válaszok

Siker esetén:

```json
{
    "code": "success"
}
```

Hiba esetén:

```json
{
    "code": "rest_forbidden",
    "message": "Sorry, you are not allowed to do that.",
    "data": {
        "status": 401
    }
}
```

vagy:

```json
{
    "code": "rest_cookie_invalid_nonce",
    "message": "Cookie check failed",
    "data": {
        "status": 403
    }
}
```

vagy ha az átirányítás célját elutasítja a rendszer:

```json
{
    "code": "seopress_redirection_external_target",
    "message": "You are not allowed to redirect this content to another website. Use a URL on this site, or ask an administrator.",
    "data": {
        "status": 403
    }
}
```

## Bejegyzés-metaadatok lekérése

Két útvonal van, mindkettő nyilvános, azaz nem kér hitelesítést, és az `edit_post` jogosultság sem kell hozzá:

- `/wp-json/seopress/v1/posts/[postId]`: a `[postId]` helyére a bejegyzés azonosítója kerül.
- `/wp-json/seopress/v1/posts/by-url?url=https://example.com/peldabejegyzes/`: az URL helyére a kívánt permalink kerül.

Metódus: GET. A metaadatot csak olyan tartalomtípus közzétett bejegyzéséhez adja vissza, amelyet a látogatók megtekinthetnek, és amelyet nem véd jelszó.

Ha van metaadat, a válaszban `success: true` áll, a metaadat a `data` objektumban. Különben a `data` értéke `null`. Az alábbi JSON csak a `data` objektumot mutatja, a címet például a `response.data.title` útvonalon olvasod ki.

```json
{
    "title": "SEOPress, a WordPress SEO-bővítmény",
    "description": "A meta leírás",
    "canonical": "https://example.com/peldabejegyzes/",
    "og": {
        "title": "Facebook-cím",
        "description": "Facebook-leírás",
        "image": "https://example.com/peldabejegyzes.jpg",
        "attachment_id": "1",
        "image_width": "1920",
        "image_height": "1080"
    },
    "twitter": {
        "title": "X-cím",
        "description": "X-leírás",
        "image": "https://example.com/peldabejegyzes.jpg",
        "attachment_id": "1",
        "image_width": "1920",
        "image_height": "1080"
    },
    "robots": {
        "noindex": false,
        "nofollow": false,
        "nosnippet": false,
        "noimageindex": false
    },
    "primarycat": "1",
    "breadcrumbs": "egyedi navigációs morzsa az aktuális elemhez",
    "redirections": {
        "enabled": true,
        "status": "both",
        "type": "301",
        "value": "https://example.com/celoldal/"
    }
}
```

Az adatok lekéréséhez használhatod például a WordPress HTTP API-ját.

## Tagmetaadatok lekérése

A taxonómiatagok SEO-metaadatait is lekérheted. Az útvonal nyilvános, a `taxonomy` paraméterrel és anélkül is, hitelesítés és `edit_post` jogosultság nélkül. Csak nyilvánosan lekérdezhető taxonómia tagját írja le, és a tagnak abba a taxonómiába kell tartoznia, amelyet kérsz. WooCommerce-termékkategóriánál például fűzd hozzá: `?taxonomy=product_cat`.

- `/wp-json/seopress/v1/terms/[termId]`: a `[termId]` helyére a tag azonosítója kerül.
- `/wp-json/seopress/v1/terms/[termId]?taxonomy=[sajatTaxonomia]`: ugyanaz, taxonómia-megadással (alapértelmezés megadás nélkül: `category`).

Metódus: GET. A válasz szerkezete a bejegyzésekéhez hasonló (`success: true`, a metaadat a `data` objektumban; elérhető metaadat híján a `data` értéke `null`), a bejegyzéseknél látott `primarycat` nélkül:

```json
{
    "title": "A tag címe",
    "description": "A tag meta leírása",
    "canonical": "https://example.com/kategoria/peldakategoria/",
    "og": {
        "title": "Facebook-cím",
        "description": "Facebook-leírás",
        "image": "https://example.com/kategoria.jpg",
        "attachment_id": "1",
        "image_width": "1920",
        "image_height": "1080"
    },
    "twitter": {
        "title": "X-cím",
        "description": "X-leírás",
        "image": "https://example.com/kategoria.jpg",
        "attachment_id": "1",
        "image_width": "1920",
        "image_height": "1080"
    },
    "robots": {
        "noindex": false,
        "nofollow": false,
        "nosnippet": false,
        "noimageindex": false
    },
    "breadcrumbs": "egyedi navigációs morzsa az aktuális elemhez",
    "redirections": {
        "enabled": true,
        "status": "both",
        "type": "301",
        "value": "https://example.com/celoldal/"
    }
}
```

## Bejegyzés-metaadatok küldése

Az SEO-metaadatok írására ezek az útvonalak szolgálnak:

| Mit írsz | Útvonal |
|---|---|
| Cím és meta leírás | `/wp-json/seopress/v1/posts/[postId]/title-description-metas` |
| Fókuszkulcsszavak | `/wp-json/seopress/v1/posts/[postId]/target-keywords` |
| Közösségi metaadatok | `/wp-json/seopress/v1/posts/[postId]/social-settings` |
| Meta robots | `/wp-json/seopress/v1/posts/[postId]/meta-robot-settings` |
| Átirányítás | `/wp-json/seopress/v1/posts/[postId]/redirection-settings` |

Szükséges jogosultság: `edit_post`. Metódus: PUT.

Az a szerepkör, amelyet a **SEO → Advanced → Security** fülön letiltottál, nem használhatja ezeket az útvonalakat, ahogyan a SEO metaboxot sem: a **SEO metaboxes: blocked roles** beállítás mindegyikre vonatkozik, a **Content Analysis: blocked roles** a fókuszkulcsszavakra. Ugyanez a korlátozás az útvonalak GET-es olvasására is érvényes, és az átirányítás célját is ellenőrzi a rendszer.

## Biztonság és headless webhelyek

A REST API korlátozza, mit lát a látogató, és mit módosíthat az egyes szerepkör. Ha headless előtétet futtatsz, vagy olyan integrációt, amely SEO-adatot olvas vagy ír, nézd át az alábbi pontokat.

### A nyilvános útvonalak csak nyilvános tartalmat írnak le

A `seopress/v1/posts/[postId]`, a `seopress/v1/posts/by-url` és a `seopress/v1/terms/[termId]` útvonal bárki számára nyitott, de csak olyan tartalmat ír le, amelyet a látogató amúgy is elérhet:

- megtekinthető tartalomtípus bejegyzéseit (bejegyzések, oldalak, termékek, nyilvános egyedi tartalomtípusok). Az újrafelhasználható blokkok, a sablonrészek és más bővítmények belső rekordjai `data: null` választ adnak, akkor is, ha közzétettek;
- nyilvánosan lekérdezhető taxonómia tagjait, és csak akkor, ha a tag létezik a kért taxonómiában.

Ha szándékosan akarsz elérhetővé tenni egy belső tartalomtípust vagy taxonómiát (például egy integrációnak, amely a korábbi viselkedésre épített), használd ezeket a szűrőket. A piszkozatok és a jelszóval védett bejegyzések a szűrő értékétől függetlenül rejtve maradnak.

```php
// Egy belső tartalomtípus bejegyzéseinek leírása a nyilvános SEO-útvonalon.
add_filter( 'seopress_api_public_post_is_readable', function( $allowed, $post_id, $post_type ) {
	if ( 'my_internal_type' === $post_type ) {
		return true;
	}
	return $allowed;
}, 10, 3 );

// Egy nem nyilvános taxonómia tagjainak leírása a nyilvános SEO-útvonalon.
add_filter( 'seopress_api_public_term_is_readable', function( $allowed, $term_id, $taxonomy ) {
	if ( 'my_internal_taxonomy' === $taxonomy && term_exists( $term_id, $taxonomy ) ) {
		return true;
	}
	return $allowed;
}, 10, 3 );
```

### SEO-metaadatok a WordPress alap útvonalain (/wp/v2)

A SEOPress a bejegyzés-metaadatait a WordPress alap REST-útvonalain (`/wp/v2/posts`, `/wp/v2/pages` stb.) is regisztrálja, hogy a blokkszerkesztő olvasni és menteni tudja őket. Jelenleg:

- aki nem szerkesztheti a bejegyzést (a látogatókat is beleértve), nem kap SEOPress-metaadatot (`_seopress_*`) a `meta` mezőben. Alapból egyetlen kulcs sem marad nyilvános;
- aki szerkesztheti a bejegyzést, megkapja őket, kivéve azoknak a területeknek a kulcsait, amelyektől a szerepkörét a **SEO → Advanced → Security** fülön letiltották (például a fókuszkulcsszavakat egy, a **Content Analysis: blocked roles** listán szereplő szerepkörnek).

Headless előtéthez az ajánlott forrás a `seopress/v1/posts/[postId]` útvonal: a megjelenítéskor érvényes értékeket adja vissza. Ha az előtéted a nyers metaadatokat a `/wp/v2` útvonalról olvassa, a nyilvánosan maradó kulcsokat a `seopress_rest_public_meta_keys` szűrővel add meg:

```php
// A SEO-cím és a meta leírás maradjon nyilvános a /wp/v2 válaszokban.
add_filter( 'seopress_rest_public_meta_keys', function( $keys, $post ) {
	$keys[] = '_seopress_titles_title';
	$keys[] = '_seopress_titles_desc';
	return $keys;
}, 10, 2 );
```

Csak azokat a kulcsokat add meg, amelyekre az előtétnek szüksége van: a fókuszkulcsszavak, a ki nem kapcsolt átirányítás és a tartalomelemzés beállításai nem arra valók, hogy nyilvánosak legyenek.

### Átirányítás másik webhelyre

Aki szerkeszthet egy bejegyzést, annak az átirányítását is bekapcsolhatja. A bejegyzés- vagy tagátirányítás célja a saját webhelyeden kell legyen, kivéve ha a felhasználó `manage_options` vagy `unfiltered_html` jogosultságú. Ez megakadályozza, hogy valaki a te URL-edből tetszőleges domainre mutató hivatkozást (nyílt átirányítást) csináljon.

- A saját webhelyed vagy a WordPress `allowed_redirect_hosts` szűrőjével felvett gazdagép mindig elfogadott.
- A már mentett cél megtartása elfogadott, így egy szerző akkor is frissíthet egy bejegyzést, ha azt egy adminisztrátor átirányította.
- Ha nincs bejelentkezett felhasználó (cron, WP-CLI, importálás), semmit nem ellenőriz.
- A SEOPress PRO átirányításkezelőjét nem érinti: annak saját jogosultságai vannak.

A szabály a bejegyzés- és tagátirányítások minden mentési módjára vonatkozik, a REST API-ra is. A `PUT /wp-json/seopress/v1/posts/[postId]/redirection-settings` hívásnál az elutasított cél `seopress_redirection_external_target` hibát ad (HTTP 403), és semmi nem mentődik. A `/wp/v2` útvonalon át a korábbi cél csendben megmarad. Ha több felhasználónak akarod engedélyezni a másik webhelyre irányítást, használd a `seopress_redirection_external_target_allowed` szűrőt:

```php
// A shop aldomain elfogadott átirányítási cél minden felhasználónak, aki szerkesztheti a bejegyzést.
add_filter( 'seopress_redirection_external_target_allowed', function( $allowed, $url ) {
	if ( 'shop.example.com' === wp_parse_url( $url, PHP_URL_HOST ) ) {
		return true;
	}
	return $allowed;
}, 10, 2 );
```

### A SEO metabox korlátozásai az olvasó útvonalakon

A SEO metabox író útvonalait a **SEO → Advanced → Security** fülön megjelölt szerepkörtől eleve megtagadja a rendszer. Az olvasó (GET) útvonalakra ugyanez a szabály érvényes, így a letiltott szerepkör nem kérheti le azokat a mezőket, amelyeket a metabox elrejt előle. Az adminisztrátorokat soha nem blokkolja.

| Útvonal | Megtagadva, ha a szerepkör ki van jelölve itt |
|---|---|
| `title-description-metas`, `target-keywords`, `meta-robot-settings`, `preview-title-description-metas`, `page-preview`, `count-target-keywords-use` | mindkét listán: **SEO metaboxes: blocked roles** és **Content Analysis: blocked roles** |
| `social-settings`, `redirection-settings`, `redirection-test` | **SEO metaboxes: blocked roles** |
| `content-analysis` (GET) és `content-analysis/analyze` (POST) | **Content Analysis: blocked roles** |

Mindegyik útvonal a `/wp-json/seopress/v1/posts/[postId]/` alatt van, és továbbra is `edit_post` jogosultságot kér. A SEO-beállításokat módosító SEOPress képességek (Abilities) ugyanezeket a szerepkörkorlátozásokat alkalmazzák (az olvasás ott engedélyezett maradt), lásd a [SEOPress képességek](https://hub.hellowp.io/hu/plugins/wp-seopress-pro/ai-abilities/) fejezetet.

## A SEOPress beállításainak lekérése

A globális beállításokat is lekérheted. Biztonsági okból olyan felhasználóval kell bejelentkezned, aki `manage_options` jogosultságú.

Tíz útvonal van, mind GET metódussal:

| Útvonal | Beállítások |
|---|---|
| `/wp-json/seopress/v1/options/dashboard-settings` | Vezérlőpult |
| `/wp-json/seopress/v1/options/titles-settings` | Címek és metaadatok |
| `/wp-json/seopress/v1/options/social-settings` | Közösségi hálózatok |
| `/wp-json/seopress/v1/options/sitemaps-settings` | Oldaltérképek |
| `/wp-json/seopress/v1/options/analytics-settings` | Analitika |
| `/wp-json/seopress/v1/options/advanced-settings` | Haladó beállítások |
| `/wp-json/seopress/v1/options/bot-settings` | Botbeállítások |
| `/wp-json/seopress/v1/options/indexing-settings` | Instant Indexing |
| `/wp-json/seopress/v1/options/license-settings` | Licenc |
| `/wp-json/seopress/v1/options/pro-settings` | PRO-beállítások |

A válasz JSON, például a vezérlőpult-beállításoknál:

```json
{
  "cards_order": [
    "seopress-page-list",
    "notice-insights-alert",
    "seopress-news-panel"
  ],
  "toggle-rich-snippets": "1",
  "toggle-404": "1",
  "toggle-bot": "1",
  "toggle-titles": "1",
  "toggle-white-label": "0",
  "toggle-social": "1",
  "toggle-xml-sitemap": "1",
  "toggle-google-analytics": "1",
  "toggle-advanced": "1",
  "toggle-woocommerce": "1",
  "toggle-edd": "1",
  "toggle-local-business": "1",
  "toggle-dublin-core": "1",
  "toggle-breadcrumbs": "1",
  "toggle-robots": "1",
  "toggle-news": "1",
  "toggle-rewrite": "1",
  "toggle-instant-indexing": "1",
  "notice-wizard": "1"
}
```

## Az Instant Indexing előzményének lekérése

Minden IndexNow-nak vagy a Google-nek beküldött URL rögzítődik az előzményben (lásd az [Azonnali indexelés](https://hub.hellowp.io/hu/plugins/wp-seopress-pro/fejlesztoknek-azonnali-indexeles/) fejezetet), és ezt a REST API-val is lekérheted. Biztonsági okból `manage_options` jogosultságú felhasználóval kell bejelentkezned, kivéve a bejegyzésenkénti útvonalat (ott `edit_post` kell).

Két útvonal van:

- `/wp-json/seopress/v1/instant-indexing/history`: a teljes előzmény, a legújabbal kezdve. Argumentumok:
  - `page` (nem kötelező): egész szám, alapérték `1`.
  - `per_page` (nem kötelező): egész szám, `1` és `100` között, alapérték `20`.
  - `search` (nem kötelező): szöveg, az URL egy része.
  - `source` (nem kötelező): `manual` vagy `auto`.
- `/wp-json/seopress/v1/posts/[postId]/indexing-history`: a bejegyzés utolsó 20 beküldése.

Metódus: GET, és DELETE az `/instant-indexing/history` útvonalon az egész előzmény törléséhez.

```json
{
    "items": [
        {
            "id": 42,
            "url": "https://example.com/peldabejegyzes/",
            "post_id": 123,
            "engine": "indexnow",
            "source": "auto",
            "status_code": 200,
            "success": true,
            "message": "",
            "date_gmt": "2026-10-28T09:15:00+00:00",
            "date": "October 28, 2026 9:15 am"
        }
    ],
    "total": 1,
    "total_pages": 1,
    "max_rows": 5000
}
```

Az `engine` értéke `indexnow` vagy `google`. A bejegyzésenkénti útvonal az `items` mellett az `automatic` mezőt (be van-e kapcsolva az automatikus beküldés) és a `history_url` mezőt (az előzmények fülének linkje, üres annak, aki nem nyithatja meg) is visszaadja. Alapból az 5000 legújabb sor marad meg, URL-enként és keresőmotoronként egy sor. A számot a `seopress_instant_indexing_history_max_rows` szűrővel módosíthatod, a `0` leállítja a rögzítést.

## Átirányítások lekérése

Az átirányításokat is lekérheted. Biztonsági okból `read_redirection` jogosultságú felhasználóval kell bejelentkezned.

Egy útvonal van: `/wp-json/seopress/v1/redirections`, az összes átirányítás lekéréséhez. Argumentumok:

- `id` (nem kötelező): egész szám, az átirányítás azonosítója.
- `enabled` (nem kötelező): szöveg, `yes` vagy `no`.
- `type` (nem kötelező): az átirányítás típusainak tömbje: `301`, `302`, `307`, `404`, `410`, `451`.

Metódus: GET.

```json
{
  "success": true,
  "data": {
    "1681": {
      "origin": "regi-url",
      "destination": "https://example.com/uj-url",
      "enabled": "yes",
      "type": "301",
      "param": "",
      "enabled_regex": "",
      "logged_status": "",
      "ip": "",
      "ua": "",
      "full_origin": "",
      "date_request": "",
      "count": "14",
      "redirect_date_request": "1747125367"
    }
  }
}
```
