---
title: Siltide ja kategooriate haldus
description: Pakub ja sünkroonib postituste silte ja kategooriaid levinud sisuhaldussüsteemides.
category: Marketing
sublabel: Sisu
author: AgriciDaniel
tags: 
license: MIT
source: https://github.com/AgriciDaniel/claude-blog
---

# Blogi taksonoomia

Halda silte, kategooriaid ja teemaklastreid eri CMS-platvormidel.

## Käsud

| Käsk | Eesmärk |
|---------|---------|
| `/blog taxonomy suggest <file>` | Eralda sisust kandidaatsildid ja -kategooriad |
| `/blog taxonomy sync <cms>` | Saada taksonoomia autenditud API kaudu CMS-i |
| `/blog taxonomy audit [directory]` | Kontrolli õhukesi silte, orvuks jäänud silte ja taksonoomia paisumist |

## Sildisoovituste töövoog

### 1. samm: paranda sisu struktuur

Loe sihtfail ja eralda:
- Kõik H2- ja H3-pealkirjad (peamised teemasignaalid)
- Paksus ja kaldkirjas fraasid (rõhusignaalid)
- Olemasolevad frontmatteri sildid/kategooriad, kui need on olemas

### 2. samm: sageduse analüüs

Skaneeri sisuteksti sagedaste fraaside leidmiseks:
- 1-sõnalised terminid: vähemalt 4 esinemist (välja arvatud tühisõnad)
- 2-sõnalised fraasid: vähemalt 3 esinemist
- 3-sõnalised fraasid: vähemalt 2 esinemist

Jäta välja levinud mittesildisõnad: artiklid, eessõnad, sidesõnad, asesõnad.

### 3. samm: semantiline rühmitamine

Rühmita seotud kandidaadid klastritesse:
- Liida ainsuse/mitmuse variandid (jäta alles sagedasem vorm)
- Liida sidekriipsuga ja sidekriipsuta vormid
- Rühmita sünonüümid kõige sagedasema termini alla

### 4. samm: eemalda duplikaadid ja järjesta

- Hägus sobitus slugitud nimedel (Levenshteini kaugus <= 2)
- Ära liida alla 5 tähemärgi pikkuseid slugisid ainult Levenshteini põhjal automaatselt; nõua tokenite kattumist või käsitsi ülevaatust
- Hinda iga kandidaat: `(frequency * 2) + (heading_presence * 5) + (emphasis * 1)`
- Tagasta 5–10 parimat järjestatud soovitust

### Väljundvorming

```
## Tag Suggestions: [Post Title]

| Rank | Tag | Score | Source |
|------|-----|-------|--------|
| 1 | content-marketing | 18 | H2 + 6 mentions |
| 2 | seo-strategy | 14 | H3 + 4 mentions |
| 3 | keyword-research | 11 | 5 mentions + bold |

### Suggested Categories
- Primary: [best-fit category]
- Secondary: [optional second category]
```

## CMS-adapterid

### Adapterite ülevaade

| CMS | API tüüp | Autentimismeetod | Siltide mudel |
|-----|----------|-------------|------------|
| WordPress | REST | Rakenduse paroolid (base64) | Esmaklassilised objektid ID-dega |
| Shopify | GraphQL (Admin API) | Admin API juurdepääsutoken | Stringimassiiv objektil Article |
| Ghost | REST (Admin API) | API-võti JWT-allkirjastamisega | Esmaklassilised objektid |
| Strapi | REST või GraphQL | API-token (Bearer) | Kasutaja määratud sisutüüp |
| Sanity | GROQ / Mutations | Projektitoken (Bearer) | Dokumenditüüp |

### WordPressi adapter

**Siltide loend**:
```
GET {CMS_URL}/wp-json/wp/v2/tags?per_page=100&search={keyword}
Authorization: Basic {base64(username:app_password)}
```

**Sildi loomine**:
```
POST {CMS_URL}/wp-json/wp/v2/tags
Body: {"name": "Tag Name", "slug": "tag-name", "description": "Optional"}
```

**Kategooriate loend** (hierarhiline, toetab parent-välja):
```
GET {CMS_URL}/wp-json/wp/v2/categories?per_page=100
```

**Kategooria loomine**:
```
POST {CMS_URL}/wp-json/wp/v2/categories
Body: {"name": "Category", "slug": "category", "parent": 0}
```

