2011-09-30 8 views
5

कोई भी जानता है कि XMLRPC का उपयोग करके वर्डप्रेस में संलग्न फोटो के साथ नई पोस्ट कैसे बनाएं?XMLRPC का उपयोग कर वर्डप्रेस में संलग्न फोटो के साथ नई पोस्ट कैसे बनाएं?

मैं नई पोस्ट बनाने और अलग-अलग तस्वीर अपलोड करने में सक्षम हूं, लेकिन ऐसा लगता है कि अपलोड की गई तस्वीर को अपलोड की गई तस्वीर को संलग्न करने का कोई तरीका नहीं है?

नीचे दिए गए कोड मैं वर्तमान में उपयोग कर रहा हूं।

<?php 
DEFINE('WP_XMLRPC_URL', 'http://www.blog.com/xmlrpc.php'); 
DEFINE('WP_USERNAME', 'username'); 
DEFINE('WP_PASSWORD', 'password'); 

require_once("./IXR_Library.php"); 
$rpc = new IXR_Client(WP_XMLRPC_URL); 
$status = $rpc->query("system.listMethods"); // method name 
if(!$status){ 
    print "Error (".$rpc->getErrorCode().") : "; 
    print $rpc->getErrorMessage()."\n"; 
    exit; 
} 

$content['post_type'] = 'post'; // post title 
$content['title'] = 'Post Title '.date("F j, Y, g:i a"); // post title 
$content['categories'] = array($response[1]['categoryName']); // psot categories 
$content['description'] = '<p>Hello World!</p>'; // post body 
$content['mt_keywords'] = 'tag keyword 1, tag keyword 2, tag keyword 3'; // post tags 
$content['mt_allow_comments'] = 1; // allow comments 
$content['mt_allow_pings'] = 1; // allow pings 
$content['custom_fields'] = array(array('key'=>'Key Name', 'value'=>'Value One')); // custom fields 
$publishBool = true; 

if(!$rpc->query('metaWeblog.newPost', '', WP_USERNAME, WP_PASSWORD, $content, $publishBool)){ 
    die('An error occurred - '.$rpc->getErrorCode().":".$rpc->getErrorMessage()); 
} 
$postID = $rpc->getResponse(); 
echo 'POST ID: '.$postID.'<br/>'; 

if($postID){ // if post has successfully created 

    $fs = filesize(dirname(__FILE__).'/image.jpg'); 
    $file = fopen(dirname(__FILE__).'/image.jpg', 'rb'); 
    $filedata = fread($file, $fs); 
    fclose($file); 

    $data = array(
     'name' => 'image.jpg', 
     'type' => 'image/jpg', 
     'bits' => new IXR_Base64($filedata), 
     false // overwrite 
    ); 

    $status = $rpc->query(
     'metaWeblog.newMediaObject', 
     $postID, 
     WP_USERNAME, 
     WP_PASSWORD, 
     $data 
    ); 
    echo print_r($rpc->getResponse()); // Array ([file] => image.jpg [url] => http://www.blog.com/wp-content/uploads/2011/09/image.jpg [type] => image/jpg) 
} 
?> 

उत्तर

1

यहाँ से वर्डप्रेस (WP-सामग्री)

<?php 
function attach_wordpress_images($productpicture,$newid) 
{ 
    include('../../../../wp-load.php'); 
    $upload_dir = wp_upload_dir(); 
    $dirr = $upload_dir['path'].'/'; 

    $filename = $dirr . $productpicture;      
    # print "the path is : $filename \n";      
    # print "Filnamn: $filename \n";     
    $uploads = wp_upload_dir(); // Array of key => value pairs 
    # echo $uploads['basedir'] . '<br />'; 
    $productpicture = str_replace('/uploads','',$productpicture); 
    $localfile = $uploads['basedir'] .'/' .$productpicture; 
    # echo "Local path = $localfile \n";   

    if (!file_exists($filename)) 
    { 
     echo "hittade inte $filename !"; 
     die ("no image for flaska $id $newid !");             
    } 
    if (!copy($filename, $localfile)) 
    { 
     wp_delete_post($newid); 
     echo "Failed to copy the file $filename to $localfile "; 
     die("Failed to copy the file $filename to $localfile "); 
    } 

    $wp_filetype = wp_check_filetype(basename($localfile), null); 
    $attachment = array(
     'post_mime_type' => $wp_filetype['type'], 
     'post_title' => preg_replace('/\.[^.]+$/', '', basename($localfile)), 
     'post_content' => '', 
     'post_status' => 'inherit' 
     ); 
    $attach_id = wp_insert_attachment($attachment, $localfile, $newid); 

    // you must first include the image.php file 
    // for the function wp_generate_attachment_metadata() to work 

    require_once(ABSPATH . 'wp-admin/includes/image.php');   
    $attach_data = wp_generate_attachment_metadata($attach_id, $localfile); 
    wp_update_attachment_metadata($attach_id, $attach_data); 
} 
?> 
+2

