gem Faradayを使ったWordPress記事の取得方法について

## はじめに

アプリ制作の過程で、APIを利用してWordPressの記事を取得し、RailsのDBに保存をする実装を行いました。
その際に`gem Faraday`を使用したため、ここではその実装過程で得られた気づきをまとめます。
## 本記事の内容
`gem Faraday`を使いWordPress記事を取得する方法について。

## 対象者

`gem Faraday`を使ってWordPress記事を取得する方法を知りたい方。

## REST APIを使った記事取得方法
WordPress REST APIを使用することで、簡単に記事一覧を取得できます。例えば、今回取得したいWordPressのURLの後ろに `/wp-json/wp/v2/posts` をつけてアクセスするだけで、JSON形式で記事一覧が取得可能です。これを利用して、Rails側から記事一覧を取得する手順を説明します。

## Faradayのセットアップ
まず、Gemfileに gem 'faraday' を追加し、bundle install します。次に、Faradayの接続設定を行います。
```ruby
conn = Faraday.new(url: 'https://demo.wp-api.org') do |faraday|
  faraday.request  :url_encoded
  faraday.response :logger
  faraday.adapter  Faraday.default_adapter
end
```

## 記事一覧の取得
次に、GETリクエストで記事一覧を取得し、JSONをパースして記事情報を展開します。
下記のようにURLを取得し、Json形式で返ってくるものをparseし、取得したいプロパティを指定します。
ここまでが基本的な使い方になります。
```ruby
response = conn.get '/wp-json/wp/v2/posts'
parsed_articles = JSON.parse(response.body)

parsed_articles.each do |article|
  puts article['id']
  puts article['title']
  puts article['content']
end
```
では次にRailsのDBに保存する処理についてです。

## Railsでテーブルの作成
取得してきたWordPressの記事情報を保存するためのテーブルを作成します。
`rails generate migration CreateWpArticles`

```ruby
class CreateWpArticles < ActiveRecord::Migration[6.1]
  def change
    create_table :wp_articles do |t|
      t.integer :wp_id
      t.string :title
      t.string :article_url

      t.timestamps
    end
  end
end
```
最後に、マイグレーションを実行してテーブルを作成します。
`rails db:migrate`
これで、WpArticleテーブルが作成され、wp_id, id, title, article_urlのカラムが追加されます。

## WpArticleFetcherクラスの作成
次に、WordPressの記事を取得して保存するためのWpArticleFetcherクラスを作成します。このクラスでは、Faradayを使用してAPIからデータを取得し、取得した記事をWpArticleテーブルに保存します。
以下がコードの全体像になります。
```ruby
class WpArticleFetcher
  def self.fetch_and_save

    conn = Faraday.new(url: 'https://kiryu910.jp') do |faraday|
      faraday.request  :url_encoded             # form-encode POST params
      faraday.response :logger                  # log requests to STDOUT
      faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
    end

      parsed_articles = JSON.parse(response.body)

      parsed_articles.each do |article|
        wp_article = WpArticle.find_or_initialize_by(wp_id: article['id'])
        wp_article.title = article['title']['rendered']
        wp_article.article_url = article['link']
        
        wp_article.save!
      end
  end
end
```

## コードの解説
### Faradayのセットアップ
まず、Faradayを使用してWordPressのAPIに接続する設定を行います。以下のコードでは、接続設定とレスポンスのロギング、リクエストの形式を指定しています。
```ruby
conn = Faraday.new(url: 'https://kiryu910.jp') do |faraday|
  faraday.request  :url_encoded
  faraday.response :logger
  faraday.adapter  Faraday.default_adapter
end

```
## APIから記事データの取得
次に、GETリクエストを送信して記事データを取得します。
```ruby
response = conn.get '/wp-json/wp/v2/posts'
parsed_articles = JSON.parse(response.body)
```
## データの保存
取得した記事データをWpArticleテーブルに保存します。既に存在する記事は更新し、存在しない記事は新規作成します。
```ruby
parsed_articles.each do |article|
  wp_article = WpArticle.find_or_initialize_by(wp_id: article['id'])
  wp_article.title = article['title']['rendered']
  wp_article.article_url = article['link']
  
  wp_article.save!
end

```

## 全体の流れ
やっていることとしてはかなりシンプルです。

まず、この部分でJson形式にparseをしています。
`parsed_articles = JSON.parse(response.body)`
このparseをしたものを次の行のeach文で回します。
each文の中で一つ一つの記事に対して行いたい処理をします。
```ruby
parsed_articles.each do |article|
  #この中で処理をする
end
```

以下が実際にテーブルに保存処理を行っている部分です。


```ruby
wp_article = WpArticle.find_or_initialize_by(wp_id: article['id'])
wp_article.title = article['title']['rendered']
wp_article.article_url = article['link']

wp_article.save!
```

## まとめ
`Faraday`を使用してWordPressの記事を取得し、Railsのデータベースに保存する実装を行いました。この方法を使うことで、外部のWordPressサイトから簡単に記事データを取得し、自分のアプリケーションで利用することができます。今後は、記事の更新や削除など、さらに高度な機能も実装していく予定です。