media_sideload_image gera em branco?

4

Estou criando um formulário de postagem personalizado que deve levar uma imagem externa e enviá-la para a biblioteca de mídia e anexá-la a essa postagem. Isso deve ser possível usando media_sideload_image, mas estou recebendo uma página em branco em vez de funcionar corretamente, sem erro algum. Meu código:

// Add the content of the form to $post as an array
        $new_post = array(
            'post_title'    => $title,
            'post_content'  => $description,
            'tags_input'    => $tags,
            'post_type'     => 'link_submit',
            'post_status'   => 'publish'
        );
        //save the new post and return its ID
        if ($stop == false){
            $pid = wp_insert_post($new_post);
            update_post_meta($pid,'Link',$link,true);
            update_post_meta($pid,'Type',$type,true);
                    // attach image
            set_time_limit(300);
            $upload = media_sideload_image($link, $pid, "test");
            if ( is_wp_error( $upload ) ){
            die( 'Nope' );
            }

            $link = get_permalink( $pid );
            wp_redirect( $link."?posted" );
            die();
        }   

Idéias?

Obrigado Dennis

edit: novo código:

if (is_page('Upp')){
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    set_time_limit(300);
    $upload = media_sideload_image("http://29.media.tumblr.com/tumblr_lmp1tbiYwh1qzlfumo1_500.jpg", "202", "my description");
    die ( $upload );
}
    
por FLX 09.06.2011 / 23:05

1 resposta

5

Primeiramente, inverta a ordem na sua condicional. Você deve usar if ( false == $stop ) { ... É chamado de "condicional Yoda" e está na lista de práticas recomendadas para o código WP.

Em segundo lugar, media_sideload_image não retornará um objeto de erro WP se as coisas falharem. Se as coisas falharem, retornará o ID do post passado ( $pid no seu caso). Se bem sucedido, ele retornará o HTML para renderizar a imagem que acabou de ser inserida.

Eu recomendaria apenas descartar o conteúdo de $upload para ver o que está lá e ver se as coisas são bem-sucedidas. Então, o código if(is_wp_error()) ... substitui com wp_die( $upload ) e veja o que sai. Se é um id, então algo está errado no seu sistema e você precisa investigar porque o seu servidor não pode baixar imagens. Se for uma marcação HTML para uma imagem, a imagem será adicionada e você estará pronto para usar.

Para referência, dê uma olhada na função media_sideload_image() real em /wp-admin/includes/media.php ao redor da linha 569.

Edit: 6/20/11

Eu dei uma olhada mais profunda no código e comecei a percorrer os pontos de interrupção definidos no código do WordPress, que é onde eu finalmente encontrei o problema.

Ao processar a imagem, media_sideload_image() fará uma chamada para media_handle_image() , que está no mesmo arquivo. Não há problemas aqui. Mas esta outra função faz uma chamada para wp_read_image_metadata() , que é uma função definida em outro arquivo que ainda não incluímos!

Infelizmente para nós (e obviamente ainda não foi descoberto porque esse código vai contra as boas práticas do WP), há um desagradável símbolo @ antes dessa chamada de função. O símbolo @ no PHP irá silenciar quaisquer erros lançados pelo analisador, então o PHP vê um erro "função não definida" e pára ... nos dando uma página em branco e nos deixando coçando nossas cabeças.

Portanto, adicionar a linha a seguir à lista de require_once() s carregará e inserirá a imagem:

require_once(ABSPATH . 'wp-admin/includes/image.php');

A única outra coisa que me deu dor de cabeça foi que você codificou por post_type=link_post ... Eu não tinha esse tipo de postagem definido, então eu estava correndo em círculos tentando descobrir por que wp_insert_post() não era trabalhando ... foi, e agora tenho 100 "Test Post" no meu DB: -)

    
por EAMann 13.06.2011 / 05:38