मुझे खेद है। मैं आपके नमूना कोड की सराहना करता हूं, लेकिन मैं एक्सएमएल-आरपीसी में किए जाने वाले तरीकों की तलाश में हूं। –

0

मैं इस कई महीने पहले करना था समर्थित नहीं एक पथ से एक छवि संलग्न करने के लिए कुछ नमूना कोड है। यह संभव है लेकिन न केवल यह हैकी और अनियंत्रित है, इसे समझने के लिए मुझे WordPress स्रोत के माध्यम से खोदना पड़ा। मैंने जो कुछ लिखा था, उसके बाद:

एक चीज जो पूरी तरह से गैर-दस्तावेज थी, एक छवि को एक पोस्ट में संलग्न करने का एक तरीका था। कुछ खुदाई के बाद मुझे attach_uploads() मिला जो एक ऐसा फ़ंक्शन है जो प्रत्येक बार पोस्ट को xml-rpc पर बनाया या संपादित किया जाता है। यह क्या करता है अनचाहे मीडिया ऑब्जेक्ट्स की सूची के माध्यम से खोजें और देखें कि नई/संपादित पोस्ट में उनके लिए एक लिंक है या नहीं। चूंकि मैं छवियों को संलग्न करने की कोशिश कर रहा था ताकि थीम की गैलरी उनका उपयोग करेगी, मैं पोस्ट के भीतर छवियों से लिंक नहीं करना चाहता था, न ही मैं वर्डप्रेस संपादित करना चाहता था। तो मैंने जो किया वह एक HTML टिप्पणी के भीतर छवि यूआरएल सहित था। - danieru.com

जैसे मैंने गन्दा कहा लेकिन मैंने बेहतर तरीके से उच्च और निम्न खोज की और मुझे यकीन है कि कोई भी मौजूद नहीं है।

+0

'$ id = media_handle_sideload ($ डेटा, $ यह -> _ post_id, $ title)' + 'update_post_meta ($ this -> _ post_id, '_thumbnail_id', $ this -> _ thumb_id = $ id)' – brasofilo

9

मैं वर्डप्रेस साइट्स में शामिल हूं (मेरा वर्तमान नियोक्ता इनमें से 3 का उपयोग करता है) और सामानों को रोज़ाना पोस्ट करके और थोक द्वारा मुझे सबसे अच्छा करने के लिए मजबूर कर दिया है - स्क्रिप्ट!

वे PHP-आधारित हैं और उपयोग करने और तैनात करने में तेज़ और आसान हैं। और सुरक्षा? इसे सुरक्षित करने के लिए बस। Htaccess का उपयोग करें।

अनुसंधान के अनुसार, एक्सएमएलआरपीसी जब फाइलों की बात आती है तो एक चीज वर्डप्रेस वास्तव में बेकार होती है। एक बार जब आप एक फ़ाइल अपलोड कर लेंगे, तो आप उस अटैचमेंट को किसी विशेष पोस्ट से संबद्ध नहीं कर सकते! मुझे पता है, यह कष्टप्रद है।

इसलिए मैंने इसे अपने लिए समझने का फैसला किया। इसे हल करने में मुझे एक सप्ताह लग गया। आपको अपने प्रकाशन क्लाइंट पर 100% नियंत्रण की आवश्यकता होगी जो एक्सएमएलआरपीसी अनुपालन है या इसका मतलब आपके लिए कुछ भी नहीं होगा!

आप अपने WordPress स्थापना से, की आवश्यकता होगी:

  • वर्ग IXR.php,/WP-व्यवस्थापक में स्थित/
  • वर्ग WP-xmlrpc-server.php,/WP में स्थित शामिल -

कक्षा-IXR.php की आवश्यकता होगी यदि आप अपना खुद का पोस्टिंग टूल तैयार करते हैं, जैसे मेरे। उनके पास सही ढंग से काम कर रहे बेस 64 एन्कोडर हैं। PHP के साथ आने वाले किसी पर भरोसा न करें।

