Como definir uma imagem em destaque (miniatura) pelo URL da imagem ao usar wp_insert_post ()?


61

Ao pesquisar na entrada de referência da função wp_insert_post () , notei que não há nenhum parâmetro na matriz que exija que permita definir a 'Imagem em destaque' para uma publicação, exibida como miniatura da publicação no meu tema.

Analisei funções como set_post_thumbnail () , como sugerido pelo Sr. Bennett, mas isso parece ser uma adição relativamente nova ao próprio WordPress e ao codex do WordPress. Como tal, não existem fontes que possam explicar como o parâmetro $ thumbnail_id deve ser adquirido e fornecido. Se essa é realmente a função a ser usada, de que maneira eu poderia fornecer um parâmetro $ thumbnail_id válido quando tudo o que tenho é um URL de imagem?

Desde já, obrigado!

Respostas:


107

Você pode definir uma imagem como miniatura da postagem quando estiver na sua biblioteca de mídia. Para adicionar uma imagem na sua biblioteca de mídia, você precisa carregá-la no seu servidor. O WordPress já tem uma função para colocar imagens na sua biblioteca de mídia, você só precisa de um script que faça o upload do seu arquivo.

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()

Função:

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


EDIT: Criação de caminho adicionada

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


Obrigado por seus esforços! Porém, isso só funciona quando se usa $ upload_dir ['basedir'] (em vez de caminho), porque quando inspeciono o anexo através da interface de pós-edição, ele é referido como ... / uploads / FILENAME.EXT enquanto $ upload_dir ['path' ] armazenaria em algo como ... / uploads / 2012/02 / FILENAME.EXT. Pode ser ainda melhor alterar de alguma forma como o arquivo é referenciado, mas eu não saberia como.
6282 Chris

11
Adicionado criação de caminho na minha resposta.
Rob Vermeer

Agradecemos sua resposta rápida :). No entanto, ainda recebo o mesmo resultado, aqui está uma captura de tela exibindo meu problema: i.imgur.com/iKTNs.png . A seção superior é o resultado de colocar um eco em sua condicional, apenas para ver o que está acontecendo.
22412 Chris

Alterou novamente, não passou o caminho completo para wp_insert_attachment e wp_generate_attachment_metadata. Espero que isso resolva o problema.
Rob Vermeer

11
Aviso: Esta resposta reescreve o arquivo se tiver o mesmo nome, cuidado. Deve gerar nomes usando $ post_id ou pelo menos uniqid ()
Ivan Castellanos

10

Tente usar set_post_thumbnail().

Editar por Otto: Você esclareceu sua pergunta, então esclarecerei a resposta que Chip deu.

Basicamente, você também precisa fazer o 'anexo' da postagem. Quando uma imagem é carregada na biblioteca de mídia do WordPress, é feita uma entrada de postagem especial com um tipo de anexo. Este anexo está vinculado a alguma postagem específica por meio do identificador post_parent.

Portanto, se você souber o ID do anexo, chamar set_post_thumbnail com o objeto de postagem ou o ID e o ID do anexo simplesmente definirá o sinalizador de miniatura da postagem.

Se você ainda não criou o anexo, precisará fazer isso primeiro. A maneira mais fácil de fazer isso é com wp_insert_attachment(). Essa função utiliza uma matriz de alguns parâmetros, o nome do arquivo (o arquivo já deve estar no diretório de uploads adequado) e o ID da postagem pai à qual você deseja anexar o anexo.

Apenas enviar um arquivo e anexá-lo a uma postagem não faz nada automaticamente. Este é simplesmente um tipo de mecanismo de categorização. O mecanismo da galeria, por exemplo, usa as imagens anexadas de uma postagem para criar a [galeria] para essa postagem. Uma miniatura de uma postagem é apenas uma das imagens anexadas que foi configurada para ser a miniatura.

Mais informações sobre como usar o wp_insert_attachment podem ser encontradas no codex (link acima).


Obrigado por sua resposta! Como eu recuperaria o ID da miniatura? Estou começando com um URL de imagem, então acho que devo adicionar uma imagem à biblioteca do wordpress usando outra função?
Chris

Como você já está inserindo uma postagem, eu assumi que você já estava anexando imagens à postagem que está inserindo. Isso não é uma suposição válida?
Chip Bennett

Desculpe, mas ainda não descobri como anexar imagens a uma postagem por URL. Além disso, eu não gostaria que a imagem fosse realmente exibida no próprio post. Atualmente, estou procurando a função que retornará o $ thumbnail_id e pensei que talvez wp_insert_attachment () funcionaria, até que notei que ele já exigia que o anexo estivesse no diretório de upload. Não sei como obter um arquivo de imagem lá por sua URL e não tenho certeza se essa é a função que estou procurando em primeiro lugar. Obrigado pela ajuda!
Chris

Você pode reescrever sua pergunta com essas informações para descrever melhor o que você está tentando realizar? (Ou, deixar um presente como está, e começar uma nova pergunta, para perguntar como obter o ID apego ao inserir uma mensagem?)
Chip Bennett

A pergunta original foi editada e parcialmente reformulada. Verifique novamente :).
Chris

9

Eu gostaria de melhorar a resposta de Robs utilizando as principais funções do WP download_urlemedia_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 );

}

11
Usar as funções nativas do WordPress é a melhor prática, obrigado.
Mostafa Soufi 15/09/19

Por algum motivo, esta versão me deu erros dizendo "Não foi fornecido um URL válido". , enquanto a resposta de Rob Vermeer funcionou.
Flimm

3

set_post_thumbnail() é a melhor função para esse requisito.

Eu acho que você encontra o ID de um anexo via get_children()ou get_posts(). O resultado tem uma matriz e dentro dessa matriz está o ID. O exemplo a seguir para teste; eu espero que dê certo; escreva sem testes, apenas no zero.

Para sua exigência, é importante que você mude get_the_ID()com a sua post-ID; retorne o ID do anexo e você poderá 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);
}

3

Acabei de encontrar isso e simplificou muito, funciona, mas não sou um purificador de segurança

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

simples ou o que? depois de obter os arquivos corretos, o wordpress manipula a mídia e a carrega, e depois a define como miniatura.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.