# Shopify

Ai un magazin Shopify? Publică-ți blogul direct în secțiunea lui de
**Blog posts**. Fiecare articol pe care îl publici aici devine un articol
Shopify real, în tema ta, la adresele magazinului tău, cu titlul și descrierea
SEO, cu imaginea reprezentativă și cu stilizarea lui. Articolele scrise de
tine nu sunt atinse niciodată.

Livrarea în Shopify trage, nu împinge. Aplicația DailySmith interoghează
același [flux de sincronizare](/ro/docs/delivery-api) pe care îl folosește și
plugin-ul de WordPress, cu cheia publică a site-ului tău, așa că nicio
credențială Shopify nu părăsește contul magazinului și nicio credențială
DailySmith nu e stocată nicăieri.

:::callout{severity=info title="Open source, și a ta dacă vrei s-o rulezi"}
DailySmith pentru Shopify e open source (MIT):
[TechnicalInsideTI/dailysmith-shopify-app](https://github.com/TechnicalInsideTI/dailysmith-shopify-app).
Instaleaz-o ca aplicație din linkul pe care ți-l dăm, sau rulează-o tu, pentru
un singur magazin, cu un token din propriul tău admin (vezi **Rulează-o tu**
mai jos). Ambele fac aceeași sincronizare.
:::

## Instalează aplicația

::::steps

:::step[Instalează DailySmith în magazinul tău]
Deschide linkul de instalare și aprobă-l. Shopify îți arată cele două
permisiuni cerute: citire și scriere de **content**, adică bloguri și
articole, și nimic altceva. Fără comenzi, fără clienți, fără produse.
:::

:::step[Lipește cheia site-ului și alege un blog]
Aplicația se deschide în interiorul admin-ului Shopify (care e în engleză).
Introdu cheia publică a site-ului tău (`pk_…`, de pe pagina site-ului din
dashboard-ul DailySmith) și alege blogul Shopify în care se publică. Un
magazin cu un singur blog îl are deja selectat. Decide dacă articolele ajung
**publicate** sau **ascunse**, ca să le poți vedea mai întâi în admin, și
salvează.
:::

:::step[Testează, apoi sincronizează]
**Test connection** listează blogurile DailySmith care se vor sincroniza.
**Sync now** rulează prima sincronizare pe loc. După aceea aplicația
sincronizează singură, din oră în oră.
:::

::::

## Ce ajunge

| Câmp Shopify | De unde |
|---|---|
| Title | Titlul articolului |
| Handle (adresa) | Slug-ul articolului. Dacă un articol de-al tău îl ține deja, al nostru primește un sufix numeric și al tău își păstrează adresa |
| Content | HTML-ul randat, împachetat și stilizat (mai jos) |
| Excerpt | Rezumatul generat |
| Author | Numele setat în aplicație, care pornește de la numele magazinului. Setat o singură dată, la crearea articolului |
| Published date | Momentul publicării înregistrat aici |
| Visibility | Publicat sau ascuns, după setarea ta. O actualizare o aplică din nou |
| Featured image | Imaginea principală a articolului, cu textul ei alternativ, adusă o singură dată per imagine |
| Search engine listing | Titlul SEO și meta-descrierea, în aceleași câmpuri pe care le-ai edita manual |

Fiecare blog DailySmith de pe site ajunge în singurul blog Shopify pe care
l-ai ales. Un blog care publică în mai multe limbi trimite doar limba lui;
vezi **Limbi** mai jos.

## Ce nu e atins niciodată

Fiecare articol creat de aplicație poartă id-ul articolului DailySmith
într-un metafield propriu (`dailysmith.post_id`). Actualizările și retragerile
merg doar la articolul care poartă id-ul sincronizat, niciodată la unul găsit
după handle sau titlu. Asta e ceea ce îi permite aplicației să împartă un blog
cu articolele scrise de tine:

- **Un articol de-al tău pe același handle** își păstrează handle-ul și
  conținutul. Al nostru ia `handle-2`.
- **Un articol de-al nostru pe care îl ștergi din admin** rămâne șters până
  când articolul se schimbă în DailySmith, și atunci e creat din nou.
- **Un articol de-al nostru pe care îl editezi din admin** e suprascris data
  viitoare când articolul se schimbă în DailySmith. Editează articolul aici,
  sau ascunde-l.
- **Dezinstalarea aplicației** lasă fiecare articol la locul lui. La fel și
  reinstalarea: aplicația își recunoaște articolele după metafield și le
  preia din nou, în loc să creeze o a doua copie.

:::callout{severity=success title="Retragerea unui articol"}
**Retrage** pe un articol îl oprește din a mai fi servit de noi și, în cel
mult o zi, îi trece articolul Shopify pe **ascuns**. Niciodată șters: articolul
își păstrează adresa și conținutul în admin-ul tău, iar **Publică din nou**
de aici publică din nou același articol.
:::

## Stilizare

Articolele cu componente bogate (callout-uri, ghiduri pas cu pas, comparații,
grafice) încarcă foaia de stil a componentelor de la DailySmith printr-un
`<link>` la începutul conținutului, și poartă [paleta blogului](/ro/docs/theming)
tău într-un `<style>` alături. Articolele simple poartă doar paleta. Totul e
limitat la un wrapper din jurul articolului, așa că nu poate restiliza restul
temei, iar wrapper-ul lasă tipografia pe seama temei, ca articolul să se
citească la fel ca restul magazinului.

## Limbi

:::callout{severity=warning title="O singură limbă per blog Shopify"}
Un blog Shopify e într-o singură limbă, așa că aplicația oglindește doar
**limba proprie** a unui blog. Un blog DailySmith care publică și în limbi
suplimentare continuă să le servească de pe domeniul tău. Dacă vrei două
limbi în Shopify, rulează două bloguri DailySmith, câte unul per limbă, și
îndreaptă-l pe fiecare spre propriul blog Shopify printr-o a doua instalare a
aplicației.
:::

## Rulează-o tu

Nu ai nevoie de noi ca să găzduim aplicația. Pentru un singur magazin,
creează o aplicație personalizată în propriul tău admin și rulează serviciul
oriunde poate sta pornit un proces:

::::steps

:::step[Creează o aplicație personalizată în Shopify]
În admin-ul Shopify, mergi la **Settings → Apps and sales channels → Develop
apps** și creează o aplicație. La **Admin API integration**, bifează
`read_content` și `write_content`, instaleaz-o și copiază **Admin API access
token** (`shpat_…`). Shopify îl arată o singură dată.
:::

:::step[Rulează serviciul]
```bash
git clone https://github.com/TechnicalInsideTI/dailysmith-shopify-app
cd dailysmith-shopify-app
npm ci
cat > .env <<'ENV'
SHOPIFY_CUSTOM_APP_TOKEN=shpat_…
SHOP=magazinul-meu.myshopify.com
DAILYSMITH_PUBLIC_KEY=pk_…
SHOPIFY_BLOG_HANDLE=news
ENV
node --env-file=.env bin/sync.js
```

Asta rulează o sincronizare și afișează ce a făcut. `node --env-file=.env
server.js` rămâne pornit și sincronizează din oră în oră. README-ul din
repository acoperă imaginea de container, celelalte setări și rularea ca
aplicație pentru mai multe magazine.
:::

::::

## Depanare

| Ce vezi | Ce înseamnă |
|---|---|
| `unknown or unverified site key` | Cheia `pk_…` e greșită, sau site-ul nu e încă verificat. Copiaz-o din nou de pe pagina site-ului; verifică site-ul mai întâi. |
| „This store has no blog yet" | Creează unul din **Online Store → Blog posts → Manage blogs**, apoi reîncarcă aplicația. |
| „Not configured" | Salvează cheia site-ului și alege un blog; sincronizarea rulează doar când ambele sunt setate. |
| „Shopify refused the access token" | Aplicația a fost dezinstalată sau (la aplicația personalizată) token-ul a fost revocat. Reinstalează, sau creează un token nou și repornește serviciul. |
| Un articol a ajuns fără imagine | Shopify aduce imaginea de la DailySmith când creează articolul. Dacă acea aducere a eșuat, următoarea schimbare a articolului o trimite din nou. |
| Două articole pentru un singur articol DailySmith | Cineva l-a creat pe al doilea manual, sau o copie mai veche a fost scrisă înainte de instalarea aplicației. Șterge-l pe cel fără metafield-ul `dailysmith.post_id`; aplicația nu creează niciodată două. |

## Note de securitate

- Aplicația stochează cheia **publică** a site-ului tău, aceeași cheie pe
  care o poartă și snippet-ul de embed. Ea dă acces de citire la conținutul
  deja publicat și la nimic altceva.
- Permisiunea Shopify e doar **content**. Aplicația poate crea și actualiza
  articole de blog; nu poate vedea comenzi, clienți, produse sau setări.
- Aplicația nu stochează date despre clienți. Dezinstalarea ei șterge tot ce
  ținea despre magazinul tău: setările, token-ul de acces și lista cu ce
  articol oglindește ce articol DailySmith. Articolele rămân.
- Un token de aplicație personalizată dă acces de scriere la conținutul
  magazinului. Ține-l în mediul serviciului, niciodată într-o pagină, și
  revocă-l din pagina aplicației personalizate din admin în ziua în care nu-l
  mai folosești.
