# Fejlesztőknek

> Az LW SEO REST-végpontjai, a SEO-mezők a WordPress REST API-ban, az abilities, a virtuális URL-ek és a szűrők.

## Publikus REST-végpontok

Mind GET, a `lw-seo/v1` névtérben. Közzétett, nem jelszavas tartalomhoz nem kell bejelentkezés; piszkozathoz és privát tartalomhoz hitelesítés kell. Nem elérhető tartalomnál 404 a válasz.

| Végpont | Mit ad |
|---|---|
| `/wp-json/lw-seo/v1/meta/<id>` | Egy bejegyzés SEO-adatai: `title`, `description`, `canonical`, `robots`, `og`, `twitter` |
| `/wp-json/lw-seo/v1/meta/term/<id>?taxonomy=<taxonómia>` | Ugyanez egy kategóriára vagy más kifejezésre (alap: `category`) |
| `/wp-json/lw-seo/v1/meta/author/<id>` | Ugyanez egy szerzőre |
| `/wp-json/lw-seo/v1/schema/<id>` | A bejegyzés JSON-LD gráfja |
| `/wp-json/lw-seo/v1/breadcrumbs/<id>` | A morzsamenü elemei |

```bash title="Terminál"
curl https://pelda.hu/wp-json/lw-seo/v1/schema/123
curl https://pelda.hu/wp-json/lw-seo/v1/breadcrumbs/123
curl "https://pelda.hu/wp-json/lw-seo/v1/meta/term/10?taxonomy=product_cat"
```

> **A meta végpontok korlátai az 1.9.2-ben**
>
> A `/meta/…` végpontok nem pontosan azt adják, amit az oldal a `<head>`-be ír:
>
> - a `title` nem a beállított címsablont és elválasztót használja, hanem fix `%%title%% - %%sitename%%` alakot (kategóriánál és szerzőnél hasonlót);
> - kategóriánál a saját SEO cím és leírás nem érvényesül;
> - kategóriánál és szerzőnél a `robots` mindig `index, follow`;
> - a `twitter.card` mindig `summary_large_image`.
>
> Headless frontendnél ezekre a mezőkre ne építs. A `schema` és a `breadcrumbs` végpontra ez nem vonatkozik.

## SEO-mezők a WordPress REST API-ban

A bejegyzések, oldalak és termékek REST-válaszában `lw_seo` mező van, szerkesztési kontextusban (`?context=edit`). Írni az tud, aki a bejegyzést szerkesztheti.

```bash title="Terminál"
curl -u "admin:xxxx xxxx xxxx xxxx xxxx xxxx" -X POST \
  -H "Content-Type: application/json" \
  -d '{"lw_seo":{"title":"Új SEO cím","description":"Rövid leírás.","noindex":false}}' \
  https://pelda.hu/wp-json/wp/v2/posts/123
```

A `markdown_content` írásához `unfiltered_html` jog kell.

