Wdróż · WooCommerce

Napisz wtyczkę try-on dla WooCommerce

W jednym zdaniu

Wtyczka WooCommerce wywołuje Photta API przez zwykłe HTTP ze zdarzenia WP-Cron, odpytuje o status zadania przy kolejnym ticku i importuje gotowy obraz do biblioteki mediów.

  • Credits: 5 credits w 2K · 6 credits w 4K
  • Typowy czas: 1.5–4 min
  • Przetwarzanie: asynchroniczne, polling

Każda liczba na tej stronie pochodzi z dokumentacji API Photta · sprawdzono

Żadne PHP SDK nie jest potrzebne. WP-Cron wysyła zadanie, kolejny tick je odpytuje (polling), a WP-CLI importuje gotowy obraz do biblioteki mediów.

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')

Jak to działa

Tick crona, polling i import mediów

Zaplanuj wtyczkę, zaplanuj zadania, wyślij, sprawdź przy kolejnym ticku, zaimportuj.

  1. Krok 1

    Zaplanuj wtyczkę

    Jedna tabela kolejki, jeden hook crona, jeden ekran ustawień na klucz. Generowanie nigdy nie odbywa się podczas żądania strony, więc żadna akcja klienta się na nim nie zawiesi.

  2. Krok 2

    Pobierz klucz Photta API

    Odczytuj go ze środowiska w wp-config.php zamiast zapisywać w tabeli opcji — dzięki temu eksport bazy danych nie ujawni Twoich danych uwierzytelniających.

  3. Krok 3

    Zaplanuj zdarzenie crona

    Zarejestruj cykliczny hook i pobieraj kilka produktów z kolejki na jedno uruchomienie. Witryna z realnym ruchem ma częste ticki; cicha wymaga prawdziwego crona systemowego.

  4. Krok 4

    Wyślij produkt

    Prześlij zdjęcie produktu przez wp_remote_post — ten sam URL, nagłówki i JSON body, co w przykładzie cURL. Zapisz zwrócone id w wierszu kolejki.

  5. Krok 5

    Odpytaj o status przy kolejnym ticku

    Odczytaj status każdego wiersza ze statusem processing. Ponieważ ticki dzieli kilka minut, jedno odpytanie na tick zazwyczaj wystarcza; nic nie usypia wewnątrz żądania.

  6. Krok 6

    Zaimportuj obraz

    Gdy zadanie ma status completed, zaimportuj URL do biblioteki mediów i przypisz go do produktu. WP-CLI zajmuje się pobieraniem, więc wtyczka nigdy nie buforuje pliku w pamięci.

Cztery elementy składowe wtyczki

Wywołania Photta bazują bezpośrednio na dokumentacji API; wp_remote_post przyjmuje ten sam URL, nagłówki i payload.

# 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

Pytania zadawane przez programistów

Pytania deweloperów WordPressa

Czy istnieje oficjalne PHP SDK?

Nie. API to czysty REST po HTTPS z nagłówkiem Bearer, więc wp_remote_post obsługuje wszystko bez konieczności utrzymywania dodatkowych zależności.

Jak wykonać wywołanie z poziomu PHP?

Użyj wp_remote_post z nagłówkami Authorization i Content-Type oraz ciałem JSON. Przykład cURL na tej stronie to dokładnie to samo żądanie, pole po polu.

Dlaczego nie generować przy ładowaniu strony?

Generowanie trwa dłużej niż powinno trwać ładowanie strony. Renderowanie podczas żądania oznacza, że klient czeka, timeout ubija proces, a credits przepadają tak czy inaczej.

Ile produktów powinno przetwarzać jedno uruchomienie?

Pobieraj małą partię na tick i pozwól kolejce opróżniać się stopniowo. Dzięki temu każde uruchomienie jest krótkie i mieścisz się bezpiecznie w opublikowanym rate limit.

Co dzieje się z nieudanymi zadaniami?

Oznacz wiersz jako failed i zachowaj typ błędu z odpowiedzi. Credits za nieudane generowanie są zwracane automatycznie, więc ponowna próba nie kosztuje podwójnie.

Wtyczka bez drzewa zależności

Nagłówek Bearer, body JSON, polling. Wszystko, co WordPress już potrafi.