¿Cómo configuro una imagen destacada (miniatura) por URL de imagen cuando uso wp_insert_post ()?

61

Mientras miraba a través de la entrada de referencia de función para wp_insert_post () , noté que no hay ningún parámetro en la matriz que requiera que me permita establecer la 'Imagen destacada' para una publicación, que se muestra como la miniatura de la publicación en mi tema.

He examinado funciones como set_post_thumbnail () , como lo sugirió el Sr. Bennett, pero esta parece ser una adición relativamente nueva a WordPress en sí y al códice de WordPress. Como tal, no hay ninguna fuente que pueda encontrar que explique cómo se debe adquirir y suministrar el parámetro $ thumbnail_id. Si esta es realmente la función a utilizar, ¿de qué manera podría proporcionarle un parámetro válido $ thumbnail_id cuando todo lo que tengo es una URL de imagen?

¡Gracias por adelantado!

Chris
fuente

Respuestas:

107

Puede configurar una imagen como miniatura de publicación cuando está en su biblioteca de medios. Para agregar una imagen en su biblioteca de medios, debe cargarla en su servidor. WordPress ya tiene una función para poner imágenes en su biblioteca de medios, solo necesita un script que cargue su archivo.

Uso:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id is Numeric ID... You can also get the ID with:
wp_insert_post()

Función:

function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))
      $file = $upload_dir['path'] . '/' . $filename;
    else
      $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


EDITAR: creación de ruta agregada

http://codex.wordpress.org/Function_Reference/wp_mkdir_p

Rob Vermeer
fuente
¡Gracias por tus esfuerzos! Sin embargo, esto solo funciona cuando se usa $ upload_dir ['basedir'] (en lugar de ruta), porque cuando inspecciono el archivo adjunto a través de la interfaz de edición posterior se hace referencia a ... / uploads / FILENAME.EXT mientras $ upload_dir ['ruta' ] lo almacenaría en algo como ... / uploads / 2012/02 / FILENAME.EXT. Podría ser aún mejor cambiar de alguna manera la forma en que se hace referencia al archivo, pero no sabría cómo.
Chris
1
Creación de ruta agregada en mi respuesta.
Rob Vermeer
Agradezco su respuesta rápida :). Sin embargo, sigo obteniendo el mismo resultado, aquí hay una captura de pantalla que muestra mi problema: i.imgur.com/iKTNs.png . La sección superior es el resultado de colocar un eco en su condicional, solo para ver qué está pasando.
Chris
Lo cambió nuevamente, no pasó la ruta completa a wp_insert_attachment y wp_generate_attachment_metadata. Espero que esto resuelva el problema.
Rob Vermeer
1
Advertencia: esta respuesta reescribe el archivo si tiene el mismo nombre, tenga cuidado. Debería generar nombres usando $ post_id o al menos uniqid ()
Ivan Castellanos
10

Intenta usarlo set_post_thumbnail().

Editar por Otto: Usted aclaró su pregunta, así que aclararé la respuesta que dio Chip.

Básicamente, también debes hacer el 'archivo adjunto' para la publicación. Cuando se carga una imagen en la biblioteca de medios de WordPress, se realiza una entrada de publicación especial con un tipo de archivo adjunto. Este archivo adjunto está vinculado a alguna publicación específica a través del identificador post_parent.

Entonces, si conoce la ID del archivo adjunto, llame a set_post_thumbnail con el objeto de publicación o ID y la ID del archivo adjunto simplemente establecerá el indicador de miniatura de la publicación.

Si aún no ha creado el archivo adjunto, deberá hacerlo primero. La forma más fácil de hacerlo es con wp_insert_attachment(). Esta función toma una matriz de algunos parámetros, el nombre de archivo (el archivo ya debe estar en el directorio de carga adecuado) y la ID de la publicación principal a la que desea adjuntar el archivo adjunto.

