Bygg · WooCommerce

Bygg ett WooCommerce-plugin för try-on

I en mening

Ett WooCommerce-plugin anropar Photta API över vanlig HTTP från en WP-Cron-händelse, pollar jobbet vid nästa tick och importerar den färdiga bilden till mediebiblioteket.

  • Credits: 5 credits vid 2K · 6 credits vid 4K
  • Typisk tid: 1.5–4 min
  • Bearbetning: asynkron, polling

Varje siffra på den här sidan kommer från Photter API-dokumentationen · kontrollerad

Inget PHP SDK behövs. WP-Cron skickar jobbet, nästa tick pollar det och WP-CLI importerar den färdiga bilden till 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')

Hur det fungerar

Ett cron-tick, en poll och en medieimport

Planera pluginet, schemalägg arbetet, skicka, polla vid nästa tick, importera.

  1. Steg 1

    Planera pluginet

    En kötabell, en cron-hook, en inställningssida för nyckeln. Generering sker aldrig under en sidbegäran, så inget en kund gör kan fastna på det.

  2. Steg 2

    Hämta en Photta API-nyckel

    Läs den från miljön i wp-config.php istället för att lagra den i options-tabellen, så att en databasexport inte exponerar dina inloggningsuppgifter.

  3. Steg 3

    Schemalägg cron-händelsen

    Registrera en återkommande hook och ta en handfull köade produkter per körning. En webbplats med verklig trafik får frekventa ticks; en tyst sajt behöver en riktig system-cron.

  4. Steg 4

    Skicka produkten

    Skicka produktbilden med wp_remote_post — samma URL, headers och JSON-body som i cURL-exemplet. Spara returnerat id på raden i kön.

  5. Steg 5

    Polla vid nästa tick

    Läs av statusen för varje rad som fortfarande har status processing. Eftersom det är minuter mellan ticks räcker det oftast med en poll per tick; ingenting sover inuti en förfrågan.

  6. Steg 6

    Importera bilden

    När ett jobb har status completed importerar du URL:en till mediebiblioteket och kopplar den till produkten. WP-CLI sköter nedladdningen så att pluginet aldrig buffrar filen.

Pluginets fyra rörliga delar

Photta-anropen återges från API-dokumentationen; wp_remote_post tar samma URL, headers och 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

Vanliga utvecklarfrågor

Frågor WordPress-utvecklare ställer

Finns det ett officiellt PHP SDK?

Nej. API:et är ren REST över HTTPS med en Bearer-header, så wp_remote_post täcker allt utan ett beroende att hålla uppdaterat.

Hur gör jag anropet från PHP?

wp_remote_post med Authorization- och Content-Type-headers samt en JSON-body. cURL-exemplet på den här sidan är samma förfrågan, fält för fält.

Varför inte generera vid sidladdning?

En generering tar längre tid än en sida borde. Att rendera under en förfrågan innebär att kunden väntar, en timeout avbryter processen och dina credits förbrukas ändå.

Hur många produkter bör en körning ta?

Ta en liten del per tick och låt kön betas av över flera ticks. Det håller varje körning kort och ser till att du håller dig väl inom utsatt rate limit.

Vad händer med misslyckade jobb?

Märk raden med failed och spara feltypen från svaret. Credits för en misslyckad generering återbetalas automatiskt, så ett nytt försök kostar inte dubbelt.

Ett plugin utan ett beroendeträd

Bearer-header, JSON-body, polling. Allt som WordPress redan hanterar.