Integración · WooCommerce

Crea un plugin de try-on para WooCommerce

En una frase

Un plugin de WooCommerce llama a la API de Photta mediante HTTP simple desde un evento de WP-Cron, hace polling del trabajo en el siguiente tick e importa la imagen terminada a la biblioteca de medios.

  • Credits: 5 credits a 2K · 6 credits a 4K
  • Tiempo típico: 1.5–4 min
  • Procesamiento: asíncrono, polling

Cada cifra de esta página proviene de la documentación de la API de Photta · verificado

No se necesita SDK de PHP. WP-Cron envía el trabajo, el siguiente tick hace polling y WP-CLI importa la imagen terminada a la biblioteca de medios.

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

Cómo funciona

Un tick de cron, un poll y una importación de medios

Planifica el plugin, programa el trabajo, envía, haz polling en el siguiente tick e importa.

  1. Paso 1

    Planifica el plugin

    Una tabla de cola, un hook de cron y una pantalla de ajustes para la clave. La generación nunca ocurre durante la petición de una página, por lo que ninguna acción del comprador se quedará bloqueada.

  2. Paso 2

    Obtén una API key de Photta

    Léela desde el entorno en wp-config.php en lugar de almacenarla en la tabla de opciones; así, una exportación de la base de datos no expondrá tus credenciales.

  3. Paso 3

    Programa el evento de cron

    Registra un hook recurrente y procesa un pequeño lote de productos en cola por ejecución. Un sitio con tráfico real recibe ticks frecuentes; uno sin visitas requiere un cron del sistema real.

  4. Paso 4

    Envía el producto

    Envía la imagen del producto con wp_remote_post —la misma URL, encabezados y cuerpo JSON que en el ejemplo de cURL—. Guarda el id devuelto en la fila de la cola.

  5. Paso 5

    Haz polling en el siguiente tick

    Consulta el estado de cada fila que siga en processing. Como los ticks se distancian por minutos, un poll por tick suele ser suficiente; nada se queda en espera dentro de una petición.

  6. Paso 6

    Importa la imagen

    Una vez completado el trabajo, importa la URL a la biblioteca de medios y asígnala al producto. WP-CLI se encarga de la descarga para que el plugin nunca almacene el archivo en búfer.

Las cuatro partes móviles del plugin

Las llamadas a Photta se basan en la documentación de la API; wp_remote_post admite la misma URL, encabezados y cuerpo.

# 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

Preguntas frecuentes de desarrolladores

Preguntas habituales de desarrolladores de WordPress

¿Existe un SDK oficial de PHP?

No. La API es REST estándar sobre HTTPS con un encabezado Bearer, por lo que wp_remote_post cubre todo sin añadir dependencias que mantener.

¿Cómo realizo la llamada desde PHP?

Con wp_remote_post, usando los encabezados Authorization y Content-Type y un cuerpo JSON. El ejemplo de cURL en esta página es exactamente la misma petición, campo por campo.

¿Por qué no generar durante la carga de la página?

Una generación tarda más de lo que debería durar una página. Renderizar durante una petición hace esperar al comprador, arriesga un timeout y los credits se consumen de todos modos.

¿Cuántos productos debe procesar cada ejecución?

Toma un lote pequeño por cada tick y deja que la cola se vacíe a lo largo del tiempo. Esto mantiene cada ejecución corta y te sitúa holgadamente dentro del rate limit publicado.

¿Qué ocurre con los trabajos fallidos?

Marca la fila como failed y conserva el tipo de error de la respuesta. Los credits de una generación fallida se reembolsan automáticamente, por lo que un reintento no paga dos veces.

Un plugin sin árbol de dependencias

Encabezado Bearer, cuerpo JSON y polling. Todo lo que WordPress ya resuelve de forma nativa.