Documentación · Documentación técnica
Importador de imágenes y cola
Este documento describe cómo el plugin ADP Car Market Hub descarga, desduplica y asocia las imágenes de los vehículos, y cómo la cola de imágenes asíncrona traslada el trabajo de procesamiento de imágenes de larga duración fuera de la ruta de importación síncrona.
Cuándo usar este documento
Lea este documento si necesita:
- Entender qué imágenes terminan en la Biblioteca de medios de WordPress y cuáles se reutilizan o se omiten.
- Diagnosticar imágenes de vehículos faltantes, desactualizadas o duplicadas.
- Planificar la conversión a WebP o la capacidad de almacenamiento para un catálogo grande.
- Ajustar el procesamiento de imágenes en modo cron para hostings lentos o restringidos.
Para conocer el flujo de importación general, consulte Import Engine. Para la programación del lado del cron, consulte Cron Events And Scheduler.
Descripción general
Dos clases comparten la responsabilidad del manejo de imágenes:
AS24CI\Image_Importer— descarga una lista de URL de imágenes, opcionalmente las convierte a WebP, las asocia a una publicación de vehículo a través demedia_handle_sideload()y registra la URL de origen en el postmeta del adjunto para su desduplicación.AS24CI\Scheduler— posee la cola de imágenes asíncrona. El hook del workeras24ci_image_queue_processprocesa los elementos pendientes en lotes con su propio bloqueo transitorio y presupuesto de tiempo.
El importador (Import Engine) decide si importar las imágenes de forma síncrona o posponer la mayoría de ellas a la cola, según el modo cron de la ejecución actual.
Fuente de verdad para las imágenes
Para cualquier adjunto importado, el marcador canónico de "¿de dónde vino esto?"
es el postmeta _as24ci_source_url en la publicación del
adjunto (attachment). El plugin utiliza este marcador para:
- Desduplicar descargas: si ya existe un adjunto con la misma URL de origen, el plugin lo reutiliza en lugar de descargarlo de nuevo.
- Reconstruir la lista
_as24ci_image_idsdel vehículo de manera autoritativa después de que el worker de la cola termine, consultando los adjuntos secundarios con esta clave meta.
Dos claves postmeta en la publicación del vehículo realizan el seguimiento de las imágenes importadas:
_as24ci_image_ids— array de IDs de adjuntos de WordPress que pertenecen a la galería del importador._as24ci_images_hash— hash MD5 de la lista de imágenes de origen. Puede contener el centinela'pending_queue'mientras los elementos aún estén en la cola. La siguiente importación trata'pending_queue'como una discrepancia para que la lista de imágenes siempre se vuelva a evaluar hasta que se haya importado por completo.
Los adjuntos de la galería añadidos manualmente se registran por separado en
_as24ci_manual_image_ids y el plugin nunca los elimina.
Importación síncrona de imágenes
Image_Importer::import_images( int $post_id, array $images, string
$listing_id ) realiza el trabajo síncrono:
- Incluye de forma diferida (lazy load) los archivos de administración de medios de WordPress
(
wp-admin/includes/media.php,file.php,image.php). - Vuelve a aplicar de forma defensiva la capacidad
as24ci_max_images. - Obtiene previamente las URL de origen conocidas de la publicación una sola vez a través de
prefetch_known_urls_for_post()para evitar N consultas a la base de datos por imagen. - Para cada imagen (URL en cadena de texto o array con las claves
url/src/href/original/imageUrl): - Reutiliza un adjunto existente si la URL de origen ya es conocida (primero en el mapa en memoria, luego mediante una búsqueda en el postmeta_as24ci_source_url). - De lo contrario, llama adownload_url( $url, 30 )(tiempo de espera de 30 segundos), opcionalmente la convierte a WebP y llama amedia_handle_sideload()para crear el adjunto. - Escribe_as24ci_source_urlen el nuevo adjunto y lo añade al mapa de desduplicación en memoria. - Registra los fallos (errores de descarga, errores de sideload) en el log y continúa con la siguiente imagen. - Fusiona los nuevos IDs de adjuntos en
_as24ci_image_ids(preservando los elementos importados anteriormente) y establece la imagen destacada en el primer adjunto si la publicación aún no tiene una.
Los IDs existentes se fusionan en lugar de sobrescribirse para que las llamadas del worker de la cola acumulen adjuntos para la misma publicación a lo largo de varias ejecuciones.
Conversión a WebP
Cuando as24ci_convert_to_webp es 1, el importador intenta
convertir cada imagen descargada a WebP antes de realizar el sideload:
- La calidad se lee de
as24ci_webp_quality(por defecto80si no está establecido) y se limita al rango1–100. El filtroas24ci_webp_qualitypuede anular este valor. - Se intenta primero con
imagewebp()de GD; se utiliza Imagick como alternativa. - Si ninguna de las extensiones está disponible, se omite la conversión y se realiza el sideload de la imagen original. Se emite una línea en el log.
- Si la conversión produce un archivo vacío o falla, se limpia el archivo temporal y se utiliza la imagen original.
El archivo convertido hereda el nombre de archivo original con la extensión
reemplazada por .webp.
Importación en modo cron (encolada)
Cuando el programador ejecuta una importación (cron o REST), establece
Importer::set_cron_image_queue( true ) si
as24ci_cron_image_queue es 1 (el valor por defecto). Para cada vehículo
con más de una imagen, el importador:
- Descarga solo la primera imagen inmediatamente a través de la ruta síncrona para que el vehículo tenga una imagen destacada.
- Comprueba previamente si todas las imágenes restantes ya están asociadas
(a través del mapa de desduplicación). En caso afirmativo, no se crea ninguna entrada en la cola
y se escribe el
_as24ci_images_hashfinal inmediatamente. - De lo contrario, llama a
enqueue_remaining_images()para añadir elementos con el formato{ post_id, listing_id, url, images_hash }a la opciónas24ci_image_queue. El_as24ci_images_hashdel vehículo se establece en el centinela'pending_queue'para que las futuras importaciones sigan reevaluando hasta que se complete la cola.
La cola tiene un límite estricto de Scheduler::IMAGE_QUEUE_SIZE_LIMIT
elementos. Las nuevas entradas se descartan cuando se alcanza el límite y se emite
una línea en el log.
Worker de la cola
AS24CI\Scheduler::run_image_queue() está vinculado al
hook de cron as24ci_image_queue_process y ejecuta las descargas diferidas reales:
- Llama a
set_time_limit(300)(sujeto a las restricciones del host). - Adquiere el bloqueo transitorio
as24ci_image_queue_runningcon el TTLScheduler::IMAGE_QUEUE_LOCK_TTL. Un bloqueo obsoleto (más antiguo que el TTL) se borra automáticamente. - Carga la cola desde la opción
as24ci_image_queue. - Procesa los elementos en lotes de
Scheduler::IMAGE_QUEUE_BATCH_SIZEmientras la cola no esté vacía y el presupuesto de tiempo (IMAGE_QUEUE_LOCK_TTL − 60s) no se haya agotado. - Para cada elemento, llama a
Image_Importer::import_images()para la URL individual. Los errores se capturan y se registran en el log; el elemento se descarta para evitar un bucle infinito de errores. - Persiste la cola restante y escribe las estadísticas por ejecución en
as24ci_image_queue_last_run({ processed, failed, remaining, timestamp }). - Para cada publicación completamente vaciada de la cola en esta ejecución, reconstruye
_as24ci_image_idsde manera autoritativa a partir de los adjuntos secundarios reales etiquetados con_as24ci_source_urly almacena el_as24ci_images_hashfinal. Esto garantiza que los metadatos estén completos y sean consistentes incluso si fallaron elementos individuales de la cola. - Programa la siguiente ejecución a través de
maybe_schedule_image_queue_worker()si quedan elementos.
El valor images_hash del worker se valida para asegurar que sea una cadena MD5
en minúsculas de 32 caracteres antes de su uso. Las entradas corruptas se tratan como
ausentes para que el hash de la publicación no se finalice con datos erróneos.
Referencia de configuración
| Opción / constante | Efecto | Por defecto |
|---|---|---|
as24ci_import_images | Interruptor principal para la ruta de importación de imágenes. | (interruptor en administración) |
as24ci_max_images | Límite por vehículo en el lado del plugin. Aplicado tanto por el importador como por el importador de imágenes. | 30 |
as24ci_convert_to_webp | Convierte las imágenes descargadas a WebP si es posible. | 0 |
as24ci_webp_quality | Calidad WebP (1–100). Filtro: as24ci_webp_quality. | 80 |
as24ci_cron_image_queue | Utiliza la cola de imágenes durante las importaciones por cron/REST. | 1 |
as24ci_image_queue (opción) | Carga útil persistente de la cola de imágenes pendientes. | (array vacío) |
as24ci_image_queue_last_run (opción) | Estadísticas de la última ejecución del worker de la cola. | (vacío) |
as24ci_image_queue_running (transient) | Bloqueo de ejecución para el worker de la cola. | n/a |
Scheduler::IMAGE_QUEUE_HOOK | Hook de cron para el worker de la cola (as24ci_image_queue_process). | n/a |
Scheduler::IMAGE_QUEUE_LOCK_TTL | TTL del bloqueo del worker (borra automáticamente un bloqueo obsoleto). | (constante en el código) |
Scheduler::IMAGE_QUEUE_BATCH_SIZE | Elementos procesados por lote interno. | (constante en el código) |
Scheduler::IMAGE_QUEUE_SIZE_LIMIT | Límite estricto del tamaño de la cola. | (constante en el código) |
Los valores exactos de IMAGE_QUEUE_LOCK_TTL, IMAGE_QUEUE_BATCH_SIZE
y IMAGE_QUEUE_SIZE_LIMIT se definen como constantes en
AS24CI\Scheduler y pueden cambiar entre versiones del plugin. Verifíquelos
en el código fuente actual si necesita planificar para una carga específica.
Notas operativas
- WP-Cron es el activador por defecto. En sitios con poco tráfico, considere un
cron del lado del servidor / cron del sistema que apunte a
wp-cron.php(conDISABLE_WP_CRONestablecido entrue) para que la cola se vacíe de manera predecible. - Las descargas de imágenes se realizan a través de
download_url(), que utiliza la API HTTP de WordPress. Los servidores que bloqueen el tráfico HTTP saliente deben añadir a la lista blanca los servidores de imágenes de AutoScout24. - La desduplicación de imágenes se basa en la URL de origen exacta. Las URL que difieran solo en la cadena de consulta (query string) o en los parámetros de firma se tratarán como fuentes distintas y se descargarán por separado.
- Los adjuntos manuales de la galería registrados en
_as24ci_manual_image_idsnunca son sobrescritos ni eliminados por el importador o por el worker de la cola. - El worker de la cola reconstruye
_as24ci_image_idsa partir de los adjuntos secundarios reales al final de cada publicación completamente vaciada; si manipula los metadatos directamente entre ejecuciones del worker, es posible que sus cambios se reviertan.
Resolución de problemas
- Los vehículos aparecen sin ninguna imagen. Confirme que
as24ci_import_imagesesté habilitado. Compruebe queas24ci_max_imagesno sea cero donde se pretenda. En el modo cron, la imagen principal se importa de forma síncrona; si no aparece ninguna imagen en absoluto, busque errores de descarga en el log del plugin. - Solo la primera imagen está presente después de una importación por cron. Esto es
lo esperado durante las importaciones en modo cron hasta que el
worker
as24ci_image_queue_processtermine. Compruebeas24ci_image_queue_last_runpara ver el progreso y el tamaño de la cola. - La cola crece pero nunca se vacía. Verifique que WP-Cron se esté
ejecutando (o que un cron del servidor active
wp-cron.php). Compruebe si hay un transientas24ci_image_queue_runningatascado que sea más antiguo que el TTL del worker. El worker borra automáticamente los bloqueos obsoletos en la siguiente ejecución. - La conversión a WebP no se realiza. Asegúrese de que
as24ci_convert_to_webpsea1y que esté instalado GD con soporte para WebP (imagewebp) o Imagick. El plugin registra en el log el motivo cuando se omite la conversión. - Aparecen imágenes que parecen duplicadas en la galería. La clave de desduplicación es la URL de origen exacta. Las CDN que añaden parámetros de consulta únicos por solicitud anularán la desduplicación. Verifique las URL en la carga útil de la API mediante el registro detallado (verbose logging).
- Las imágenes desaparecieron después de eliminar un vehículo. El
Vehicle_Deleterelimina los adjuntos registrados en_as24ci_image_ids. Los adjuntos manuales de la galería (_as24ci_manual_image_ids) se conservan. Verifique qué lista contenía el ID del adjunto afectado.