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')const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"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."
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/tryon/apparel",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"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."
},
)
data = res.json()["data"] # data["id"], data["status"]Jak to działa
Tick crona, polling i import mediów
Zaplanuj wtyczkę, zaplanuj zadania, wyślij, sprawdź przy kolejnym ticku, zaimportuj.
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.
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.
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.
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.
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.
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_imagePytania 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.
Powiązane strony
Powiązane materiały
Możliwości
API wirtualnego try-on dla odzieży
REST API, które nakłada odzież na manekiny AI. Asynchroniczne, generowanie w 1.5–4 minuty, 5 credits przy 2K, 6 przy 4K. Przykłady dla cURL, Node.js i Python.
CzytajSzybki start
Pierwszy obraz z Photta w mniej niż pięć minut.
Zarejestruj się, wygeneruj klucz API, wykonaj pierwsze wywołanie cURL, odpytuj aż do ukończenia, zapisz wynik. Pięć kroków opisanych od początku do końca.
CzytajJęzyki
cURL walkthrough
CzytajErrors
Czytaj
Każda liczba na tej stronie pochodzi z dokumentacji API Photta · sprawdzono
Wtyczka bez drzewa zależności
Nagłówek Bearer, body JSON, polling. Wszystko, co WordPress już potrafi.