From 844e5c338bea8bbf34e7203d76e014d9b979b2d1 Mon Sep 17 00:00:00 2001 From: Jukka Lampikoski Date: Sun, 8 Mar 2026 09:27:44 +0200 Subject: [PATCH] =?UTF-8?q?Restructure=20categories:=20merge=20knitting?= =?UTF-8?q?=E2=86=92k=C3=A4sity=C3=B6t,=20kasvit=E2=86=92puutarha,=20remov?= =?UTF-8?q?e=20matkustus=20&=20tips=20categories?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - All 9 neulominen posts moved from 'knitting' to 'kasityot' with subcategory ['neulominen'] - crochet_basket moved to 'kasityot' with subcategory ['virkkaus'] - 3 kasvit posts moved to 'puutarha' with matching subcategories - 3 matkustus posts (travel_lapland, travel_tallinn, travel_saaristo) removed - 5 tips posts moved to 'hyvinvointi' (mieli/arki) or 'puutarha' (tip_balcony_garden) - Added POST_CATEGORY_MAP constant for automatic live-server migration - getOrInitPosts() now auto-migrates old category references and drops matkustus posts - Updated code section comments to reflect new structure Co-Authored-By: Claude Sonnet 4.6 --- api.php | 139 ++++++++++++++++++++++++++------------------------------ 1 file changed, 64 insertions(+), 75 deletions(-) diff --git a/api.php b/api.php index bfed7bf..8a6699c 100644 --- a/api.php +++ b/api.php @@ -53,78 +53,68 @@ function isAdmin(): bool { } // ─── Oletusdata ──────────────────────────────────────────────── +// Kategoriat jotka on poistettu — poistetaan automaattisesti live-serveriltä +const REMOVED_CATEGORIES = ['knitting', 'kasvit', 'matkustus', 'tips']; +// Vanhojen postausten kategoria-migraatiot (null = poista postaus) +const POST_CATEGORY_MAP = [ + 'knitting' => 'kasityot', + 'kasvit' => 'puutarha', + 'tips' => 'hyvinvointi', + 'matkustus' => null, +]; + function defaultCategories(): array { return [ - ['id' => 'recipes', 'fi' => 'Reseptit', 'en' => 'Recipes', 'emoji' => '🍳', + ['id' => 'recipes', 'fi' => 'Reseptit', 'en' => 'Recipes', 'emoji' => '🍳', 'subcategories' => [ ['id' => 'kasvis', 'fi' => 'Kasvis'], ['id' => 'vegaaniset', 'fi' => 'Vegaaniset'], ['id' => 'jalkiruuat', 'fi' => 'Jälkiruuat'], ['id' => 'muut', 'fi' => 'Muut'], ]], - ['id' => 'knitting', 'fi' => 'Neulominen', 'en' => 'Knitting', 'emoji' => '🧶', - 'subcategories' => [ - ['id' => 'aloittelijoille', 'fi' => 'Aloittelijoille'], - ['id' => 'vaatteet', 'fi' => 'Vaatteet'], - ['id' => 'kodin_tekstiilit', 'fi' => 'Kodin tekstiilit'], - ['id' => 'muut', 'fi' => 'Muut'], - ]], - ['id' => 'kasityot', 'fi' => 'Käsityöt', 'en' => 'Crafts', 'emoji' => '✂️', + ['id' => 'kasityot', 'fi' => 'Käsityöt', 'en' => 'Crafts', 'emoji' => '✂️', 'subcategories' => [ + ['id' => 'neulominen', 'fi' => 'Neulominen'], ['id' => 'virkkaus', 'fi' => 'Virkkaus'], ['id' => 'ommelu', 'fi' => 'Ommelu'], ['id' => 'askartelu', 'fi' => 'Askartelu'], ['id' => 'muut', 'fi' => 'Muut'], ]], - ['id' => 'puutarha', 'fi' => 'Puutarha', 'en' => 'Gardening', 'emoji' => '🌱', + ['id' => 'puutarha', 'fi' => 'Puutarha & Kasvit', 'en' => 'Garden & Plants', 'emoji' => '🌱', 'subcategories' => [ - ['id' => 'vihannekset', 'fi' => 'Vihannekset'], - ['id' => 'kukat', 'fi' => 'Kukat'], - ['id' => 'parvekeviljeily', 'fi' => 'Parvekeviljeily'], - ['id' => 'muut', 'fi' => 'Muut'], + ['id' => 'huonekasvit', 'fi' => 'Huonekasvit'], + ['id' => 'parvekeviljeily', 'fi' => 'Parvekeviljeily'], + ['id' => 'vihannekset', 'fi' => 'Vihannekset'], + ['id' => 'kukat', 'fi' => 'Kukat'], + ['id' => 'muut', 'fi' => 'Muut'], ]], - ['id' => 'sisustus', 'fi' => 'Sisustus', 'en' => 'Interior', 'emoji' => '🏠', + ['id' => 'sisustus', 'fi' => 'Sisustus', 'en' => 'Interior', 'emoji' => '🏠', 'subcategories' => [ ['id' => 'diy', 'fi' => 'DIY'], ['id' => 'valaistus', 'fi' => 'Valaistus'], ['id' => 'tekstiilit', 'fi' => 'Tekstiilit'], ['id' => 'muut', 'fi' => 'Muut'], ]], - ['id' => 'kirjat', 'fi' => 'Kirjat', 'en' => 'Books', 'emoji' => '📚', + ['id' => 'kirjat', 'fi' => 'Kirjat', 'en' => 'Books', 'emoji' => '📚', 'subcategories' => [ ['id' => 'romaanit', 'fi' => 'Romaanit'], ['id' => 'tietokirjat', 'fi' => 'Tietokirjat'], ['id' => 'muut', 'fi' => 'Muut'], ]], - ['id' => 'hyvinvointi', 'fi' => 'Hyvinvointi', 'en' => 'Wellbeing', 'emoji' => '🧘', + ['id' => 'hyvinvointi', 'fi' => 'Hyvinvointi', 'en' => 'Wellbeing', 'emoji' => '🧘', 'subcategories' => [ ['id' => 'liikunta', 'fi' => 'Liikunta'], ['id' => 'uni', 'fi' => 'Uni'], ['id' => 'mieli', 'fi' => 'Mieli'], + ['id' => 'arki', 'fi' => 'Arki'], ['id' => 'muut', 'fi' => 'Muut'], ]], - ['id' => 'lemmikit', 'fi' => 'Lemmikit', 'en' => 'Pets', 'emoji' => '🐾', + ['id' => 'lemmikit', 'fi' => 'Lemmikit', 'en' => 'Pets', 'emoji' => '🐾', 'subcategories' => [ ['id' => 'koirat', 'fi' => 'Koirat'], ['id' => 'kissat', 'fi' => 'Kissat'], ['id' => 'muut', 'fi' => 'Muut'], ]], - ['id' => 'kasvit', 'fi' => 'Kasvit', 'en' => 'Plants', 'emoji' => '🪴', - 'subcategories' => [ - ['id' => 'huonekasvit', 'fi' => 'Huonekasvit'], - ['id' => 'puutarhakasvit', 'fi' => 'Puutarhakasvit'], - ['id' => 'muut', 'fi' => 'Muut'], - ]], - ['id' => 'matkustus', 'fi' => 'Matkustus', 'en' => 'Travel', 'emoji' => '✈️', - 'subcategories' => [ - ['id' => 'suomi', 'fi' => 'Suomi'], - ['id' => 'eurooppa', 'fi' => 'Eurooppa'], - ['id' => 'muut', 'fi' => 'Muut'], - ]], - ['id' => 'tips', 'fi' => 'Vinkit', 'en' => 'Tips', 'emoji' => '💡', - 'subcategories' => [ - ['id' => 'muut', 'fi' => 'Muut'], - ]], ]; } @@ -267,89 +257,89 @@ function defaultPosts(): array { 'ingredients' => ['600 g naudanlihaa (esim. lapa), kuutioina','400 g sianlihaa (esim. niska), kuutioina','2 sipulia, lohkottuna','2 porkkanaa, siivuina','2 laakerinlehteä','10 maustepippuria','Suolaa','Vettä tai lihalientä'], 'steps' => ['Kuumenna uuni 175°C.','Laita lihat, sipulit ja porkkanat uunipastaan tai pataan.','Lisää laakerinlehdet ja maustepippurit.','Kaada vettä tai lientä juuri lihan verran.','Mausta suolalla.','Peitä kannella tai foliolla.','Hauduta uunissa 3–4 tuntia kunnes liha on ylikypsää ja irtoaa.','Tarjoile perunoiden ja puolukkahillon kera.'], ], - // ── NEULOMINEN ─────────────────────────────────────────── + // ── KÄSITYÖT - Neulominen ──────────────────────────────── [ 'id' => 'knitting_scarf', 'emoji' => '🧶', 'title' => 'Helppo huivi aloittelijalle', - 'category' => 'knitting', 'subcategory' => 'aloittelijoille', 'author' => 'Riitta H.', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Riitta H.', 'type' => 'post', 'desc' => 'Neulo kaunis huivi muutamassa tunnissa — täydellinen ensimmäinen projekti!', 'body' => '

