RubyからWordPressのXML-RPC MetaWeblog APIを使って取得、投稿、編集、削除する。(Rails)

RailsからWordPressのXML-RPCを使って投稿を追加、編集、削除する方法のメモ。そのうち、メディアアップロードなども掲載予定。

# initialize

```rb
 require 'xmlrpc/client'

  def initialize(args={})
    @client = XMLRPC::Client.new( 'localhost', '/XXXXXXXXXX/xmlrpc.php')

    # ユーザ情報
    @user_name = 'username'
    @password = 'password'

    # 記事コンテンツ
    @struct = {
        title: args[:title],
        categories: args[:categories],
        description: args[:content],
        dateCreated: args[:date]
    }

    # 0: 下書き投稿, 1: 即時投稿
    @publish = args[:publish]

  end

```

# 投稿、編集、削除

```rb
  # 記事を取得します。
  def get(post_id)
    post = @client.call(
        "metaWeblog.getPost",
        post_id,
        @user_name,
        @password
    )
    post
  end

  # 記事を投稿します。
  def post
    post_id = @client.call(
        "metaWeblog.newPost",
        1,
        @user_name,
        @password,
        @struct,
        @publish
    )
    post_id
  end

  # 記事を更新します。
  def update(post_id)
    @client.call(
        "metaWeblog.editPost",
        post_id,
        @user_name,
        @password,
        @struct,
        @publish
    )
  end

  # 記事を削除します。
  #第二引数に何か文字列が入ると削除が無視されます。
  def destroy(post_id)
    @client.call(
        "metaWeblog.deletePost",
        '',
        post_id,
        @user_name,
        @password,
        @publish
    )
  end

```

# 全部

```rb:wp_post.rb

# coding: utf-8

class WpPost

  require 'xmlrpc/client'

  def initialize(args={})
    @client = XMLRPC::Client.new( 'localhost', '/XXXXXXXXXX/xmlrpc.php')

    # ユーザ情報
    @user_name = 'username'
    @password = 'password'

    # 記事コンテンツ
    @struct = {
        title: args[:title],
        categories: args[:categories],
        description: args[:content],
        dateCreated: args[:date]
    }

    # 0: 下書き投稿, 1: 即時投稿
    @publish = args[:publish]

  end

 # 記事を取得します。
  def get(post_id)
    post = @client.call(
        "metaWeblog.getPost",
        post_id,
        @user_name,
        @password
    )
    post
  end

  # 記事を投稿します。
  def post
    post_id = @client.call(
        "metaWeblog.newPost",
        1,
        @user_name,
        @password,
        @struct,
        @publish
    )
    post_id
  end

  # 記事を更新します。
  def update(post_id)
    @client.call(
        "metaWeblog.editPost",
        post_id,
        @user_name,
        @password,
        @struct,
        @publish
    )
  end

  # 記事を削除します。
  # 第二引数に何か文字列が入ると削除が無視されます。
  def destroy(post_id)
    @client.call(
        "metaWeblog.deletePost",
        '',
        post_id,
        @user_name,
        @password,
        @publish
    )
  end

end
```

# 利用

```rb
# @post.categoriesはきっと関連テーブルになってると思うので事前にcategory名だけを配列にしておきます。
post_args = {
        title: @post.title
        categories: post_categories,
        content: @post.content,
        date: @post.created_at,
        publish: 1
    }
@wp_xmlrpc = WpPost.new(post_args)

```
```rb
# 取得
post = @wp_xmlrpc.get(post_id)
```

```rb
# 投稿
post_id = @wp_xmlrpc.get
```

```rb
# 更新
@wp_xmlrpc.update(post_id)
```

```rb
# 削除
@wp_xmlrpc.destroy(post_id)

```

こんな感じでしょうか。とりあえずちょっと使ってみてメモです。もうちょっといい感じにできるやり方とかあったら更新していく予定です。

# その後の更新

MetaWeblog APIだとカスタム投稿タイプや細かいところまでできないのでXML-RPC WordPress APIのがいいです。rubypressってgemで簡単にできます。


# ソースだけ載せときます。

```rb
require 'rubypress'

  def initialize(args={})

    @username = ''
    @password = ''

    # 環境
    @wp_client = Rubypress::Client.new(
        host: '',
        path: '/xmlrpc.php',
        port: 80,
        username: @username,
        password: @password
    )

    @date = args[:date]

    # 記事コンテンツ
    @content = {
        post_status: args[:publish],
        post_title: args[:title],
        post_content: args[:content],
        post_type: args[:post_type]
    }

  end

  # 記事を取得します。
  def get(post_id)
    post = @wp_client.getPost(
        blog_id: 1,
        username: @username,
        password: @password,
        post_id: post_id
    )
    post
  end

  # 記事を更新します。
  def update(post_id)
    @wp_client.editPost(
        blog_id: 1,
        username: @username,
        password: @password,
        post_id: post_id,
        content: @content
    )
  end

  # 記事を投稿します。
  def post
    post_id = @wp_client.newPost(
        blog_id: 1,
        username: @username,
        password: @password,
        post_date: @date,
        content: @content
    )
    post_id
  end

  # 記事を削除します。
  def destroy(post_id)
    @wp_client.deletePost(
        blog_id: 1,
        username: @username,
        password: @password,
        post_id: post_id
    )
  end
```