Cómo añadir una imagen a una publicación de forma programática

30 dic 2018, 20:43:27
Vistas: 14K
Votos: 2

Estoy trabajando en convertir mis antiguos blogs de NucleusCMS a WordPress. He creado un conjunto de tablas localmente y comencé el proceso de conversión. Todo iba bien hasta la "conversión" de imágenes. Creo que puedo extraer la imagen antigua y añadirla a la biblioteca usando esta respuesta. Después de eso, estoy un poco perdido.

Lo que quiero hacer es, habiendo añadido un elemento multimedia (imagen) de forma programática, luego usar esa imagen añadiéndola programáticamente a una publicación específica con las dimensiones y texto alternativo que acabo de extraer (mediante regex) de la fuente con la que estoy trabajando.

Paso 1. Necesito obtener un puntero, ID o algo para el medio recién añadido.

No estoy 100% seguro de lo que estoy haciendo con WordPress en sí, así que no sé cómo obtener una referencia al medio que acabo de añadir.

Paso 2. Necesito hacer que esa imagen sea parte de una publicación.

En cuanto a cómo añadirla a la publicación (en el tamaño correcto) en el formato que WordPress usa nativamente...

Necesito ayuda con ambos pasos.

4
Comentarios

Hasta ahora he descubierto que WordPress llama a esto "sideloading" pero hay varias funciones similares, así que todavía necesito ayuda.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
6 may 2019 04:02:10

¿Eres capaz de averiguar la forma de lograr esto? Si no, me gustaría trabajar en este problema tuyo. :)

BlueSuiter BlueSuiter
13 jun 2019 10:19:45

Estoy completamente atascado en este momento. Trabajar programáticamente con posts es completamente nuevo para mí. Por favor, siéntete libre - necesito toda la ayuda que pueda conseguir.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
13 jun 2019 10:33:31

Tengo que revisar el código que estás escribiendo. ¿Puedes compartir el acceso a eso?

BlueSuiter BlueSuiter
13 jun 2019 12:28:25
Todas las respuestas a la pregunta 2
0

Hola, usé este código para algo similar (también estaba descargando una imagen remota y subiéndola a un sitio WordPress). Por favor, échale un vistazo:

$image_url = $value;//Esta es la URL de la imagen saneada.
$image = pathinfo($image_url);//Extrayendo información en un array.
$image_name = $image['basename'];
$upload_dir = wp_upload_dir();
$image_data = file_get_contents($image_url);
$unique_file_name = wp_unique_filename($upload_dir['path'], $image_name);
$filename = basename($unique_file_name);
$postarr = array(
    'post_title' => $post_title,
    'post_content' => $post_content,
    'post_type' => 'post',//o cualquiera que sea el slug de tu tipo de publicación.
    'post_status' => 'publish',
    'meta_input' => array(
        //Si tienes metadatos, irán aquí.
    ),
);
$insert_id = wp_insert_post($postarr, true);
if (!is_wp_error($insert_id)) {
    if ($image != '') {
        // Verificar permisos de carpeta y definir ubicación del archivo
        if (wp_mkdir_p($upload_dir['path'])) {
            $file = $upload_dir['path'] . '/' . $filename;
        } else {
            $file = $upload_dir['basedir'] . '/' . $filename;
        }
        // Crear el archivo de imagen en el servidor
        file_put_contents($file, $image_data);
        // Verificar tipo de archivo de imagen
        $wp_filetype = wp_check_filetype($filename, null);
        // Establecer datos del adjunto
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => sanitize_file_name($filename),
            'post_content' => '',
            'post_status' => 'inherit',
        );
        // Crear el adjunto
        $attach_id = wp_insert_attachment($attachment, $file, $insert_id);
        // Incluir image.php
        require_once ABSPATH . 'wp-admin/includes/image.php';
        // Definir metadatos del adjunto
        $attach_data = wp_generate_attachment_metadata($attach_id, $file);
        // Asignar metadatos al adjunto
        wp_update_attachment_metadata($attach_id, $attach_data);
        // Y finalmente asignar imagen destacada a la publicación
        $thumbnail = set_post_thumbnail($insert_id, $attach_id);
    }
}
13 jun 2019 14:43:02
0

Basándome en la respuesta aceptada de la pregunta enlazada, creo que algo como esto podría funcionar.

Básicamente:

  1. obtener el contenido existente del post con get_post_field
  2. subir la imagen con wp_insert_attachment que te dará el ID de la imagen
  3. extraer el tamaño de la imagen y el texto alternativo (alt) del contenido del post de alguna manera
  4. dejar que WordPress genere el marcado HTML para la imagen con wp_get_attachment_image
  5. reemplazar el marcador de posición de la imagen antigua con el nuevo HTML de la imagen
  6. cuando todos los marcadores de posición de imágenes hayan sido reemplazados con etiquetas img, guardar el contenido modificado del post en la base de datos con wp_update_post

Opcionalmente establecer cualquiera de las imágenes como miniatura de publicación/imagen destacada con set_post_thumbnail.

$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');

// Obtener contenido del post
$post_content = get_post_field( 'post_content', $post_id );

// Obtener la ruta al directorio de subida
$wp_upload_dir = wp_upload_dir();

foreach($images as $name) {
  $attachment = array(
    'guid'=> $wp_upload_dir['url'] . '/' . basename( $name ), 
    'post_mime_type' => 'image/png',
    'post_title' => 'mi descripción',
    'post_content' => 'mi descripción',
    'post_status' => 'inherit'
  );

  /**
    * PASO 1
    * agregar imágenes como adjuntos en WordPress
    */
  $image_id = wp_insert_attachment($attachment, $name, $post_id);
  // Asegurarse de incluir este archivo, ya que wp_generate_attachment_metadata() depende de él.
  require_once( ABSPATH . 'wp-admin/includes/image.php' );
  // Generar los metadatos para el adjunto y actualizar el registro en la base de datos.
  $attach_data = wp_generate_attachment_metadata( $image_id, $name );
  wp_update_attachment_metadata( $image_id, $attach_data );

  /**
    * PASO 2
    * Extraer datos de la imagen desde $post_content
    */
  // ¿strpos() + substr() tal vez?
  $width = 123;
  $height = 123;
  $alt = 'Hola';

  /**
    * PASO 3
    * obtener el marcado HTML para la imagen
    */  
  // Dejar que WP genere el HTML para la imagen, ajustar tamaño según sea necesario (thumbnail,medium,large,full,array(width,height))
  $image_html = wp_get_attachment_image( $image_id, array( $width, $height ), false, array( 'alt' => $alt ) );

  /**
    * PASO 4
    * Reemplazar marcadores en el contenido con el HTML de la imagen
    */
  preg_replace( $pattern, $image_html, $post_content ) // No entiendo bien las expresiones regulares como para dar un ejemplo, así que necesitarás resolverlo tú mismo

  /**
    * OPCIONAL
    * establecer imagen como destacada
    */
  if ( $name === 'ejemplo' ) {
    set_post_thumbnail( $post_id, $image_id );
  }

}

/**
  * PASO 5
  * Actualizar contenido del post
  */
$post_with_imported_images = array(
  'ID'           => $post_id,
  'post_content' => $post_content,
);
wp_update_post( $post_with_imported_images );

EDITADO Esto debería funcionar, quizás con pequeños ajustes, al menos con el Editor Clásico. No estoy seguro sobre Gutenberg ya que no he trabajado mucho con él.

13 jun 2019 14:07:41