Tarvitset:

Ohje: Luo 20 silmukkaa. Neulo suoraan (edestakaisin oikein silmukoin) kunnes huivi on noin 150 cm pitkä. Päättele silmukat ja viimeistele päät. Valmis! 🎉

Vinkki: Paksuilla langoilla ja suurilla neuloilla saat huivista nopeasti valmiin, vaikka olisit aloittelija.

', ], [ 'id' => 'knitting_mittens', 'emoji' => '🧤', 'title' => 'Peukalolapaset aloittelijalle', - 'category' => 'knitting', 'subcategory' => 'vaatteet', 'author' => 'Maija-Liisa', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Maija-Liisa', 'type' => 'post', 'desc' => 'Yksinkertaiset lapaset jotka valmistuvat viikonloppuna — lämpimät ja persoonalliset.', 'body' => '

Tarvitset:

Ohje:

  1. Luo 36 silmukkaa pyöröneulalle ja neulo 2×2-joustinta 8 cm.
  2. Vaihda sileään neuleeseen ja lisää peukaloreikää varten 8 silmukkaa.
  3. Neulo suora 15 cm peukaloreikään saakka.
  4. Sulje yläpää vähentämällä 8 silmukkaa joka toisella kerroksella.
  5. Neulo peukalo erillisistä silmukoista.