A beállítás-oldal saját végpontjai (`lw-seo/v1/admin/…`, csak adminisztrátor) a felület belső végpontjai. Automatizáláshoz a [WP-CLI](https://hub.hellowp.io/hu/docs/lw-plugins/lw-seo/cli/) kényelmesebb.

## Abilities (az LW Site Manager mellett)

Ha az [LW Site Manager](https://hub.hellowp.io/hu/docs/lw-plugins/) is aktív, az LW SEO hat képességet regisztrál „SEO” kategóriában. Ezek MCP-eszközként is elérhetők.

| Ability | Ki hívhatja | Mit csinál |
|---|---|---|
| `lw-seo/get-meta` | aki szerkeszthet bejegyzést | Egy bejegyzés vagy kifejezés SEO-adatai (`post_id` vagy `term_id`) |
| `lw-seo/set-meta` | aki az adott tartalmat szerkesztheti | SEO cím, leírás, noindex, közösségi mezők, AI-jelzések, Markdown írása. Nofollow-t és kanonikus URL-t nem tud. |
| `lw-seo/get-content-signals` | aki szerkeszthet bejegyzést | Egy tartalom végső tartalmi jelzései |
| `lw-seo/get-markdown` | aki szerkeszthet bejegyzést | A tartalom Markdown-változata és becsült tokenszáma |
| `lw-seo/get-options` | adminisztrátor | Az összes beállítás |
| `lw-seo/set-options` | adminisztrátor | Beállítások írása; az ismeretlen kulcsot kihagyja |

A WordPress Abilities REST-felületén hívhatók: `/wp-json/wp-abilities/v1/abilities/<név>/run`, olvasáshoz GET, íráshoz POST `{"input": {...}}` törzzsel.

```bash title="Címelválasztó átállítása"
curl -u "admin:xxxx xxxx xxxx xxxx xxxx xxxx" -X POST \
  -H "Content-Type: application/json" \
  -d '{"input":{"options":{"separator":"|"}}}' \
  "https://pelda.hu/wp-json/wp-abilities/v1/abilities/lw-seo/set-options/run"
```

## Virtuális URL-ek

Ezeket a bővítmény szolgálja ki, nincs mögöttük fájl:

`/sitemap.xml`, `/sitemap-<típus>.xml`, `/sitemap-<típus>-<lap>.xml`, `/sitemap.xsl`, `/llms.txt`, `/llms-full.txt`, `/<indexnow-kulcs>.txt`, `<url>/md`, `<url>/markdown`.

A Markdown-válasz fejlécei: `Content-Type: text/markdown`, `X-Robots-Tag: noindex`, kanonikus `Link` a HTML oldalra, `Content-Signal` és `X-Markdown-Tokens`.

## Konstansok

Saját wp-config-konstans nincs. A WordPress `WP_ENVIRONMENT_TYPE` konstansa hat rá: ha nem `production`, az IndexNow szünetel.

## Szűrők és akciók

| Hook | Típus | Mire jó |
|---|---|---|
| `lw_seo_meta_box_post_types` | filter | Mely tartalomtípusokon jelenjen meg az LW SEO panel |
| `lw_seo_meta_description` | filter | A meta leírás |
| `lw_seo_canonical_url` | filter | A kanonikus URL |
| `lw_seo_og_type` | filter | Az `og:type` |
| `lw_seo_post_noindex` | filter | Egy bejegyzés noindex-e (pl. tagság szerint) |
| `lw_seo_post_is_eligible` | filter | Bekerül-e egy bejegyzés az oldaltérképbe, az llms.txt-be és a Markdown-végpontra. Csak kivenni tud. |
| `lw_seo_query_args` | filter | A tartalomlistázó lekérdezések argumentumai |
| `lw_seo_content_signals` | filter | A tartalmi jelzések végső értéke |
| `lw_seo_ai_crawlers` | filter | Saját AI-crawler felvétele (rá csak a cél szerinti kapcsoló hat) |
| `lw_seo_llms_txt_post_types` | filter | Az llms.txt tartalomtípusai |
| `lw_seo_content_changed` | action | Tartalomváltozás jelzése, például gyorsítótár-ürítéshez |
| `lw_seo_markdown_is_supported`, `lw_seo_markdown_renderer`, `lw_seo_markdown_output`, `lw_seo_markdown_frontmatter`, `lw_seo_markdown_body`, `lw_seo_markdown_source_html` | filter | A Markdown-változat |
| `lw_seo_sitemap_post_types`, `lw_seo_sitemap_exclude_post`, `lw_seo_sitemap_excluded_ids`, `lw_seo_sitemap_default_excluded_ids`, `lw_seo_sitemap_urls`, `lw_seo_sitemap_images`, `lw_seo_sitemap_content_images` | filter | Az XML oldaltérkép tartalma |
| `lw_seo_sitemap_posts` | action | A bejegyzés-oldaltérkép építésekor |
| `lw_seo_html_sitemap_sections`, `lw_seo_html_sitemap_output` | filter | A HTML oldaltérkép |
| `lw_seo_404_log_skip_extensions` | filter | Mely kiterjesztések ne kerüljenek a 404-naplóba |
| `lw_seo_indexnow_active` | filter | Az IndexNow kényszerített be- vagy kikapcsolása |
| `lw_seo_indexnow_endpoint` | filter | Más IndexNow-végpont |
| `lw_seo_integration_enabled` | filter | Integráció kikapcsolása: `woocommerce`, `bricks`, `polylang`, `site-manager` |
| `lw_seo_woo_product_schema`, `lw_seo_woo_offer`, `lw_seo_woo_varies_by_map` | filter | A WooCommerce termékséma |

```php title="mu-plugin"
// IndexNow tesztelése nem éles környezetben
add_filter( 'lw_seo_indexnow_active', '__return_true' );

// A tagoknak szóló bejegyzések kizárása az oldaltérképből, az llms.txt-ből és a Markdown-végpontról
add_filter( 'lw_seo_post_is_eligible', function ( $eligible, $post ) {
	return has_term( 'tagoknak', 'category', $post ) ? false : $eligible;
}, 10, 2 );
```
