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

55

Mientras miraba la entrada de referencia de función para wp_insert_post () , noté que no hay ningún parámetro en la matriz que requiere que me permitirá configurar la 'Imagen destacada' para una publicación, que se muestra como publicación de miniaturas en mi tema.

He examinado funciones como set_post_thumbnail () , como lo sugirió el Sr. Bennett, pero esto parece ser una relativamente nueva adición 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 $ thumbnail_id válido cuando todo lo que tengo es una URL de imagen?

Gracias de antemano!

    
pregunta Chris 26.01.2012 - 22:56

5 respuestas

97

Puede establecer una imagen como miniatura de publicación cuando esté en su biblioteca de medios. Para agregar una imagen a su biblioteca de medios, debe subirla a su servidor. WordPress ya tiene una función para colocar 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 );
}

enlace

enlace

EDITAR: Creación de ruta añadida

enlace

    
respondido por el Rob Vermeer 05.02.2012 - 23:07
10

Intente usar set_post_thumbnail() .

Edit by Otto: Aclaraste tu 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 crea una entrada de publicación especial para ella con un tipo de archivo adjunto. Este archivo adjunto está vinculado a alguna publicación específica a través del identificador post_parent.

Por lo tanto, si conoce el ID del archivo adjunto, al llamar a set_post_thumbnail con el objeto de publicación o ID y el ID del archivo adjunto simplemente establecerá la marca de miniatura de publicación.

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

El solo hecho de tener un archivo cargado y adjuntado 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, utiliza las imágenes adjuntas de una publicación para crear la [galería] para esa publicación. Una miniatura para una publicación es solo una de las imágenes adjuntas que se configuró para que sea la miniatura.

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

    
respondido por el Chip Bennett 26.01.2012 - 23:08
5

Me gustaría mejorar la respuesta de Robs utilizando las funciones principales de WP download_url y media_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 );

}
    
respondido por el Jan Beck 02.03.2016 - 08:23
3

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

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

Para tu requerimiento es importante que cambies get_the_ID() con tu post-ID ; devuelva el ID del archivo adjunto y puede usar 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);
}
    
respondido por el bueltge 06.02.2012 - 16:14
3

Encontré esto y lo simplifiqué mucho, 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 establecerá como una miniatura.

    
respondido por el Jesse Baker 21.02.2015 - 00:45

Lea otras preguntas en las etiquetas