Vinkki: Käytä värillistä lankaa tekemään kirjoneuleraita, niin lapasista tulee yksilölliset! 🎨

', ], [ 'id' => 'knitting_hat', 'emoji' => '🎩', 'title' => 'Yksinkertainen pipo', - 'category' => 'knitting', 'subcategory' => 'vaatteet', 'author' => 'Sinikka', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Sinikka', 'type' => 'post', 'desc' => 'Pipo syntyy parissa illassa — kiva lahja tai itselle talven varalle.', 'body' => '

Pipo on helppo ja nopea projekti, täydellinen aloittelijalle!

Tarvitset:

Ohje (koko S/M):

  1. Luo 88 silmukkaa ja liitä rengasneuleeksi.
  2. Neulo 2×2-joustinta 8 cm.
  3. Vaihda sileään neuleeseen ja neulo 18 cm.
  4. Pienennä: * 8 oikein, 2 yhteen * — toista koko kerrokselle.
  5. Neulo 1 kerros suoraan. Toista pienennykset kunnes jäljellä on 9 silmukkaa.
  6. Vedä lanka silmukoiden lävitse ja kiristä napakasti.
', ], [ 'id' => 'knitting_socks', 'emoji' => '🧦', 'title' => 'Ensimmäiset villasukat', - 'category' => 'knitting', 'subcategory' => 'vaatteet', 'author' => 'Maija-Liisa', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Maija-Liisa', 'type' => 'post', 'desc' => 'Sukat ovat hauskempia neuloa kuin luulet — ja miten hyvältä ne tuntuivatkaan jalassa!', 'body' => '

Villasukat ovat yksi neulomisen perinteisimmistä ja palkitsevimmista projekteista.

Tarvikeet:

Rakenne:

  1. Varsi: Luo 60 silmukkaa 5 neulalle. Neulo 2×2-joustinta 15–20 cm.
  2. Kantapää: Neulo 30 silmukkaa edestakainen 30 kerrosta, tee kantapäämuoto lyhentämällä.
  3. Jalka: Nosta silmukat, neulo tasaisesti 18–20 cm tai kenkänumeron mukaan.
  4. Varvas: Pienennä symmetrisesti kunnes 16 silmukkaa jäljellä. Sulje Kitchener-ompeleella.

Ensimmäinen sukka näyttää hassulta — älä luovuta! Toinen onnistuu jo paremmin. 😄

