¿Cómo puedo subir imágenes en lote y crear automáticamente entradas para cada una al mismo tiempo?
Sé cómo subir múltiples imágenes a una entrada existente, pero este es un escenario diferente. Esto es para un catálogo grande de recursos, donde cada entrada de tipo personalizado representa un recurso de imagen (por lo tanto, una sola imagen se asigna como "imagen destacada" para cada entrada).
Todo el sistema funciona muy bien para la creación de recursos uno por uno, pero consume demasiado tiempo. Necesito poder subir múltiples imágenes en "lote" a la vez, luego crear una nueva entrada para cada imagen, y después adjuntar la imagen a la nueva entrada como "imagen destacada".
No habrá contenido de texto ingresado para cada entrada - solo algunos metadatos y asignaciones de taxonomía personalizada, por lo que debería ser posible asignar en lote los metadatos y la taxonomía durante este proceso de creación por lotes.
He investigado soluciones desde la creación de entradas XML-RPC (que generalmente no maneja la carga/asignación de imágenes) hasta plugins que extraen archivos de un directorio del servidor a la biblioteca de medios (que no cubre la creación de entradas), y cargadores de archivos múltiples con jQuery (que básicamente solo depositan archivos en un directorio).
Estoy relativamente versado en PHP, habiendo construido plugins y temas, pero estoy confundido sobre cómo manejar este proceso, ya que requiere el primer paso de llevar los archivos al servidor en alguna capacidad temporal, luego generar entradas basadas en los archivos subidos y asignar algunos metadatos de identificación a todo el lote.
Espero que esto se pueda hacer en un panel de administración personalizado, pero si tengo que hacerlo fuera de wp-admin, también está bien...
¿Ideas?

Este script es una prueba de concepto (probado y funcional), no es un plugin y está pensado para ser modificado, asume algunas cosas:
- Utiliza
wp_insert_post
por lo que se recomienda no engancharlo a ningún hook de administración, ¡ejecútalo solo una vez! - Las imágenes deben estar en la carpeta
wp-content\uploads
, cambiar esto requeriría más complicaciones. El ejemplo usa una carpeta personalizada llamada\images
dentro de la carpeta de subidas, puedes modificar esta parte. - No realiza ninguna comprobación de errores, solo lo probé con una carpeta de 20 imágenes así que los resultados pueden variar :)
El código a continuación iterará a través de la carpeta wp-content\uploads\images
y creará un título de publicación basado en el nombre de la imagen que se adjunta. Probablemente quieras cambiar esto por algo mejor o posiblemente ingresar metadatos usando otros datos que tengas (quizás Exif).
function WPSE_1595_image_post() {
// Necesitamos usar el directorio de subidas por defecto
$wp_upload_dir = wp_upload_dir();
// La carpeta real
$wp_upload_images = $wp_upload_dir['basedir'] . '/images';
require_once(ABSPATH . 'wp-admin/includes/image.php');
foreach (new DirectoryIterator($wp_upload_images) as $fileInfo) {
if($fileInfo->isDot()) continue;
$image_base = $fileInfo->getFilename();
$image_name = pathinfo($fileInfo, PATHINFO_FILENAME);
// Personaliza estos datos de publicación como desees
$my_post_data = array(
'post_title' => $image_name,
'post_type' => 'post',
'post_category' => array('1'),
'post_author' => 1,
'post_status' => 'publish'
);
// Necesitamos el ID para el adjunto
$post_id = wp_insert_post($my_post_data);
$wp_filetype = wp_check_filetype($image_base, null );
// Personaliza estos datos de adjunto como desees
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . $image_name,
'post_mime_type' => $wp_filetype['type'],
'post_title' => 'child-' . $image_name,
'post_content' => '',
'post_status' => 'inherit'
);
$imagefile = $wp_upload_images . '/' . $image_base;
$attach_id = wp_insert_attachment( $attachment, $imagefile, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $imagefile );
wp_update_attachment_metadata( $attach_id, $attach_data );
}
}
Para cualquier cosa que supere unos pocos miles de imágenes, probablemente sería más fácil usar:
- https://codex.wordpress.org/XML-RPC_WordPress_API
- https://make.wordpress.org/core/tag/migration-portability/ si sale
- Un script directo a la base de datos

Sigue agregando imágenes redimensionadas de vuelta a la carpeta uploads/images y, además, genera nuevas entradas. El proceso se volvió recursivo, así que antes de eliminar la función, se crearon casi 800 entradas. Los nuevos tamaños generados deberían crearse en la ubicación normal de medios de WordPress.

Existe este plugin: Automatic Featured Image Posts Plugin
De la página del plugin:
Automatic Featured Image Posts crea una nueva entrada con una imagen destacada cada vez que se sube una imagen. A través de la página de configuración del plugin, puedes establecer que la imagen se publique y se asigne a uno de tus otros tipos de contenido personalizados y/o formatos de entrada existentes.
Básicamente, cada imagen que se sube genera una entrada (del tipo de contenido que elijas) y se establece como imagen destacada de esa entrada.
Lo instalé en mi máquina local. La página de configuración se ve así y permite seleccionar a qué tipo de contenido, incluyendo tipos personalizados, quieres asignar las fotos subidas, y qué estado de publicación deseas.
Para poner el plugin en práctica - navega a tu tipo de contenido elegido, abre una nueva entrada y sube medios.
Para subir fotos masivamente, simplemente selecciona múltiples fotos en el cuadro de diálogo "subir". Aquí estoy seleccionando 8 fotos, pero no veo razón por la que no podrían ser 80 u 800, a menos que haya límites que desconozca en el subidor de imágenes de WordPress.
Los títulos de las entradas se establecen por los nombres de los archivos de imagen. Deberías poder trabajar con eso y llamarlos en tu tema con the_title()
Probé localmente y funciona en WordPress 3.6.
Estoy seguro de que hay una forma más robusta o flexible de lograr esto, pero en este caso, el plugin parece hacer exactamente lo que pides, con la excepción de asignar metadatos. Quizás alguien más podría desarrollar esa parte un poco más.
Si necesitas contenido de entrada generado dinámicamente, podrías al menos comenzar con el plugin e iterar desde allí. Una idea sería usar formatos de entrada o plantillas de página para determinar cómo se muestran las entradas.
Nota: Asegúrate de tener todos tus image_size
s configurados en functions.php. ¡Odiaría tener que deshacer/eliminar 10,000 fotos, o ejecutar un "regenerar miniaturas" extremadamente largo solo porque olvidé o cambié el tamaño de imagen!

La pregunta "Limpiar la carpeta de subidas, estructura de base de datos de la Biblioteca Multimedia" tiene algunas sugerencias de plugins que podrían estar relacionadas, aunque no hacen exactamente lo que pides. Pero quizás la información sea útil.
