Bygg · WooCommerce

Bygg en WooCommerce-plugin for try-on

I én setning

En WooCommerce-plugin kaller Photta-API-et over ren HTTP fra et WP-Cron-event, poller jobben ved neste tick og importerer det ferdige bildet til mediebiblioteket.

  • Credits: 5 credits ved 2K · 6 credits ved 4K
  • Typisk tidsbruk: 1.5–4 min
  • Prosessering: asynkron, polling

Hvert tall på denne siden er hentet fra dokumentasjonen for Photta-API-et · verifisert

Ingen PHP-SDK er nødvendig. WP-Cron sender jobben, neste tick poller den, og WP-CLI importerer det ferdige bildet til mediebiblioteket.

RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
  -H "Authorization: Bearer $PHOTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "product_type": "top",
  "product_images": [
    "https://cdn.yourstore.com/products/shirt-front.jpg"
  ],
  "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
  "product_category": "t_shirt",
  "mannequin_id": "mnk_f3a9b1",
  "pose_id": "pose_c2d4e5",
  "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
  "lock_background": true,
  "resolution": "2K",
  "aspect_ratio": "3:4",
  "body_size": "M",
  "expression": "neutral",
  "user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')

Slik fungerer det

Et cron-tick, en poll og en medieimport

Planlegg pluginen, planlegg arbeidet, send inn, poll ved neste tick, importer.

  1. Trinn 1

    Planlegg pluginen

    Én køtabell, én cron-hook, én innstillingsside for nøkkelen. Generering skjer aldri under en sideforespørsel, så ingenting en kunde gjør kan henge på den.

  2. Trinn 2

    Hent en Photta API-nøkkel

    Les den fra miljøet i wp-config.php i stedet for å lagre den i options-tabellen, slik at en databaseeksport ikke inneholder påloggingsinformasjonen din.

  3. Trinn 3

    Planlegg cron-eventet

    Registrer en regelmessig hook og ta en håndfull produkter fra køen per kjøring. Et nettsted med reell trafikk får hyppige ticks; et rolig nettsted trenger en ekte system-cron.

  4. Trinn 4

    Send inn produktet

    Send produktbildet med wp_remote_post — samme URL, headere og JSON-body som cURL-eksempelet. Lagre den returnerte id-en på køraden.

  5. Trinn 5

    Poll ved neste tick

    Les statusen for hver rad som fortsatt er processing. Fordi det er minutter mellom ticks, er én poll per tick vanligvis nok; ingenting gjør sleep inne i en forespørsel.

  6. Trinn 6

    Importer bildet

    Når en jobb er fullført, importer URL-en til mediebiblioteket og knytt den til produktet. WP-CLI gjør nedlastingen slik at pluginen aldri bufrer filen.

Pluginens fire bevegelige deler

Photta-kallene gjengis fra API-dokumentasjonen; wp_remote_post tar samme URL, headere og body.

# wp-config.php holds the key; the plugin reads it with getenv()
# define( 'PHOTTA_API_KEY', getenv( 'PHOTTA_API_KEY' ) );
export PHOTTA_API_KEY="photta_live_xxx"
export PHOTTA_BASE_URL="https://api.photta.app/api/v1"
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
  -H "Authorization: Bearer $PHOTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "product_type": "top",
  "product_images": [
    "https://cdn.yourstore.com/products/shirt-front.jpg"
  ],
  "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
  "product_category": "t_shirt",
  "mannequin_id": "mnk_f3a9b1",
  "pose_id": "pose_c2d4e5",
  "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
  "lock_background": true,
  "resolution": "2K",
  "aspect_ratio": "3:4",
  "body_size": "M",
  "expression": "neutral",
  "user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')
# $ID is data.id from the POST response. Poll every 3 seconds until status is "completed" or "failed".
for i in $(seq 1 120); do
  RESULT=$(curl -s "https://api.photta.app/api/v1/tryon/apparel/$ID" -H "Authorization: Bearer $PHOTTA_API_KEY")
  STATUS=$(echo "$RESULT" | jq -r '.data.status')
  [ "$STATUS" = "completed" ] && break
  [ "$STATUS" = "failed" ] && echo "generation failed" && exit 1
  sleep 3
done
echo "$RESULT" | jq -r '.data.output_url'
# WP-CLI does the download, so the plugin never buffers the file itself
wp media import "$OUTPUT_URL" \
  --post_id="$PRODUCT_ID" \
  --title="Virtual try-on" \
  --featured_image

Spørsmål utviklere stiller

Spørsmål WordPress-utviklere stiller

Finnes det en offisiell PHP-SDK?

Nei. API-et er ren REST over HTTPS med en bearer-header, så wp_remote_post dekker alt uten en avhengighet som må holdes oppdatert.

Hvordan gjør jeg kallet fra PHP?

wp_remote_post med Authorization- og Content-Type-headere og en JSON-body. cURL-eksempelet på denne siden er nøyaktig samme forespørsel, felt for felt.

Hvorfor ikke generere ved sidelasting?

En generering tar lengre tid enn en side bør bruke. Rendring under en forespørsel betyr at kunden må vente, en tidsavbrudd feiler den, og credits blir brukt uansett.

Hvor mange produkter bør én kjøring ta?

Ta en liten del per tick og la køen tømmes over flere ticks. Det holder hver kjøring kort og sørger for at du holder deg godt innenfor gjeldende rate limit.

Hva skjer med feilede jobber?

Merk raden failed og ta vare på feiltypen fra responsen. Credits for en feilet generering refunderes automatisk, så et nytt forsøk betaler ikke dobbelt.

En plugin uten et avhengighetstre

Bearer-header, JSON-body, polling. Alt WordPress allerede gjør.