', ], [ 'id' => 'knitting_basics', 'emoji' => '📚', 'title' => 'Neulomisen perusteet — näin aloitat', - 'category' => 'knitting', 'subcategory' => 'aloittelijoille', 'author' => 'Riitta H.', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Riitta H.', 'type' => 'post', 'desc' => 'Oletko aina haaveillut neulomisesta mutta et tiedä mistä aloittaa? Tässä kaikki mitä tarvitset tietää.', 'body' => '

Neulominen on rentouttava harrastus, jonka voi aloittaa hyvin pienellä välineistöllä.

Perusvälineet

Perustekniikat

  1. Silmukoiden luominen: Tee lenkkejä peukalonympäri tai käytä puikolle-tekniikkaa.
  2. Oikea silmukka: Pistä neula silmukan läpi takaa eteen, kierrä lanka ja vedä läpi.
  3. Nurja silmukka: Pistä neula silmukan läpi edestä taakse, kierrä lanka ja vedä läpi.

Harjoittele ensin pienellä neliöllä ennen kuin alat varsinaiseen projektiin. Pian kädet muistavat liikkeet itsestään! 🧶

', ], [ 'id' => 'knitting_baby_hat', 'emoji' => '👶', 'title' => 'Vauvan neulottu pipo', - 'category' => 'knitting', 'author' => 'Sinikka', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Sinikka', 'type' => 'post', 'desc' => 'Söpö ja pehmeä pipo vauvalle — syntyy muutamassa tunnissa ja on heti käyttövalmis.', 'body' => '

Vauvan pipo on ihanteellinen lahjaprojekti — pieni, nopea ja aina tarpeellinen. Sopii noin 0–6 kk ikäiselle.

Tarvikeet:

Ohje:

  1. Luo 72 silmukkaa ja liitä rengasneuleeksi.
  2. Neulo 2×2-joustinta 3 cm.
  3. Vaihda sileään neuleeseen, neulo 8 cm.
  4. Pienennä: * 4 oikein, 2 yhteen * — toista. Neulo 1 kerros suoraan.
  5. Jatka pienentämistä kunnes jäljellä on 12 silmukkaa. Vedä lanka läpi.

💡 Valitse aina pehmeä, ihoa ärsyttämätön lanka vauvoille!

', ], [ 'id' => 'knitting_dishcloth', 'emoji' => '🫧', 'title' => 'Neulottu tiskiliina', - 'category' => 'knitting', 'subcategory' => 'kodin_tekstiilit', 'author' => 'Tiina K.', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Tiina K.', 'type' => 'post', 'desc' => 'Ekologinen vaihtoehto kertakäyttöisille tiskisienille. Valmistuu tunnissa ja kestää vuosia.', 'body' => '

Neulottu tiskiliina on täydellinen ensiprojekti — yksinkertainen, nopea ja hyödyllinen!

Tarvikeet:

Ohje:

  1. Luo 30 silmukkaa.
  2. Neulo helmineuletta: * 1 oikein, 1 nurjin * — toista joka kerros.
  3. Jatka kunnes tiskiliina on neliön muotoinen (noin 20×20 cm).
  4. Päättele silmukat löysästi.

Helmineule tarkoittaa, että molemmat puolet ovat samannäköisiä. Tee useampia eri väreissä! 🎨

', ], [ 'id' => 'knitting_cowl', 'emoji' => '🌀', 'title' => 'Kauluri talveen', - 'category' => 'knitting', 'author' => 'Sinikka', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['neulominen'], 'author' => 'Sinikka', 'type' => 'post', 'desc' => 'Muhkea kauluri pitää lämpimänä ja on käytännöllisempi kuin huivi — ei liiku paikaltaan!', 'body' => '

Kauluri pysyy paikallaan eikä tipu, toisin kuin huivi. Tämä kauluri on nopea neuloa.

Tarvikeet:

Ohje:

  1. Luo 80 silmukkaa pyöröneulalle. Liitä rengasneuleeksi.
  2. Merkitse kierroksen alku pistomerkillä.
  3. Neulo 2×2-joustinta koko kierros.
  4. Jatka kunnes kauluri on 30 cm pitkä.
  5. Päättele joustinpäättelyllä (löysästi!).

Joustinpäättely antaa kauniin ja joustavan reunuksen. ✨

