Obtenha $ image_id após fazer o upload com media_sideload_image ()

10

Quero fazer upload de uma imagem e defini-la como uma imagem em destaque em uma postagem. O que eu tentei foi isso:

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

Mas media_sideload_image() não está retornando o image_id , mas a imagem renderizada em HTML. Como posso obter o image_id ?

    
por Xavin 21.03.2012 / 17:43

5 respostas

28

Aqui está um exemplo de como ignorar essa limitação usando ações / ganchos:

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');

A ideia é que quando media_sideload_image for executado,

  • faz o download da imagem
  • adiciona-o como um anexo (uma postagem do tipo attachment )
  • em seguida, anexa esse anexo à postagem cujo ID você forneceu ($ post_id)

Seu problema é que ele não fornece o ID de postagens do anexo recém-criado.

Mas , quando um anexo é criado, uma ação é disparada contendo seu ID. Podemos nos conectar a isso antes de criarmos o anexo e salvar a miniatura em destaque com o ID de postagem que ele nos forneceu e, em seguida, liberar a seguir.

    
por Tom J Nowell 21.03.2012 / 17:56
6

Eu criei uma função para obter o ID do banco de dados, pesquisando 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;
}

Você pode obter URL (com código html) com um quarto parâmetro definido como 'src' Codex: media_sideload_image ()

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

A resposta de @Tom J Nowell está correta. Eu encontrei uma outra alternativa (usando diferentes funções) explicado aqui mas eu gosto mais deste.

No meu caso, tenho uma matriz de $ posts com todas as postagens que eu quero inserir e $ media separados (mesmas chaves $ nid $ posts) com a mídia. Meu código é a mesma solução de Tom, mas refatorou o uso de uma função 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' );
    }

No meu caso eu assumo que o primeiro item em cada $ media [$ nid] shuold seja a imagem em destaque de seu post.

O WordPress shouold definitivamente muda o media_sideload_image () para que ele retorne o $ id. De fato, a função está à mão, veja a fonte aqui . Na verdade, há um bilhete de trilha para este e eles ainda têm patches para aplicar isso ao seu núcleo no tempo médio se você quer.

    
por Jorge Orpinel 23.10.2014 / 01:48
4

Eu estava procurando uma solução e decidi examinar o código de media_sideload_image() , que era muito simples. Usa media_handle_sideload() , o que nos dá o anexo id .

Eu o modifiquei para retornar o anexo id ao invés da fonte html da imagem, e até adicionei uma maneira de enviar o novo nome de arquivo.

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;
}
    
por Dario Zadro 20.05.2017 / 17:40
3

Não há mais necessidade de soluções antigas.

Você pode obter o ID com um quarto parâmetro ($ return) definido como 'id'

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

enlace

    
por olaf 01.11.2017 / 23:05

Tags