Simplemente cargar un archivo y adjuntarlo a una publicación no hace nada automáticamente. Esto es simplemente una especie de mecanismo de categorización. El mecanismo de la galería, por ejemplo, usa las imágenes adjuntas de una publicación para construir la [galería] para esa publicación. Una miniatura para una publicación es solo una de las imágenes adjuntas que se ha configurado para ser la miniatura.

Puede encontrar más información sobre cómo usar wp_insert_attachment en el códice (vinculado anteriormente).

Chip Bennett
fuente
¡Gracias por su respuesta! Sin embargo, ¿cómo recuperaría la ID de la miniatura? Estoy comenzando con una URL de imagen, así que supongo que de alguna manera debería agregar una imagen a la biblioteca de WordPress usando otra función.
Chris
Como ya está insertando una publicación, supuse que ya estaba adjuntando imágenes a la publicación que está insertando. ¿No es eso una suposición válida?
Chip Bennett
Lo sentimos, pero aún no he descubierto cómo adjuntar imágenes a una publicación por URL. Además, no me gustaría que la imagen se muestre en la publicación. Actualmente estoy buscando la función que devolverá $ thumbnail_id, y pensé que tal vez wp_insert_attachment () funcionaría, hasta que noté que ya requería que el archivo adjunto estuviera en el directorio de carga. No sé cómo obtener un archivo de imagen allí por su URL, y no estoy seguro de si esta es la función que estoy buscando en primer lugar. ¡Gracias por tu ayuda!
Chris
¿Puede reescribir su pregunta con esta información para describir mejor lo que está tratando de lograr? (O, deje este como está, y comience una nueva pregunta, para preguntar cómo obtener la ID del archivo adjunto al insertar una publicación?)
Chip Bennett
La pregunta original ha sido editada y reformulada en parte, por favor revise :).
Chris
9

Me gustaría mejorar la respuesta de Robs utilizando las funciones principales de WP download_urlymedia_handle_sideload

<?php
/**
* Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
*
* @param string $file    The URL of the image to download.
* @param int    $post_id The post ID the post thumbnail is to be associated with.
* @param string $desc    Optional. Description of the image.
* @return string|WP_Error Attachment ID, WP_Error object otherwise.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Set variables for storage, fix file filename for query strings.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Download file to temp location.
    $file_array['tmp_name'] = download_url( $file );

    // If error storing temporarily, return the error.
    if ( is_wp_error( $file_array['tmp_name'] ) ) {
        return $file_array['tmp_name'];
    }

    // Do the validation and storage stuff.
    $id = media_handle_sideload( $file_array, $post_id, $desc );

    // If error storing permanently, unlink.
    if ( is_wp_error( $id ) ) {
        @unlink( $file_array['tmp_name'] );
        return $id;
    }
    return set_post_thumbnail( $post_id, $id );

}
Jan Beck
fuente
1
Usar las funciones nativas de WordPress es la mejor práctica, gracias.
Mostafa Soufi
Por alguna razón, esta versión me dio errores diciendo "No se proporcionó una URL válida". , mientras que la respuesta de Rob Vermeer funcionó.
Flimm
3

set_post_thumbnail() Es la mejor función para este requisito.

Creo que encuentras la identificación de un archivo adjunto a través de get_children()o get_posts(). El resultado tiene una matriz y dentro de esta matriz está la ID. El siguiente ejemplo para probar; espero que funcione; escribir sin pruebas, solo desde cero.

Para su requerimiento es importante que cambie get_the_ID()con su post-ID; devuelva la identificación del archivo adjunto y esto puede usar para foth set_post_thumbnail().

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}
bueltge
fuente
3

Acabo de encontrar esto y lo hice mucho más simple, funciona pero no soy un depurador de seguridad

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

simple o que? Después de obtener los archivos correctos, WordPress manejará los medios y los cargará, luego los configurará como una miniatura.

Jesse Baker
fuente