आपको प्रोग्रामिंग में कुछ हद तक अनुभवी होने की आवश्यकता है ताकि इससे संबंधित हो सके। मैं स्पष्ट होने की कोशिश करूंगा।

  1. संशोधित वर्ग WP-xmlrpc-server.php

    • आपके कंप्यूटर को यह डाउनलोड, FTP के माध्यम से। बस एक मामले में बैकअप, प्रतिलिपि बनाएँ।
    • फ़ाइल को एक टेक्स्ट एडिटर में खोलें। यदि यह प्रारूपित नहीं होता है, (आमतौर पर यह होना चाहिए, अन्यथा, यह यूनिक्स-प्रकार कैरिज ब्रेक का उपयोग कर रहे हैं) इसे कहीं और खोलें या अल्ट्राएडिट जैसे कुछ का उपयोग करें।
    • mw_newMediaObject फ़ंक्शन पर ध्यान दें। यह हमारा लक्ष्य है। यहां एक छोटा सा नोट; वर्डप्रेस ब्लॉगर और movabletype से कार्यक्षमता borrows। यद्यपि वर्डप्रेस में xmlrpc के लिए एक अनूठा वर्ग सेट भी है, लेकिन वे कार्यक्षमता को सामान्य रखने के लिए चुनते हैं ताकि वे काम कर सकें कि प्लेटफॉर्म किस प्रकार उपयोग में है।
    • फ़ंक्शन mw_newMediaObject($args) देखें। आम तौर पर, यह लाइन 2 9 48 में होना चाहिए। यह जानने के लिए कि आप किस लाइन नंबर में हैं, अपने टेक्स्ट एडिटर की स्टेटस बार पर ध्यान दें। अगर आपको अभी भी यह नहीं मिल रहा है, तो अपने टेक्स्ट एडिटर के खोज/ढूंढने के फ़ंक्शन का उपयोग करके इसे देखें।
    • नीचे स्क्रॉल एक छोटे और आप कुछ है कि इस तरह दिखता है होना चाहिए:

      $name = sanitize_file_name($data['name']); 
      $type = $data['type']; 
      $bits = $data['bits']; 
      
    • $ नाम चर के बाद, हम कुछ जोड़ देगा। निचे देखो।

      $name = sanitize_file_name($data['name']); 
      $post = $data['post']; //the post ID to attach to. 
      $type = $data['type']; 
      $bits = $data['bits']; 
      

      नया $ पोस्ट वैरिएबल नोट करें। इसका अर्थ यह है कि जब भी आप एक नया फ़ाइल अपलोड अनुरोध करेंगे, तो आपके लिए संलग्न करने के लिए अब 'पोस्ट' तर्क उपलब्ध होगा।

      आपकी पोस्ट नंबर कैसे प्राप्त करें इस पर निर्भर करता है कि आप xmlrpc-compliant क्लाइंट के साथ पोस्ट कैसे जोड़ते हैं। आम तौर पर, आपको पोस्टिंग के परिणामस्वरूप इसे प्राप्त करना चाहिए। यह एक संख्यात्मक मूल्य है।

      एक बार जब आप ऊपर संपादित किया है, यह तो यहाँ क्यों कोई छवि किसी भी पोस्ट करने के लिए जुड़ा हुआ है लाइन 3000.

      // Construct the attachment array 
      // attach to post_id 0 
      $post_id = 0; 
      $attachment = array(
          'post_title' => $name, 
          'post_content' => '', 
          'post_type' => 'attachment', 
          'post_parent' => $post_id, 
          'post_mime_type' => $type, 
          'guid' => $upload[ 'url' ] 
      ); 
      
    • पर जाने के लिए समय है! Post_parent तर्क के लिए यह हमेशा 0 पर डिफ़ॉल्ट हो जाता है! यह अब मामला नहीं होगा।

      // Construct the attachment array 
      // attach to post_id 0 
      $post_id = $post; 
      $attachment = array(
          'post_title' => $name, 
          'post_content' => '', 
          'post_type' => 'attachment', 
          'post_parent' => $post_id, 
          'post_mime_type' => $type, 
          'guid' => $upload[ 'url' ] 
      ); 
      

      $ post_id अब $ पद है, जो xmlrpc अनुरोध से आता है के मान लेता है। एक बार यह अनुलग्नक के लिए प्रतिबद्ध हो जाने पर, यह आपकी इच्छानुसार जो भी पोस्ट हो, उससे जुड़ा होगा!

      इसे बेहतर किया जा सकता है। एक डिफ़ॉल्ट मान असाइन किया जा सकता है ताकि कोई मूल्य दर्ज न होने पर चीजें टूट न जाए। हालांकि मेरी ओर से, मैंने अपने क्लाइंट पर डिफ़ॉल्ट मान डाला है, और कोई भी XMLRPC इंटरफ़ेस तक नहीं पहुंच रहा है लेकिन मुझे।

    • परिवर्तनों के साथ, अपनी फ़ाइल को सहेजें और उसे उसी पथ में पुनः अपलोड करें जहां आपको यह मिला। फिर, बैकअप बनाना सुनिश्चित करें।

      वर्डप्रेस अपडेट से सावधान रहें जो इस मॉड्यूल को प्रभावित करता है। यदि ऐसा होता है, तो आपको इस संपादन को फिर से लागू करने की आवश्यकता है!

  2. अपने PHP-प्रकार संपादक में कक्षा-IXR.php शामिल करें। यदि आप कुछ और उपयोग कर रहे हैं, तो, मैं आपकी मदद नहीं कर सकता।:(

आशा इस कुछ लोगों को मदद मिलती है।

+0

हैकिंग कोर फाइलें कभी नहीं सलाह दी जाती है, और आजकल [हैक्स के बिना समाधान प्राप्त करना] संभव है [http://stackoverflow.com/questions/7607473/how-to-create- new-post-with-photo-attached-in-wordpress-using-xmlrpc/24096046 # 24096046)। – brasofilo

2

जब आप पोस्ट, वर्डप्रेस आईएमजी टैग के लिए पोस्ट। WP छवि मिलते हैं तो वह यह है मीडिया लाइब्रेरी में लोड है पर स्कैन करेगा। यदि बहुत एक शरीर में छवि, यह स्वतः ही यह पद से जुड़ी होगी

मूल रूप से आप के लिए:।

  • पोस्ट मीडिया (छवि) पहले
  • अपना यूआरएल
  • प्राप्त करें अपनी पोस्ट के बॉडी में आईएमजी टैग के साथ छवि का यूआरएल शामिल करें।
  • फिर पोस्ट

बनाने यहां कुछ नमूना कोड है। इसे त्रुटि प्रबंधन, और कुछ और दस्तावेज की आवश्यकता है।

$admin ="***"; 
$userid ="****"; 
$xmlrpc = 'http://localhost/web/blog/xmlrpc.php'; 
include '../blog/wp-includes/class-IXR.php'; 
$client = new IXR_Client($xmlrpc); 

$author   = "test";  
$title   = "Test Posting"; 
$categories  = "chess,coolbeans"; 
$body   = "This is only a test disregard </br>"; 

$tempImagesfolder = "tempImages"; 
$img = "1338494719chessBoard.jpg"; 


$attachImage = uploadImage($tempImagesfolder,$img); 
$body .= "<img src='$attachImage' width='256' height='256' /></a>"; 

createPost($title,$body,$categories,$author); 

/* 
*/ 
function createPost($title,$body,$categories,$author){ 
    global $username, $password,$client; 
    $authorID = findAuthor($author); //lookup id of author 

    /*$categories is a list seperated by ,*/ 
    $cats = preg_split('/,/', $categories, -1, PREG_SPLIT_NO_EMPTY); 
    foreach ($cats as $key => $data){ 
     createCategory($data,"",""); 
    } 

    //$time = time(); 
    //$time += 86400; 
    $data = array(
     'title' => $title, 
     'description' => $body, 
     'dateCreated' => (new IXR_Date(time())), 
     //'dateCreated' => (new IXR_Date($time)), //publish in the future 
     'mt_allow_comments' => 0, // 1 to allow comments 
     'mt_allow_pings' => 0,// 1 to allow trackbacks 
     'categories' => $cats, 
     'wp_author_id' => $authorID  //id of the author if set  
    ); 
    $published = 0; // 0 - draft, 1 - published 
    $res = $client->query('metaWeblog.newPost', '', $username, $password, $data, $published); 
} 

/* 
*/ 
function uploadImage($tempImagesfolder,$img){ 
    global $username, $password,$client; 
    $filename = $tempImagesfolder ."/" . $img; 

    $fs = filesize($filename); 
    $file = fopen($filename, 'rb'); 
    $filedata = fread($file, $fs);  
    fclose($file); 

    $data = array(
     'name' => $img, 
     'type' => 'image/jpg', 
     'bits' => new IXR_Base64($filedata), 
     false //overwrite 
    ); 

    $res = $client->query('wp.uploadFile',1,$username, $password,$data); 
    $returnInfo = $client->getResponse(); 

    return $returnInfo['url'];  //return the url of the posted Image 
} 

/* 
*/ 
function findAuthor($author){ 
    global $username, $password,$client; 
    $client->query('wp.getAuthors ', 0, $username, $password); 
    $authors = $client->getResponse(); 
    foreach ($authors as $key => $data){ 
     // echo $authors[$key]['user_login'] . $authors[$key]['user_id'] ."</br>"; 
     if($authors[$key]['user_login'] == $author){ 
      return $authors[$key]['user_id']; 
     } 
    } 
    return "not found"; 
} 

/* 
*/ 
function createCategory($catName,$catSlug,$catDescription){ 
    global $username, $password,$client; 
    $res = $client->query('wp.newCategory', '', $username, $password, 
     array(
      'name' => $catName, 
      'slug' => $catSlug, 
      'parent_id' => 0, 
      'description' => $catDescription 
     ) 
    ); 
} 
0

वर्डप्रेस 3.5 के रूप में, newmediaobject अब अर्द्ध-मूल रूप से हैक को पहचानता है।

क्लास-wp-xmlrpc-server.php हैक करना अब आवश्यक नहीं है।

इसके बजाय, आपके xml-rpc क्लाइंट को पोस्ट_आईडी नामक चर के लिए पोस्ट नंबर भेजने की आवश्यकता है। (पहले यह केवल परिवर्तनीय 'पोस्ट' था)

आशा है कि किसी को मदद मिलेगी।

+0

हाय, तो क्या यह WordPress संपादित किए बिना XMLRPC में ऐसा करना संभव है? और यदि हाँ क्या कदम हैं? मैंने यहां एक नया प्रश्न बनाया है http://stackoverflow.com/questions/17722743/attach-image-to-post-in-wordpress-xmlrpc धन्यवाद। – simion314

1

विधि metaWeblog.newMediaObject पर कॉल करने के बाद, हमें अभिभावक को जोड़ने के लिए डेटाबेस पर छवि प्रविष्टि को संपादित करने की आवश्यकता है (metaWeblog.newPost के साथ पहले बनाई गई पोस्ट)।

अगर हम metaWeblog.editPost के साथ प्रयास करें, यह एक त्रुटि 401 है, जो इंगित करता है कि

// Use wp.editPost to edit post types other than post and page. 
if (! in_array($postdata[ 'post_type' ], array('post', 'page'))) 
    return new IXR_Error(401, __('Invalid post type')); 

समाधान wp.editPost है, जो निम्नलिखित तर्क होते हैं कॉल करने के लिए है फेंकता है:

$blog_id  = (int) $args[0]; 
$username  = $args[1]; 
$password  = $args[2]; 
$post_id  = (int) $args[3]; 
$content_struct = $args[4]; 

तो, newMediaObject के बाद, हम करते हैं:

$status = $rpc->query(
    'metaWeblog.newMediaObject', 
    $postID, 
    WP_USERNAME, 
    WP_PASSWORD, 
    $data 
); 
$response = $rpc->getResponse(); 
if(isset($response['id'])) { 
    // ATTACH IMAGE TO POST 
    $image['post_parent'] = $postID; 
    if(!$rpc->query('wp.editPost', '1', WP_USERNAME, WP_PASSWORD, $response['id'], $image)) { 
     die('An error occurred - ' . $rpc->getErrorCode() . ":" . $rpc->getErrorMessage()); 
    } 
    echo 'image: ' . $rpc->getResponse(); 

    // SET FEATURED IMAGE 
    $updatePost['custom_fields'] = array(array('key' => '_thumbnail_id', 'value' => $response['id'])); 
    if(!$rpc->query('metaWeblog.editPost', $postID, WP_USERNAME, WP_PASSWORD, $updatePost, $publishBool)) { 
     die('An error occurred - ' . $rpc->getErrorCode() . ":" . $rpc->getErrorMessage()); 
    } 
    echo 'update: ' . $rpc->getResponse(); 
} 

मैंने परीक्षण के लिए Incutio XML-RPC Library for PHP का उपयोग किया है और शेष कोड ठीक उसी प्रश्न में है।

संबंधित मुद्दे