media_sideload_image genera en blanco?

4

Estoy creando un formulario de publicación personalizado que se supone que toma una imagen externa y la carga en la biblioteca de medios y la adjunta a esa publicación. Esto debería ser posible mediante el uso de media_sideload_image, pero obtengo una página en blanco en lugar de funcionar correctamente, tampoco error. Mi 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();
        }   

Ideas?

Gracias, Dennis

editar: nuevo 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 );
}
    
pregunta FLX 09.06.2011 - 23:05

1 respuesta

5

En primer lugar, invierte el orden en tu condicional. Debe usar if ( false == $stop ) { ... Se llama "condicional de Yoda" y se encuentra en la lista de mejores prácticas para el código WP.

En segundo lugar, media_sideload_image no devolverá un objeto de error WP si las cosas fallan. Si las cosas fallan, devolverá el ID de la publicación aprobada ( $pid en su caso). Si tiene éxito, devolverá el HTML para representar la imagen que se acaba de insertar.

Recomendaría simplemente descargar los contenidos de $upload para ver qué hay allí y ver si las cosas tienen éxito. Entonces, el código if(is_wp_error()) ... reemplácelo con wp_die( $upload ) y vea qué sale. Si es una identificación, entonces algo está mal en tu sistema y debes investigar por qué tu servidor no puede descargar imágenes. Si es una marca HTML para una imagen, entonces la imagen se está agregando y ya está listo para comenzar.

Para referencia, eche un vistazo a la función media_sideload_image() real en /wp-admin/includes/media.php alrededor de la línea 569.

Edición: 20/06/11

Eché un vistazo más profundo al código y comencé a recorrer los puntos de interrupción que establecí en el código de WordPress, que es donde finalmente encontré el problema.

Mientras se procesa la imagen, media_sideload_image() eventualmente realizará una llamada a media_handle_image() , que está en el mismo archivo. No hay problemas aquí. ¡Pero esta otra función realiza una llamada a wp_read_image_metadata() , que es una función definida en otro archivo que aún no hemos incluido!

Desafortunadamente para nosotros (y, obviamente, aún no se ha descubierto porque este código va en contra de las mejores prácticas de WP), hay un desagradable símbolo @ antes de la llamada a la función. El símbolo @ en PHP silenciará cualquier error generado por el analizador, por lo que PHP ve un error de "función no definida" y se detiene ... dándonos una página en blanco y dejándonos rascándonos la cabeza.

Entonces, al agregar la siguiente línea a la lista de require_once() s se cargará e insertará la imagen:

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

La única otra cosa que me dio un dolor de cabeza fue que tu código era para post_type=link_post ... No tenía ese tipo de publicación definido, así que estaba corriendo en círculos tratando de averiguar por qué no era wp_insert_post() trabajando ... era, y ahora tengo 100 "Publicaciones de prueba" en mi base de datos :-)

    
respondido por el EAMann 13.06.2011 - 05:38

Lea otras preguntas en las etiquetas