2013-07-18 2 views
6

Я использую XMLRPC для публикации сообщений в Wordpress. У меня возникли проблемы с отправкой эскизов, после отладки кода Wordpress я вижу, что моя проблема вызвана тем, что изображение не прикреплено к сообщению. Я должен сделать это, не исправляя wordpress или используя PHP, только iwth XMLRPC.Прикрепить изображение для публикации в Wordpress XMLRPC

Я могу загрузить изображение и получить идентификатор изображения. Другой вопрос, который меня смущает, - это как вы прикрепляете изображение к сообщению, которое вы еще не отправили, потому что вы ожидаете загрузки изображения? Я должен загрузить изображение после этого, а затем использовать идентификатор изображения и идентификатор сообщения сделать обновление метаданных изображения?

Edit: код в WordPress, что является проблематичным, эта проверка

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

и мое предположение, это то, что она не потому, что изображение является Unattached, если я исправить этот код все это хорошо, но я не могу исправить WP моих пользователей приложения (так что это не решение)

+0

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

+0

невозможно без какого-либо манипулирования PHP-кодом. –

ответ

7

Да, это возможно, если Wordpress версии 3.5 или выше, при использовании кода для загрузки файла/изображения вы можете установить post_id. Потока я использовал для новых сообщений с показанными изображениями, как это:

  1. использовать функцию newPost и опубликовать содержимое без признаков изображения, а также установить публиковать ложь, запись post_id возвращенное это

  2. загрузить изображение и установить post_id к идентификатору поста только публикуемых, записи image_id

  3. когда сделано изменить запись и установите wp_post_thumbnail равное image_id вы только что загрузили, а также установить опубликовать верно (при необходимости)

Важно: Тип мим имеет важное значение, оно должно быть «изображение/JPG» или «изображение/PNG» смотрите в документации, если mime type изношенg подобный "jpg" установка не получится.

Подсказка: Для отладки, если вы получаете общую ошибку в wordpress, и вы не можете понять, почему вы можете проверить код Wordpress и даже отредактировать его, добавив отладочные/трассировочные вызовы и, надеюсь, вы сможете выяснить причину ,

Это пример публикации с категорией, изображением и тегами. Это требует класса IXR.php
https://github.com/WordPress/WordPress/blob/master/wp-includes/class-IXR.php
и mime_content_type функции
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

Зачем это нужно сделать в два этапа с редактированием? Мне кажется, вы можете загрузить изображение сначала, захватить id, а затем прикрепить Id в newPost()? –

+0

@RickStrahl доверяют мне, что в то время все эти шаги были важны, может быть, теперь все по-другому, но чтобы загрузить это изображение, вам нужно было, чтобы post_id прикреплял изображение к сообщению, и чтобы установить изображение с изображением, вам понадобился идентификатор загруженное изображение, мой вопрос и ответ заключались в том, что вы используете XMLRPC напрямую и не используете библиотеку WP, которая, возможно, может сделать это за меньшее количество шагов – simion314

0

Это моя версия, используя wp.newPost и wp.editPost, добавлена ​​WordPress 3.4, что позволяет использовать таможенного поста типы.

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

Моя версия, если вы хотите использовать только wp.newPost и 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); 
Смежные вопросы