web-dev-qa-db-fra.com

media_sideload_image génère un blanc?

Je crée un formulaire de publication personnalisé qui est supposé prendre une image externe et la télécharger dans la médiathèque et la joindre à cette publication. Cela devrait être possible en utilisant media_sideload_image, mais je reçois une page vierge au lieu de fonctionner correctement, pas d'erreur non plus. Mon code:

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

Des idées?

Merci Dennis

edit: nouveau code:

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

Tout d'abord, inversez l'ordre dans votre conditionnel. Vous devez utiliser if ( false == $stop ) { .... Cela s'appelle un "conditionnel de Yoda" et figure dans la liste des meilleures pratiques pour le code WP.

Deuxièmement, media_sideload_image ne renverra pas d'objet d'erreur WP en cas d'échec. Si les choses échouent, l'ID de la poste transmise sera renvoyé ($pid dans votre cas). En cas de succès, le code HTML sera renvoyé pour rendre l'image insérée.

Je recommanderais simplement de vider le contenu de $upload pour voir ce qu'il y a dedans et voir si tout va bien. Donc, le code if(is_wp_error()) ... remplacez-le par wp_die( $upload ) et voyez ce qui en sort. Si c'est un identifiant, alors quelque chose ne va pas sur votre système et vous devez déterminer pourquoi votre serveur ne peut pas télécharger les images. S'il s'agit d'une balise HTML pour une image, celle-ci est ajoutée et vous êtes prêt.

Pour référence, jetez un oeil à la fonction media_sideload_image() dans /wp-admin/includes/media.php autour de la ligne 569.


Edit: 20/06/11

J'ai examiné le code de plus près et j'ai commencé à parcourir les points d'arrêt définis dans le code WordPress. C'est là que j'ai finalement trouvé le problème.

Lors du traitement de l'image, media_sideload_image() fera éventuellement appel à media_handle_image(), qui se trouve dans le même fichier. Pas de problèmes ici. Mais cette autre fonction appelle wp_read_image_metadata(), qui est une fonction définie dans un autre fichier que nous n'avons pas encore inclus!

Malheureusement pour nous (et il n'a évidemment pas encore été découvert car ce code va à l'encontre de WP meilleures pratiques), il y a un symbole @ méchant avant cet appel de fonction. Le symbole @ dans PHP annulera toutes les erreurs renvoyées par l'analyseur. Ainsi, PHP verra une erreur "fonction non définie" et s'arrêtera ... nous donnant une page blanche et nous laissant éraflés nos tetes.

Donc, ajouter la ligne suivante à la liste de require_once()s chargera et insérera l'image:

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

La seule autre chose qui me donnait mal à la tête était que votre code était pour post_type=link_post ... Je n'avais pas défini ce type de message, je tournais donc en rond pour essayer de comprendre pourquoi wp_insert_post() ne fonctionnait pas ... c'était, et j'ai maintenant 100 "Test Post" dans ma base de données :-)

5
EAMann