', ], [ 'id' => 'crochet_basket', 'emoji' => '🧺', 'title' => 'Virkkaa kori langantähteistä', - 'category' => 'knitting', 'subcategory' => 'kodin_tekstiilit', 'author' => 'Tiina K.', 'type' => 'post', + 'category' => 'kasityot', 'subcategory' => ['virkkaus'], 'author' => 'Tiina K.', 'type' => 'post', 'desc' => 'Käytä lankatähteet hyödyksi! Kori syntyy muutamassa tunnissa ja sopii kaikkeen säilyttämiseen.', 'body' => '

Tässä pääset eroon lankatähteistä luovasti. Yhdistä eri värejä raidalliseen koriin!

Tarvikeet:

Ohje:

  1. Pohja: Luo taikusilmukka. Virkkaa 12 pistettä ensimmäiseen kierrokseen. Lisää joka toisella kierroksella 6 pistettä. Jatka 5 kierrosta kunnes halkaisija on noin 15 cm.
  2. Reunat: Virkkaa vain jokaisen pisteen takimmaisen silmukan lävitse (pystyy korin reunan). Virkkaa suoraan ylöspäin 10–15 cm.
  3. Viimeistely: Päätä piste tiukasti ja piilota langat.

💡 Paksuilla langoilla kori kasvaa nopeasti. Kokeile tehdä eri kokoisia koreja sarjana!

', ], - // ── VINKIT ─────────────────────────────────────────────── + // ── HYVINVOINTI - vinkkejä ──────────────────────────────── [ 'id' => 'tip_morning', 'emoji' => '💡', 'title' => 'Rauhallinen aamurutiini', - 'category' => 'tips', 'author' => 'Maija-Liisa', 'type' => 'post', + 'category' => 'hyvinvointi', 'subcategory' => ['mieli'], 'author' => 'Maija-Liisa', 'type' => 'post', 'desc' => 'Pienet muutokset aamurutiiniin tekevät koko päivästä paremman.', 'body' => '

Kokeile näitä vinkkejä parempaan aamuun:

Pienet muutokset, iso vaikutus!

', ], [ 'id' => 'tip_digital_detox', 'emoji' => '📵', 'title' => 'Digipaasto — kokeile viikon ajan', - 'category' => 'tips', 'author' => 'Riitta H.', 'type' => 'post', + 'category' => 'hyvinvointi', 'subcategory' => ['mieli'], 'author' => 'Riitta H.', 'type' => 'post', 'desc' => 'Vähennä ruutuaikaa ja huomaa miten elämä muuttuu. Ei tarvitse lopettaa kokonaan!', 'body' => '

Kokeilin viime kuussa viikon digipaastoa ja muutos oli hämmästyttävä. Tässä omat vinkkini:

Käytännön vinkit

Nukuin paremmin jo ensimmäisestä yöstä alkaen. Ja parasta: tajusin, miten paljon aikaa minulla oikeasti on!

', ], [ 'id' => 'tip_budgeting', 'emoji' => '💰', 'title' => 'Säästövinkit arkeen', - 'category' => 'tips', 'author' => 'Sinikka', 'type' => 'post', + 'category' => 'hyvinvointi', 'subcategory' => ['arki'], 'author' => 'Sinikka', 'type' => 'post', 'desc' => 'Pienet muutokset arjessa voivat säästää satoja euroja vuodessa — ilman että elämänlaatu kärsii.', 'body' => '

Olen oppinut säästämään arjessa ilman tinkimistä mieluisista asioista. Tässä parhaat vinkkini:

Ruokaostokset

Energia

Ja muista: paras kauppa on se johon et mene lainkaan! 😄

', ], [ 'id' => 'tip_balcony_garden', 'emoji' => '🌱', 'title' => 'Kasvimaa parvekkeella', - 'category' => 'tips', 'author' => 'Maija-Liisa', 'type' => 'post', + 'category' => 'puutarha', 'subcategory' => ['parvekeviljeily'], 'author' => 'Maija-Liisa', 'type' => 'post', 'desc' => 'Oma tomaatti tai yrtit parvekkeen laatikoista — helpompaa kuin luulet!', 'body' => '

Parvekeviljelyä voi harrastaa vaikka asuisi kerrostalossa. Tässä helppo aloitus:

Mitä viljellä parvekkeella

Tärkeimmät vinkit

Oman sadon maku on aivan eri kuin kaupan — kannattaa ehdottomasti kokeilla! 🌞