**Siltide määramine postitusele**:
```
POST {CMS_URL}/wp-json/wp/v2/posts/{id}
Body: {"tags": [1, 2, 3], "categories": [4]}
```

Lehekülgede jaotus: täieliku loendi saamiseks järgi päist `X-WP-TotalPages`.

### Shopify adapter

Sildid on Shopifys stringimassiivid objektil Article, mitte esmaklassilised objektid.

**Artikli siltide uuendamine** (GraphQL Admin API):
```graphql
mutation {
  articleUpdate(id: "gid://shopify/Article/123", article: {
    tags: ["tag-one", "tag-two", "tag-three"]
  }) {
    article { id tags }
    userErrors { field message }
  }
}
```

**Kõigi kasutuses olevate siltide loend** (GraphQL):
```graphql
{
  articles(first: 250, after: $cursor) {
    pageInfo { hasNextPage endCursor }
    edges {
      node { id title tags }
    }
  }
}
```

Autentimispäis: `X-Shopify-Access-Token: {token}`

Lehekülgede jaotus: korda tsüklit, kuni `pageInfo.hasNextPage` on tõene, andes
järgmise `$cursor` väärtuseks `endCursor`.

Märkus: REST API märgiti pärandiks okt 2024. GraphQL on uutele rakendustele nõutav alates apr 2025.

### Ghosti adapter

**Siltide loend**:
```
GET {CMS_URL}/ghost/api/admin/tags/?limit=all
Authorization: Ghost {jwt_token}
```

**Sildi loomine**:
```
POST {CMS_URL}/ghost/api/admin/tags/
Body: {"tags": [{"name": "Tag Name", "slug": "tag-name"}]}
```

JWT-i genereerimine: allkirjasta admini API-võtmega (vorming id:secret), iat = praegu, exp = 5 min,
audience = `/admin/`.

### Strapi adapter

Lõpp-punkt genereeritakse sisutüüpidest automaatselt. Tüüpiline seadistus:

```
GET {CMS_URL}/api/tags?pagination[pageSize]=100
POST {CMS_URL}/api/tags
Body: {"data": {"name": "Tag Name", "slug": "tag-name"}}
Authorization: Bearer {api_token}
```

Lehekülgede jaotus: suurenda `pagination[page]` väärtust, kuni kõik lehed on läbi käidud.

Strapi v4 vastused kasutavad ümbrist `data` koos `attributes`-iga; Strapi v5 kasutab
lamedamat vastusekuju. Tuvasta versioon või normaliseeri enne duplikaatide
eemaldamist mõlemad kujud. Kontrolli väljade nimesid oma sisutüübi skeemist.

### Sanity adapter

**Siltide päring** (GROQ):
```
*[_type == "tag"] { _id, name, slug }
```

**Sildi loomine** (Mutations API):
```
POST https://{project_id}.api.sanity.io/{SANITY_API_VERSION}/data/mutate/{dataset}
Body: {"mutations": [{"create": {"_type": "tag", "name": "Tag", "slug": {"current": "tag"}}}]}
Authorization: Bearer {token}
```

Vaikimisi `SANITY_API_VERSION` peab olema projektikeskkonna antud praegune
testitud API kuupäev; ära kirjuta seda genereeritud päringutesse kõvasti sisse.

## Taksonoomia auditi töövoog

### 1. samm: inventuur

Skaneeri kõik sihtkaustas olevad postitused (või tõmba CMS-ist). Koosta kaart:
- tag_name -> [sildikasutajate postitusfailide/ID-de loend]
- category_name -> [postitusfailide/ID-de loend]

### 2. samm: tervisekontrollid

| Kontroll | Lävend | Tegevus |
|-------|-----------|--------|
| Õhukesed sildiarhiivid | < 5 postitust sildi kohta | Vaata üle liitmiseks või noindex’iks pärast liikluse, kavatsuse ja lingikontrolli |
| Orvuks jäänud sildid | 0 postitust | Soovita kustutamist |
| Siltide paisumine | Üle `max(50, post_count * 0.25)` sildi kokku, kohandatud taksonoomia eesmärgi järgi | Soovita koondamist |
| Kategooriate sügavus | > 3 tasandit | Soovita lamendamist |
| Kategoriseerimata postitused | Kategooria määramata | Määra sobivasse kategooriasse |
| Dubleerivad slugid | Sama slug, eri nimi | Liida kanoonilisse versiooni |

