Search code examples
phpimagepostcommandwordpress-rest-api

Wordpress api post image raw data without being blank in media library


So, to get to the heart of the matter, I want to post an image on a worpress site with the api (v2).

First part of the problem is that I don't have a url or file path, I just have the raw data of the image in a variable that I get from an export done before.

The second part of the problem is that once posted (well normally), the image appears blank in the media library in the admin.

Here is my code :

if (isset($product['priority_web_image'])) {

            $image_name = $product['priority_web_image']['filename'];
            $data = $product['priority_web_image']['data'];
            $ext = substr($image_name, strpos($image_name, ".") + 1);
            if ($ext == 'jpg') {
                $ext = 'jpeg';
            }
            $mime_type = 'image/'.$ext;

            $headers = [
                'Authorization' => 'Bearer '.$result_auth->access_token,
                "cache-control" => "no-cache",
                "Content-Type"  =>  $mime_type,
                "Content-Disposition" => "attachement;filename=".$image_name,
              ];

            $body = [
                "source_url"  =>  $data,
                "slug"        =>  "image_test_pimcore",
                "status"      =>  "future",
                "title"       =>  $image_name,
                "media_type"  => "image",
                "mime_type"   =>  $mime_type
            ];

            $options = [
                "headers"      =>  $headers,
                "form_params"  =>  $body,
                
            ];
            $result = $this->WPApi->request("POST", "media", $options);
            $bodyAry = json_decode($result->getBody());
            //echo print_r($bodyAry);
            return $bodyAry;
        }

I use Guzzle for make the request.

If anyone knows what I'm missing, I'll take it :-).


Solution

  • I found a solution !

          file_put_contents($filepath, base64_decode($data));
    
          // Make sure the image exist
          if (!file_exists($filepath)){return;}
    
          // Load the image
          $file = file_get_contents($filepath);
    
          // Get the filename
          $filename = $image_name? $image_name : basename($filepath);
    
          // Initiate curl.
          $ch = curl_init();
          curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt( $ch, CURLOPT_URL, $url .'/wp-json/wp/v2/media/' );
          curl_setopt( $ch, CURLOPT_POST, 1 );
          curl_setopt( $ch, CURLOPT_POSTFIELDS, $file );
          curl_setopt( $ch, CURLOPT_HTTPHEADER, [
              "Content-Disposition: form-data; filename=\"$filename\"",
              'Authorization: Bearer ' .$result_auth->access_token,
          ] );
          $result = curl_exec( $ch );
          curl_close( $ch );
    
          // Decode the response
          $api_response = json_decode($result);
    
          return $api_response;