2013-07-18 12 views
6

Używam XMLRPC do robienia postów w Wordpress. Mam problemy z publikowaniem miniatur, po debugowaniu kodu Wordpress widzę, że mój problem spowodowany jest tym, że obraz nie jest załączony do postu. Muszę to zrobić bez poprawiania wordpressa lub używania PHP, tylko z XMLRPC.Dołącz obraz do posta w Wordpress XMLRPC

Mogę przesłać obraz i uzyskać identyfikator obrazu. Inna kwestia, która mnie wprawia w zakłopotanie, to jak dołączyć obraz do postu, który nie został jeszcze wysłany, ponieważ czekasz na przesłanie obrazu? Mam przesłać obraz, a następnie opublikować, a następnie użyć identyfikatora obrazu, a identyfikator postu aktualizuje metadane obrazu?

Edit: kod w WordPress, który jest problematyczny jest to check

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

i moje założenie jest, że to nie działa, ponieważ obraz jest Nieprzyłączony, jeśli to naprawić kodu wszystko jest w porządku, ale nie mogę załatajcie WP moich użytkowników aplikacji (więc to nie jest rozwiązanie)

+0

Zobacz http://wp.tutsplus.com/tutorials/creative-coding/uploading-pictures-via-xml-rpc-and-php-to-wordpress/. – user1929959

+0

nie jest możliwe bez manipulowania kodem PHP w jakiś sposób. –

Odpowiedz

7

Tak, można to zrobić, jeśli Wordpress jest w wersji 3.5 lub wyższej, podczas korzystania z kodu do przesłania pliku/obrazu można ustawić post_id. Przepływ użyłem nowych stanowisk z polecanych obrazów jest tak:

  1. użyć funkcji newPost i dodawać treści bez polecanego obrazu, a także ustawić publikować na false, zapisz post_id zwrócony przez to

  2. przesłać obraz i ustawić post_id na id postu tylko pisał, nagrać image_id

  3. po zakończeniu zmodyfikować, i ustawić wp_post_thumbnail równą image_id po prostu dodane, a także ustawić publikować na true (jeśli to konieczne)

Ważne: typ MIME jest ważne, musi być "image/jpg" lub "image/png" proszę zapoznać się z dokumentacją, jeśli typ mime jest taki, jak "jpg" dołączanie zakończy się niepowodzeniem.

Wskazówka: Do debugowania, jeśli pojawi się błąd rodzajowy z WordPress i nie można dowiedzieć się, dlaczego można sprawdzić kod wordpress, a nawet go edytować, dodając debugowanie/śledzenia połączeń i mam nadzieję, że można dowiedzieć się przyczyną .

To jest przykład postu z kategorią, obrazem i tagami. To wymaga klasy IXR.php
https://github.com/WordPress/WordPress/blob/master/wp-includes/class-IXR.php
i mime_content_type funkcję
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); 
+0

Dlaczego jest to konieczne w dwóch krokach podczas edycji? Wydaje mi się, że możesz najpierw przesłać obraz, przechwycić identyfikator, a następnie dołączyć identyfikator w funkcji newPost()? –

+0

@RickStrahl zaufaj mi, że w tamtym czasie wszystkie te kroki były ważne, może teraz jest inaczej, ale aby przesłać ten obraz, musisz mieć post_id, aby dołączyć obraz do postu, a do ustawienia polecanego obrazu potrzebujesz identyfikatora przesłany obraz, moje pytanie i odpowiedź dotyczyły bezpośredniego korzystania z XMLRPC i bez biblioteki WP, która może to zrobić w mniejszej liczbie kroków – simion314

0

To jest moja wersja, używając wp.newPost i wp.editPost, dodany WordPress 3.4, które pozwalają na wykorzystanie niestandardowego postu typy.

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 >'); 
     } 
    } 
} 
1

Moja wersja, jeśli chcesz używać tylko wp.newPost i 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);