Téléchargement de médias avec l'API REST

9

J'ai des problèmes lors du téléchargement de médias sur un site WordPress avec l'API JSON REST.

Avec le code suivant, je peux télécharger les photos, mais aucune information ne leur est attribuée, pas même le nom - en fait, le nom devient automatiquement l'URL et le nom de fichier (sans l'extension).

$username = "ZX";
$password = "ZX";
$host = 'http://ZX.com/wp-json/wp/v2/media';
$data = json_encode($data);
$file = '/Users/xx.png';
$imagedata  = file_get_contents($file);
$process = curl_init($host); 
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_BINARYTRANSFER, TRUE);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($process, CURLOPT_TIMEOUT, 50);
curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($process, CURLOPT_POSTFIELDS, $data);
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type:image/png','Content-Disposition:attachment;filename='.$file));
$return = curl_exec($process);
print_r($return);

Comment attribuer des données, comme les suivantes, aux téléchargements?

$data = array(
  "status" => "draft",
  "title" => "Photo media",       
  "description" => "Photo media1",
  "media_type" => "image",
  "alt_text" => "alternate text"
  );
Diario de Morelia
la source

Réponses:

3

Ce n'est pas possible via l'API; vous devez récupérer l'image vous - même et envoyer les données à l'API vous-même. Blockquote

- Ceci cite Ryan sur le problème GitHub mentionné dans la réponse @Dan (supprimé).

Comment charger latéralement des images

Notez que la media_sideload_image()valeur de retour peut également être une instance de \WP_Error. Il vous suffit ensuite de le joindre à un message, ce qui est assez simple:

$media = media_sideload_image( 
    'http://i.imgur.com/bcJvAj0.jpg', 
    $post->ID, 
    'Some image description', 
    'src'
);

if ( ! empty( $media ) and ! is_wp_error( $media ) ) {
    // reference new image to set as featured
    $attachments = get_posts( [
        'post_type'      => 'attachment',
        'posts_per_page' => 1,
        'post_status'    => 'any',
        'post_parent'    => $post->ID,
    ] );

    if ( is_array( $attachments ) ) {
        set_post_thumbnail( $post->ID, $attachments[0]->ID );
    }

    // Test print our image. The return value is the src of the sideloaded image.
    printf( '<img src="%s" />', $media );
}

Les internes

Un bref retour en arrière à travers le noyau qui explique pourquoi vous devriez vous en tenir à l'API:

Jetez un oeil à la source de media_sideload_image()pour voir qu'il utilise en download_url()interne, qui utilise wp_safe_remote_get(), un wrapper pour \WP_HTTP::get(). Cela signifie qu'il offre l'intégralité de l'API WP tout en étant assez sûr, débogable et facile à utiliser. La valeur de retour de download_url()est le résultat de wp_tempnam(), qui prend /tmpen compte tous les emplacements possibles (il y en a beaucoup) et s'assure que votre emplacement est accessible en écriture . Le media_handle_sideload()va générer toutes les données de pièce jointe et les métadonnées nécessaires.

kaiser
la source
Quelle est la question citée? Cette méthode est-elle toujours valable?
Brethlosze
Voir la mise à jour et le lien GitHub – Issue dans le devis. Et pourquoi ne serait-il pas valable? Si vous voulez vérifier à nouveau, suivez simplement le trou du lapin le long des lignes des internes et comparez la version WP actuelle avec le code lié ici. Ce n'est pas si difficile.
kaiser
Parce que cette réponse date de 2016. Je veux juste m'assurer qu'à partir de 2019, l'API REST ne pourra pas gérer le téléchargement de fichiers dans des mediaobjets, donc on peut se concentrer sur les fonctions WP.
Brethlosze
@Brethlosze comme je l'ai dit: jetez un œil au code principal. Je n'ai pas de nouvelles informations sur ce sujet car je ne travaille pas beaucoup avec WP en ce moment.
kaiser