Obtenga $ image_id después de cargar con media_sideload_image ()

10

Quiero cargar una imagen y establecerla como imagen destacada en una publicación. Lo que intenté fue esto:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

Pero media_sideload_image() no devuelve el image_id , sino la imagen html de procesamiento. ¿Cómo puedo obtener el image_id ?

    
pregunta Xavin 21.03.2012 - 17:43

5 respuestas

28

Aquí hay un ejemplo de cómo evitar esta limitación usando acciones / enlaces:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

La idea es que cuando se ejecuta media_sideload_image , esta:

  • descarga la imagen
  • lo agrega como un archivo adjunto (una publicación de tipo attachment )
  • luego adjunta ese archivo adjunto a la publicación cuya ID proporcionó ($ post_id)

Su problema es que no proporciona la ID de publicaciones de archivos adjuntos recién creada.

Pero , cuando se crea un archivo adjunto, se activa una acción que contiene su ID. Podemos engancharnos a esto antes de crear el archivo adjunto, y guardar la vista en miniatura destacada con la ID de publicación que nos proporcionó, y luego desengancharla.

    
respondido por el Tom J Nowell 21.03.2012 - 17:56
6

He creado una función para obtener la ID de la base de datos, buscando por URL.

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

Puede obtener la URL (en lugar del código html) con un cuarto parámetro establecido en 'src' Codex: media_sideload_image ()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);
    
respondido por el yondemon 19.05.2016 - 14:02
4

La respuesta de @Tom J Nowell es acertada. Encontré otra alternativa (usando diferentes funciones) se explica aquí pero me gusta más esta.

En mi caso, tengo una serie de $ publicaciones con todas las publicaciones que quiero insertar y una $ media (las mismas $ nid claves que $ posts) con los medios. Mi código es la misma solución que la de Tom, pero se ha rediseñado para usar una función anónima:

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

En mi caso, asumo que el primer elemento en cada $ media [$ nid] debe ser la imagen destacada de su publicación.

WordPress definitivamente cambiará media_sideload_image () para que devuelva el $ id. De hecho, la función lo tiene a mano, consulte la fuente aquí . De hecho, hay un ticket de seguimiento para esto e incluso tienen parches para aplicar esto a su núcleo mientras tanto. tu quieres.

    
respondido por el Jorge Orpinel 23.10.2014 - 01:48
4

Estaba buscando una solución y decidí buscar el código para media_sideload_image() , que era muy sencillo. Utiliza media_handle_sideload() que nos da el archivo adjunto id .

Lo modifiqué para devolver el archivo adjunto id en lugar de la fuente html de la imagen, e incluso agregué una forma de enviar un nuevo nombre de archivo.

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $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 null;
}
    
respondido por el Dario Zadro 20.05.2017 - 17:40
3

Ya no hay necesidad de soluciones antiguas.

Puede obtener la ID con un cuarto parámetro ($ return) configurado en 'id'

<?php media_sideload_image($file, $post_id, $desc, $return); ?> 

enlace

    
respondido por el olaf 01.11.2017 - 23:05

Lea otras preguntas en las etiquetas