Posted image for publication in Wordpress XMLRPC

I use XMLRPC to publish posts in Wordpress. I am having problems sending thumbnails, after debugging the Wordpress code, I see that my problem is caused by the fact that the image is not attached to the message. I have to do this without fixing wordpress or using PHP, only iwth XMLRPC.

I can upload an image and get the image id. Another point that bothers me is how you attach the image to a message that you have not posted yet, because you expect the image to load? Should I upload the image after that, and then use the image identifier and message id to update the image metadata?

Edit: Wordpress code that is problematic is a check

if ( $thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'thumbnail' ) ) 

and I believe that it fails because the Unattached image, if I fix this code, everything is fine, but I can not fix WP of my application users (so this is not a solution)

+6
source share
3 answers

Yes, it is possible if the version of Wordpress is 3.5 or higher, when using the code to upload a file / image you can set post_id. The thread that I used for new posts with highlighted images looks like this:

  • use the newPost function and publish the content without image, and also set the publication to false, write down the post_id returned by this

  • Upload an image and set post_id to the message id just sent, write down image_id

  • when you finish editing the message and set the wp_post_thumbnail value to the image_id that you just downloaded, and also set the publication to true (if necessary)

Important: The mime type is important, it must be "image / jpg" or "image / png", please see the documentation if the mime worng type, for example, "jpg", will fail.

Hint: For debugging, if you get a general error from Wordpress and you cannot understand why you can check the Wordpress code and even edit it by adding debug / trace calls and I hope you can find out the reason.

This is an example post with a category, image, and tags. This requires the IXR.php class https://github.com/WordPress/WordPress/blob/master/wp-includes/class-IXR.php
and mime_content_type function
https://github.com/caiofior/storebaby/blob/master/magmi/plugins/extra/general/socialnotify/wp/mimetype.php

  $client = new IXR_Client($url); $content = array( 'post_status' => 'draft', 'post_type' => 'post', 'post_title' => 'Title', 'post_content' => 'Message', // categories ids 'terms' => array('category' => array(3)) ); $params = array(0, $username, $password, $content); $client->query('wp.newPost', $params); $post_id = $client->getResponse(); $content = array( 'name' => basename('/var/www/sb/img.jpeg'), 'type' => mime_content_type('/var/www/sb/img.jpeg'), 'bits' => new IXR_Base64(file_get_contents('/var/www/sb/img.jpeg')), true ); $client->query('metaWeblog.newMediaObject', 1, $username, $password, $content); $media = $client->getResponse(); $content = array( 'post_status' => 'publish', // Tags 'mt_keywords' => 'tag1, tag2, tag3', 'wp_post_thumbnail' => $media['id'] ); $client->query('metaWeblog.editPost', $post_id, $username, $password, $content, true); 
+7
source

My version, if you want to use only wp.newPost and wp.editPost

 include_once( ABSPATH . WPINC . '/class-IXR.php' ); include_once( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' ); $usr = 'username_on_the_server_side'; $pwd = 'password_on_the_server_side'; $xmlrpc = 'server side xmlrpc.php url'; $client = new IXR_Client($xmlrpc); //////////// IMAGE UPLOAD AND ATTACHMENT POST CREATION /////////// $img_attach = 'link to the image'; $img_attach_content = array( 'name' => basename($img_attach), 'type' => mime_content_type($img_attach), 'bits' => new IXR_Base64(file_get_contents($img_attach)), ); $status = $client->query( 'wp.uploadFile','1', $usr, $pwd, $img_attach_content ); $image_returnInfo = $client ->getResponse(); //////////// POST CREATION /////////// $custom_fields = array( array( 'key' => 'blabla1', 'value' => 'blabla1_value' ), array( 'key' => 'blabla12', 'value' => 'blabla1_value2') ); $post_content = array( 'post_type' => 'post', 'post_status' => 'draft', //for now 'post_title' => 'XMLRPC Test', 'post_author' => 3, 'post_name' => 'XMLRPC Test', 'post_content' => 'XMLRPC Test Content', 'custom_fields' => $custom_fields ); $res = $client -> query('wp.newPost',1, $usr, $pwd, $post_content); $postID = $client->getResponse(); if(!$res) echo 'Something went wrong....'; else { echo 'The Project Created Successfully('.$res.')<br>Post ID is '.$postID.'<br>'; } //////////// Image Post Attachment Edit /////////// $img_attach_content2 = array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_title' => $postID, 'post_name' => $postID, 'post_parent' => $postID, 'guid' => $image_returnInfo['url'], 'post_content' => '', 'post_mime_type' => 'image/jpg' ); $res2 = $client -> query('wp.editPost', 0, $usr, $pwd, $image_returnInfo['id'], $img_attach_content2); $postIDimg = $client->getResponse(); //////////// POST EDIT /////////// $post_content2 = array( 'post_status' => 'publish', //publish 'wp_post_thumbnail' => $image_returnInfo['id'], 'custom_fields' => array( 'key' => '_thumbnail_id', 'value' => $image_returnInfo['id'] ) ); $media2= $client->query('wp.editPost',0, $usr, $pwd, $postID, $post_content2); 
+1
source

This is my version, using wp.newPost and wp.editPost , added in WordPress 3.4 , which allows you to use custom post types .

 require_once("IXR_Library.php.inc"); $title = 'My title'; $body = 'My body'; $category="category1, category2"; // Comma seperated pre existing categories. Ensure that these categories exists in your blog. $keywords="keyword1, keyword2, keyword3"; $customfields=array('key'=>'Author-bio', 'value'=>'Autor Bio Here'); // Insert your custom values like this in Key, Value format $title = htmlentities($title,ENT_NOQUOTES,@$encoding); $keywords = htmlentities($keywords,ENT_NOQUOTES,@$encoding); $content = array( 'post_title'=>$title, 'post_content'=>$body, 'post_type'=>'some_custom_post_type', 'post_status' => 'draft', // http://codex.wordpress.org/Post_Status 'mt_allow_comments'=>0, // 1 to allow comments 'mt_allow_pings'=>0, // 1 to allow trackbacks 'mt_keywords'=>$keywords, 'categories'=>array($category), 'custom_fields' => array($customfields) ); // Create the client object $client = new IXR_Client('http://example.com/xmlrpc.php'); $username = "wp_username"; $password = "wp_username_password"; $params = array(0,$username,$password,$content,true); // Last parameter is 'true' which means post immediately, to save as draft set it as 'false' if (!$client->query('wp.newPost', $params)) { die('<br/><strong>Something went wrong - '.$client->getErrorCode().' : '.$client->getErrorMessage().'<br >'); } else { $post_id = $client->getResponse(); echo 'Inserted with id'.$post_id; $picture = '/full/path/to/pic.jpg'; $content = array( 'name' => basename($picture), 'type' => mime_content_type($picture), 'bits' => new IXR_Base64(file_get_contents($picture)), true ); if (!$client->query('metaWeblog.newMediaObject', 1, $username, $password, $content)) { die('<br/><strong>Something went wrong - newMediaObject'.$client->getErrorCode().' : '.$client->getErrorMessage().'<br >'); } else { $media = $client->getResponse(); $content = array( 'post_status' => 'publish', 'post_thumbnail' => $media['id'] ); if (!$client->query('wp.editPost', 0, $username, $password, $post_id, $content)) { die('<br/><strong>Something went wrong editPost - '.$client->getErrorCode().' : '.$client->getErrorMessage().'<br >'); } } } 
0
source

Source: https://habr.com/ru/post/949739/


All Articles