### 3. samm: soovitused

Rühmita leiud prioriteedi järgi:
- **Kriitiline**: orvuks jäänud sildid, mis loovad tühje arhiivilehti (indekseerimisraiskus)
- **Kõrge**: õhukesed sildid, millel < 5 postitust pärast liikluse, kavatsuse ja lingikontrolli
- **Keskmine**: siltide paisumine üle skaleeritud lävendi (lahjendatud taksonoomia, raskem navigeerida)
- **Madal**: nimede ebajärjekindlus (segatud tähesuurus, sidekriips vs tühik)

### Väljundvorming

```
## Taxonomy Audit: [Site/Directory]

**Total tags**: [n] | **Total categories**: [n]
**Healthy**: [n] | **Thin**: [n] | **Orphan**: [n]

### Critical Issues
- [orphan tags list]

### Recommendations
1. Merge [tag-a] and [tag-b] (same topic, [n] combined posts)
2. Delete orphan tags: [list]
3. Merge or noindex tag archives with < 5 posts only after traffic, intent, and link checks
```

## Kogu saiti hõlmavad juhised

- Sea eesmärgiks 5–10 põhikategooriat saidi kohta (laiad teemad)
- Sildil peaks olema vähemalt 5 postitust, enne kui luua arhiivileht
- Kasuta järjekindlat slugivormingut: väiketähed, sidekriipsuga eraldatud
- Igal postitusel on vaja täpselt 1 esmast kategooriat
- Silte postituse kohta: soovitatav 3–8, ära kunagi ületa 15

## Keskkonnamuutujad

| Muutuja | Eesmärk | Näide |
|----------|---------|---------|
| CMS_TYPE | Platvormi identifikaator | wordpress, shopify, ghost, strapi, sanity |
| CMS_URL | CMS-i HTTPS baas-URL | https://example.com |
| CMS_ALLOWED_HOSTS | Valikuline komaga eraldatud CMS-hostide lubatute loend | example.com,admin.example.com |
| CMS_USERNAME | WordPressi kasutajanimi rakenduse paroolide kasutamisel | editor@example.com |
| CMS_API_KEY | Autentimismandaat | WordPressi rakenduse parool, API-token või võti |
| SANITY_API_VERSION | Sanity API kuupäev mutatsioonide jaoks | v2026-07-01 |

Need peavad olema määratud shelli keskkonnas. Ära kunagi hoia mandaate failides ega
kanna neid versioonihaldusse. Oskus loeb neid käituse ajal muutujate `$CMS_TYPE`, `$CMS_URL`,
`$CMS_USERNAME`, `$CMS_API_KEY` ja valikuliste platvormispetsiifiliste muutujate kaudu.

CMS-päringute turvareegel: nõua HTTPS-i, luba sõeluda ainult `http` ja `https`
teid, kuid saada autenditud päringud ainult üle HTTPS-i, lahenda DNS ja
blokeeri loopback/privaat-/link-local/reserveeritud IP-d, valideeri ümbersuunamised samade
kontrollidega või keela ümbersuunamised, piira ajalõpud 10 sekundiga ning jõusta
`CMS_ALLOWED_HOSTS`, kui see on seatud.

## Vigade käsitlemine

- **Puuduvad keskkonnamuutujad**: Kui CMS_TYPE, CMS_URL või CMS_API_KEY on määramata või kui WordPressil puudub CMS_USERNAME, teata, milline muutuja puudub, ja anna oodatav vorming
- **Vigased mandaadid**: Kui CMS API tagastab 401/403, teata „Autentimine ebaõnnestus – kontrolli CMS_USERNAME/CMS_API_KEY“ ja ära proovi uuesti
- **Ühenduse ajalõpud**: Kui CMS-i lõpp-punkt on pärast 10 sekundit kättesaamatu, teata ajalõpust ja soovita kontrollida CMS_URL-i
- **Dubleerivad sildislugid**: Kui silt on CMS-is juba olemas, jäta loomine vahele ja märgi „Silt on juba olemas: [nimi]“
- **Päringupiirangud**: Kui CMS API tagastab 429, austa `Retry-After` väärtust, kui see on olemas; muidu kasuta eksponentsiaalset tagasilangust ja proovi üks kord uuesti. Teata, kui piirang püsib
- **Toetamata CMS**: Kui CMS_TYPE ei ole üks 5 toetatud platvormist, loetle kehtivad valikud ja välju