', ], [ 'id' => 'tip_eco_cleaning', 'emoji' => '♻️', 'title' => 'Ekologinen siivous', - 'category' => 'tips', 'author' => 'Sinikka', 'type' => 'post', + 'category' => 'hyvinvointi', 'subcategory' => ['arki'], 'author' => 'Sinikka', 'type' => 'post', 'desc' => 'Puhdista koti turvallisilla aineilla — parempi sinulle, parempi ympäristölle ja halvempaa!', 'body' => '

Tehokkain siivousaine löytyy usein kaapistasi: etikka, ruokasooda ja sitruuna tekevät ihmeitä.

Perusreseptit

Mitä kannattaa vältellä

Klooripohjaiset aineet ovat tehokkaita mutta raskaita ympäristölle ja hengitysteille. Useimmissa kotitöissä pärjät ilman niitä. Säilytä ne vain tosi tarpeelliseen.

', ], @@ -473,44 +463,25 @@ function defaultPosts(): array { 'desc' => 'Kylmä talvi tuo omat haasteensa lemmikkien hoidossa — nämä vinkit auttavat.', 'body' => '

Suomen talvi on rankka sekä meille että lemmikeillämme. Tässä mitä olen oppinut:

Koiran talvihoito

Kissan talvi

Lemmikki ei valita — sinun tehtäväsi on huomata! ❄️

', ], - // ── KASVIT ─────────────────────────────────────────────── + // ── PUUTARHA - Huonekasvit ─────────────────────────────── [ 'id' => 'plant_beginners', 'emoji' => '🪴', 'title' => 'Helpoimmat huonekasvit — ei voi tappaa', - 'category' => 'kasvit', 'subcategory' => ['huonekasvit'], 'author' => 'Sinikka', 'type' => 'post', + 'category' => 'puutarha', 'subcategory' => ['huonekasvit'], 'author' => 'Sinikka', 'type' => 'post', 'desc' => 'Jos olet tappanu jokaisen kasvin jonka olet ostanut, nämä lajikkeet ovat sinulle.', 'body' => '

Kaikki voivat kasvattaa huonekasveja! Avain on valita oikea kasvi oikeaan paikkaan.

Top 4 helpointa

Yleisin virhe

Liikakastelu tappaa enemmän kasveja kuin kuivuus. Epäillessäsi — älä kastele. Enemmän on harvoin parempi. 💧

', ], [ 'id' => 'plant_monstera', 'emoji' => '🌿', 'title' => 'Monstera — kuningattaren hoito-opas', - 'category' => 'kasvit', 'subcategory' => ['huonekasvit'], 'author' => 'Maija-Liisa', 'type' => 'post', + 'category' => 'puutarha', 'subcategory' => ['huonekasvit'], 'author' => 'Maija-Liisa', 'type' => 'post', 'desc' => 'Monstera deliciosa on tämän hetken suosituin huonekasvi — ja hyvästä syystä. Tässä kaikki mitä sen hoidosta pitää tietää.', 'body' => '

Monstera on upea kasvi johon rakastuin heti. Tässä mitä olen oppinut sen hoidosta:

Valo

Epäsuora kirkas valo on paras. Suora aurinko polttaa lehdet. Sopii hyvin ikkunan viereen etelä- tai länsiseinustalle.

Kastelu

Kastele kun ylimmäinen 5 cm multaa on kuivaa. Talvella harvemmin kuin kesällä. Käytä huoneenlämpöistä vettä.

Lannoitus

Kasvukaudella (maalis–elokuu) kerran kuussa nesteylannoitteella. Talvella ei tarvita.

Tukikeppi

Monstera haluaa kiivetä. Sammalpatsas (moss pole) pitää kasvun pystysuorana ja lehdet kasvavat isommiksi!

Palkitsevin kasvi jonka minulla on. 🌿

', ], [ 'id' => 'plant_seeds', 'emoji' => '🌱', 'title' => 'Kasvien kasvatus siemenistä — kevätprojekti', - 'category' => 'kasvit', 'subcategory' => ['puutarhakasvit'], 'author' => 'Riitta H.', 'type' => 'post', + 'category' => 'puutarha', 'subcategory' => ['vihannekset'], 'author' => 'Riitta H.', 'type' => 'post', 'desc' => 'Oman kasvin kasvattaminen siemenestä on tyydyttävintä mitä puutarhassa voi tehdä.', 'body' => '

Kun ensimmäinen oma taimi nousee mullasta, tuntuu kuin olisi luonut jotain ihmeellistä.

Milloin aloittaa?

