XML-RPCを利用したWordPressの記事登録

tweetAngelで先日実装したので、それについてのちょっとした説明です。

・・・えっと。やりかたについては以下のサイトに載ってるとおりです!

更新して、そのpermanent linkを取得する処理を行います。
注意したいところは、引数はすべて XML_RPC_Value クラスを経由して与えること。

クラスを作って、1つのインスタンスで一連の処理が出来るようにしました。

require_once("XML/RPC.php");

class BlogPost {
  private $cm_client   ;
  private $cm_appkey   ;
  private $cm_username ;
  private $cm_passwd   ;

  private $cm_blogid   ;

  public  $cm_resmes   ;

  function __construct ( $ca_host , $ca_path , $ca_appkey , $ca_user , $ca_pass ) {
    $this->cm_client   = new XML_RPC_client( $ca_path , $ca_host , 80);        ;
    $this->cm_appkey   = new XML_RPC_Value( $ca_appkey , 'string');
    $this->cm_username = new XML_RPC_Value( $ca_user, 'string' );
    $this->cm_passwd   = new XML_RPC_Value( $ca_pass, 'string' );
  }

  function getUserBlogs() {

    $cl_message = new XML_RPC_Message( 'blogger.getUsersBlogs' ,
                                       array($this->cm_appkey  ,
                                             $this->cm_username,
                                             $this->cm_passwd  )  );
    $cl_result = $this->cm_client->send($cl_message);
    if( !$cl_result ){
      $this->cm_resmes = 'Could not connect to the server.' ;
      return FALSE ;
    }else if( $cl_result->faultCode() ){
      $this->cm_resmes = $cl_result->faultString() ;
      return FALSE ;
    }
    $cl_blogs = XML_RPC_decode($cl_result->value());
    $cl_blogid = $cl_blogs[0]["blogid"] ;
    $this->cm_blogid = new XML_RPC_Value( $cl_blogid , "string");
    return $cl_blogid ;
  }

  function newPost( $ca_title , $ca_body , $ca_catname ) {
    if ( $ca_catname !== null ) {
      $cl_categories = array( new XML_RPC_Value( $ca_catname , "string") ) ;
    } else {
      $cl_categories = array( ) ;
    }
    $cl_content = new XML_RPC_Value( array(
       'title'       => new XML_RPC_Value( $ca_title, 'string' )          ,
       'categories'  => new XML_RPC_Value( $cl_categories, 'array' )      ,
       'description' => new XML_RPC_Value( $ca_body, 'string')            ,
       /* 'dateCreated' => new XML_RPC_Value( time(), 'dateTime.iso8601')  */ ) , 'struct');
    $cl_publish = new XML_RPC_Value(1, "boolean");
    $cl_message = new XML_RPC_Message( 'metaWeblog.newPost',
        array( $this->cm_blogid   ,
               $this->cm_username ,
               $this->cm_passwd   ,
               $cl_content        ,
               $cl_publish        ) );
    $cl_result = $this->cm_client->send($cl_message);
    if( !$cl_result ){
      $this->cm_resmes = 'Could not connect to the server.' ;
      return FALSE ;
    } else if( $cl_result->faultCode() ){
      $this->cm_resmes =$result->faultString();
      return FALSE ;
    }
    $cl_post_id = XML_RPC_decode($cl_result->value());
    return $cl_post_id ;
  }

  function getBlogPost( $ca_post_id ) {

    $cl_message = new XML_RPC_Message( 'metaWeblog.getPost ' ,
                                       array(new XML_RPC_Value( $ca_post_id  , "string" ) ,
                                             $this->cm_username,
                                             $this->cm_passwd  )  );
    $cl_result = $this->cm_client->send($cl_message);
    if( !$cl_result ){
      $this->cm_resmes = 'Could not connect to the server.' ;
      return FALSE ;
    }else if( $cl_result->faultCode() ){
      $this->cm_resmes = $cl_result->faultString() ;
      return FALSE ;
    }
    $cl_post = XML_RPC_decode($cl_result->value());
    $cl_blog_url = $cl_post["permaLink"] ;
    return $cl_blog_url ;
  }
}

呼び出すほうはこんなかんじ。

  mb_ereg( "http://([^/]+)/(.*)$" , $xmlrpc_url , $da_getpm ) ;
  $cbp = new BlogPost( $da_getpm[1]             ,
                       "/" . $da_getpm[2]       ,
                       ""                       ,
                       $xmlrpc_user ,
                       $xmlrpc_pass ) ;
  if ( $cbp->getUserBlogs() === FALSE ) {
    $errmsg = "ブログ情報が取得できませんでした。" ;
  } else {
    $retdata = $cbp->newPost( $_POST['blogtitle'] ,
                              $_POST['outdata']   ,
                              ( $blog_catname == "" ?
                                null : $blog_catname ) ) ;
  }

  if ( $retdata === FALSE ) {
    if ( !isset( $errmsg ) ) $errmsg = $cbp->cm_resmes ;
  } else {
    $blogurl = $cbp->getBlogPost( $retdata ) ;

もう1つ。
気をつけなければいけないのは、dateCreatedを指定したときに「9時間進んでしまう」ということ。
どっかでTimeZone設定がおかしくなってる(または忘れてる)可能性が大きいですね・・・。
特に指定する意味もないので(省略したらその時点での日時が反映されるため)、指定するのをやめました。

Comments are closed.