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