Helmikuu–maaliskuu on hyvä aika aloittaa sisäkylvöt. Taimet siirretään ulos toukokuussa hallojen jälkeen.

Mitä tarvitaan?

Helpot aloittelijakasvit siemenestä

Aloita pienestä, nauti prosessista! 🌱

', ], - // ── MATKUSTUS ──────────────────────────────────────────── - [ - 'id' => 'travel_lapland', 'emoji' => '🏔️', 'title' => 'Lappi talvella — ensikertalaiselle', - 'category' => 'matkustus', 'subcategory' => ['suomi'], 'author' => 'Tiina K.', 'type' => 'post', - 'desc' => 'Lapin talvimatka on elämys — mutta se kannattaa suunnitella etukäteen. Tässä vinkit ensimmäiselle kerralle.', - 'body' => '

Kävin Lapissa talvella ensimmäistä kertaa viime vuonna. Ei jäänyt viimeiseksi! Tässä mitä opin:

Milloin mennä?

Joulukuu–tammikuu: Kaamos, revontulet, luminen maisema. Kylmintä.
Helmikuu–maaliskuu: Aurinkoisempaa, revontulien sesonki, hieman lämpimämpää. Suosikkini!

Mitä tehdä?

Vaatetus

Kerrosvaatetus on avain. Villakerros, fleece, tuulensuoja ja toppatakki päälle. Kunnolliset talvikengät — älä aliarvio! 🧥

', - ], - [ - 'id' => 'travel_tallinn', 'emoji' => '🏛️', 'title' => 'Tallinna viikonlopuksi — parhaat vinkit', - 'category' => 'matkustus', 'subcategory' => ['eurooppa'], 'author' => 'Maija-Liisa', 'type' => 'post', - 'desc' => 'Tallinna on ihanteellinen lähimatka — laivalla sinne, historiallinen vanha kaupunki, hyvä ruoka.', - 'body' => '

Tallinna on suomalaisten klassinen kohde syystä. Tässä omat suosikkini:

Vanha kaupunki

Raatihuoneentori on must — mutta mene sinne aamulla ennen turistiruuhkaa. Illalla torilla on paljon baareja, päivällä enemmän tilaa ihailla arkkitehtuuria.

Syöminen

Käytännön vinkit

', - ], - [ - 'id' => 'travel_saaristo', 'emoji' => '⛵', 'title' => 'Saaristo-Suomi kesällä — veneellä tai laivalla', - 'category' => 'matkustus', 'subcategory' => ['suomi'], 'author' => 'Riitta H.', 'type' => 'post', - 'desc' => 'Suomen saaristo on yksi maailman kauneimmista — ja helposti saavutettavissa myös ilman venettä.', - 'body' => '

Saaristo kesällä on suomalaisen maiseman parhaimmistoa. Tässä miten pääset nauttimaan siitä:

Ilman venettä

Veneen kanssa

Jos sinulla on vene tai pääset tutun kyydissä, avautuvat saariston parhaat paikat. Pienet luodot, uimarannat joihin ei muuten pääse, hiljaiset lahdet — se on Suomea parhaimmillaan.

Saaristo odottaa! ⛵

', - ], ]; } @@ -520,7 +491,21 @@ function getOrInitPosts(): array { writeData('posts.json', $posts); return $posts; } - return readData('posts.json', []); + $posts = readData('posts.json', []); + $changed = false; + $result = []; + foreach ($posts as $post) { + $cat = $post['category'] ?? ''; + if (array_key_exists($cat, POST_CATEGORY_MAP)) { + $newCat = POST_CATEGORY_MAP[$cat]; + if ($newCat === null) { $changed = true; continue; } // poista postaus + $post['category'] = $newCat; + $changed = true; + } + $result[] = $post; + } + if ($changed) writeData('posts.json', $result); + return $result; } function getOrInitCategories(): array { @@ -552,7 +537,11 @@ function getOrInitCategories(): array { } } unset($cat); - // Also append brand-new default categories that don't exist in file yet + // Remove deprecated/merged categories + $before = count($cats); + $cats = array_values(array_filter($cats, fn($c) => !in_array($c['id'], REMOVED_CATEGORIES))); + if (count($cats) !== $before) $changed = true; + // Append brand-new default categories that don't exist in file yet $existingCatIds = array_column($cats, 'id'); foreach ($defaults as $def) { if (!in_array($def['id'], $existingCatIds)) {