WordPressのREST APIを使ってPythonから自動投稿【コード解説】

ブログ

ここまで3回の記事で、WordPressのREST APIを使って、投稿や画像アップロードを行うコードを作成しました。

それなりに大きなクラスになったので、改めて整理をして、コードの中身を解説していきます。

このクラスを使うことで、画像入りのブログ記事原稿を投稿する方法は以下になります。

全体のコード

まずは、全体のコードを確認します。

import requests
from datetime import datetime


class WordPressClient:
    def __init__(self, wp_url, auth_method, auth_info):
        """
        WordPress APIクライアントの初期化
        :param wp_url: WordPressサイトのURL
        :param auth_method: 認証方法 ("application_password", "jwt", "oauth1")
        :param auth_info: 認証情報の辞書
        """
        self.wp_url = wp_url
        self.auth_method = auth_method
        self.auth_info = auth_info
        self.headers = {}
        self.media_cache = {}
        self.category_cache = {}
        self.tag_cache = {}

        # 認証設定
        self.set_auth()

        self.update_category_cache()
        self.update_tag_cache()

    def set_auth(self):
        """ 認証設定を行う """
        if self.auth_method == "application_password":
            username = self.auth_info.get("username")
            password = self.auth_info.get("password")
            self.headers["Authorization"] = f"Basic {requests.auth._basic_auth_str(username, password)}"

        elif self.auth_method == "jwt":
            token = self.auth_info.get("token")
            self.headers["Authorization"] = f"Bearer {token}"

        elif self.auth_method == "oauth1":
            from requests_oauthlib import OAuth1
            consumer_key = self.auth_info.get("consumer_key")
            consumer_secret = self.auth_info.get("consumer_secret")
            token_key = self.auth_info.get("token_key")
            token_secret = self.auth_info.get("token_secret")
            self.auth = OAuth1(consumer_key, consumer_secret, token_key, token_secret)
        else:
            raise ValueError("Unsupported authentication method")

    def request(self, method, endpoint, data=None, files=None):
        """
        WordPress APIへのリクエストを行う
        :param method: HTTPメソッド (GET, POST, etc.)
        :param endpoint: APIエンドポイント
        :param data: リクエストデータ
        :param files: ファイルデータ(画像アップロード用)
        :return: レスポンスオブジェクト
        """
        url = f"{self.wp_url}/wp-json/wp/v2/{endpoint}"

        if self.auth_method == "oauth1":
            response = requests.request(method, url, auth=self.auth, json=data, files=files)
        else:
            response = requests.request(method, url, headers=self.headers, json=data, files=files)

        if not response.ok:
            raise Exception(f"Error: {response.status_code} - {response.text}")

        return response.json()

    def create_or_update(self, post_type, item_id=None, **kwargs):
        """
        WordPressに投稿またはページを作成または更新する
        :param post_type: 'posts' または 'pages' など、作成または更新するアイテムの種類
        :param item_id: 更新するアイテムのID(新規作成の場合はNone)
        :param kwargs: アイテムのデータ(タイトル、コンテンツ、ステータス、親ページIDなど)
        :return: アイテムID
        """
        # アイテムデータ
        item_data = {key: value for key, value in kwargs.items() if value is not None}

        # date および date_gmt の変換
        if 'date' in kwargs and isinstance(kwargs['date'], datetime):
            item_data['date'] = self.format_date_for_wp(kwargs['date'])
        if 'date_gmt' in kwargs and isinstance(kwargs['date_gmt'], datetime):
            item_data['date_gmt'] = self.format_date_for_wp(kwargs['date_gmt'])

        # カテゴリーとタグをIDに変換
        if 'categories' in kwargs:
            item_data['categories'] = [self.get_or_create_category_id(cat_name.strip()) for cat_name in kwargs['categories'] if cat_name.strip() != '']

        if 'tags' in kwargs:
            item_data['tags'] = [self.get_or_create_tag_id(cat_name.strip()) for cat_name in kwargs['tags'] if cat_name.strip() != '']

        if item_id:
            # アイテムの更新
            endpoint = f"{post_type}/{item_id}"
            method = "PUT"  # 更新にはPUTメソッドを使用
        else:
            # 新規アイテムの作成
            endpoint = post_type
            method = "POST"

        # アイテムを作成または更新するリクエスト
        response = self.request(method, endpoint, data=item_data)
        return response.get('id')


    def create_post(self, post_id=None, **kwargs):
        """
        WordPressに投稿を作成または更新する
        :param post_id: 更新する投稿のID(新規作成の場合はNone)
        :param kwargs: 投稿のデータ(タイトル、コンテンツ、ステータス、カテゴリーなど)
        :return: 投稿ID
            title: 投稿のタイトル(string)
            content: 投稿の内容(string)
            excerpt: 投稿の抜粋(string)
            status: 投稿のステータス(string; 例: publish, draft, pendingなど)
            author: 投稿の著者ID(integer)
            comment_status: コメントの状態(string; 例: open, closed)
            ping_status: ピンバックの状態(string; 例: open, closed)
            format: 投稿のフォーマット(string; 例: standard, aside, galleryなど)
            slug: 投稿のスラッグ(string)
            date: 投稿の公開日時(string; ISO8601形式, datetime型は自動変換)
            date_gmt: 投稿の公開日時(GMT; string; ISO8601形式, datetime型は自動変換)
            modified: 投稿の最終更新日時(string; ISO8601形式)
            modified_gmt: 投稿の最終更新日時(GMT; string; ISO8601形式)
            categories: 投稿に関連付けられたカテゴリIDの配列(array of integer)
            tags: 投稿に関連付けられたタグIDの配列(array of integer)
            featured_media: アイキャッチ画像のメディアID(integer)
        """
        return self.create_or_update("posts", post_id, **kwargs)

    def create_page(self, page_id=None, **kwargs):
        """
        WordPressにページを作成または更新する
        :param page_id: 更新するページのID(新規作成の場合はNone)
        :param kwargs: ページのデータ(タイトル、コンテンツ、ステータス、親ページIDなど)
        :return: ページID
        """
        return self.create_or_update("pages", page_id, **kwargs)

    def get_media_ids(self):
        """
        すべてのメディアのファイル名とIDを格納する辞書を取得する
        :return: メディアファイル名とIDの辞書
        """
        endpoint = "media"
        media_cache = {}
        page = 1
        per_page = 100  # 一度に取得するアイテムの数(必要に応じて調整)

        while True:
            response = self.request("GET", endpoint, data={'per_page': per_page, 'page': page})
            if not response:
                break

            for item in response:
                media_id = item.get('id')
                media_file = item.get('media_details', {}).get('file', '')
                media_cache[media_file] = media_id

            if len(response) < per_page:
                break

            page += 1

        self.media_cache = media_cache
        return media_cache

    def get_media_by_name(self, image_name):
        """
        指定した画像名で画像を検索し、存在する場合はその情報を返す
        :param image_name: 画像のファイル名(拡張子を含む)
        :return: 画像の情報(存在しない場合はNone)
        """
        if self.media_cache=={}:
            self.get_media_ids()

        # メディアキャッシュから画像名でメディアIDを取得
        media_id = self.media_cache.get(image_name)

        return media_id


    def get_media_by_id(self, media_id):
        """
        指定したメディアIDでメディアの情報を取得する
        :param media_id: メディアアイテムのID
        :return: メディアアイテムの情報(存在しない場合はNone)
        """
        endpoint = f"media/{media_id}"

        try:
            response = self.request("GET", endpoint)
            return response
        except Exception as e:
            print(f"Error retrieving media with ID {media_id}: {e}")
            return None



    def delete_image(self, image_id):
        """
        画像を削除する(強制的に削除するためのパラメータを追加)
        :param image_id: 削除する画像のID
        """
        endpoint = f"media/{image_id}?force=true"
        self.request("DELETE", endpoint)
        print(f"Image with ID {image_id} has been deleted.")


    def upload_image(self, image_path,overwrite=False, **kwargs):
        """
        画像をアップロードする
        :param image_path: アップロードする画像のパス
        :param kwargs: 追加の画像データ(タイトル、説明など)
        :return: アップロードされた画像のID
        """
        # 画像ファイル名
        image_name = image_path.split('/')[-1]
        if overwrite:


            # 画像の重複確認
            existing_image = self.get_media_by_name(image_name)

            if existing_image:
                # 既存の画像が見つかった場合、その画像を削除
                self.delete_image(existing_image)

        # 画像のアップロード
        with open(image_path, 'rb') as img_file:
            files = {
                'file': (image_name, img_file, 'image/jpeg')  # 画像のMIMEタイプは適宜変更
            }
            image_data = {key: value for key, value in kwargs.items() if value is not None}
            response = self.request("POST", "media", files=files, data=image_data)
        media_id = response.get('id')

        self.media_cache[image_name] = media_id
        return media_id

    def upload_image_type(self, image_path, upload_type=1,overwrite=False, **kwargs):
        """
        画像をアップロードする
        :param image_path: アップロードする画像のパス
        :param upload_type: アップロードの方法を指定 0はmedia_id取得のみ、1は存在しない場合のみupload、2は上書き,3は新規アップロード
        :param kwargs: 追加の画像データ(タイトル、説明など)
        :return: アップロードされた画像のID
        """
        image_name = image_path.split('/')[-1]
        if upload_type == 0:
            media_id = self.get_media_by_name(image_name)
        elif upload_type == 1:
            media_id = self.get_media_by_name(image_name)
            if media_id is None:
                media_id = self.upload_image(image_path, **kwargs)
        elif upload_type == 2:
            media_id = self.upload_image(image_path, overwrite=True, **kwargs)
        elif upload_type == 3:
            media_id = self.upload_image(image_path, **kwargs)
        else:
            raise ValueError("Unsupported upload type")

        return media_id

    def update_category_cache(self):
        """ カテゴリーのキャッシュを更新する """
        categories = self.get_categories()
        self.category_cache = {category['name']: category['id'] for category in categories}


    def get_categories(self):
        """
        すべてのカテゴリーを取得する
        :return: カテゴリーのリスト
        """
        endpoint = "categories"
        categories = []
        page = 1
        per_page = 100  # 一度に取得するアイテムの数(必要に応じて調整)

        while True:
            response = self.request("GET", endpoint, data={'per_page': per_page, 'page': page})
            if not response:
                break

            categories.extend(response)

            if len(response) < per_page:
                break

            page += 1

        return categories

    def create_category(self, name, **kwargs):
        """
        新しいカテゴリーを作成する
        :param name: カテゴリーの名前
        :param kwargs: カテゴリーのその他のデータ(スラッグなど)
        :return: カテゴリーのID
        """
        endpoint = "categories"
        category_data = {
            'name': name,
            **kwargs
        }
        response = self.request("POST", endpoint, data=category_data)
        category_id = response.get('id')
        self.category_cache[name] = category_id
        return category_id

    def get_or_create_category_id(self, name, **kwargs):
        """
        カテゴリー名を指定して、そのIDを取得する。存在しない場合は新規作成する
        :param name: カテゴリーの名前
        :param kwargs: カテゴリーのその他のデータ(スラッグなど)
        :return: カテゴリーのID
        """
        # キャッシュをチェック
        if name in self.category_cache:
            return self.category_cache[name]

        # カテゴリーが存在しない場合、新規作成
        return self.create_category(name, **kwargs)

    def update_tag_cache(self):
        """ タグのキャッシュを更新する """
        tags = self.get_tags()
        self.tag_cache = {tag['name']: tag['id'] for tag in tags}

    def get_tags(self):
        """
        すべてのタグを取得する
        :return: タグのリスト
        """
        endpoint = "tags"
        tags = []
        page = 1
        per_page = 100  # 一度に取得するアイテムの数(必要に応じて調整)

        while True:
            response = self.request("GET", endpoint, data={'per_page': per_page, 'page': page})
            if not response:
                break

            tags.extend(response)

            if len(response) < per_page:
                break

            page += 1

        return tags

    def create_tag(self, name, **kwargs):
        """
        新しいタグを作成する
        :param name: タグの名前
        :param kwargs: タグのその他のデータ(スラッグなど)
        :return: タグのID
        """
        endpoint = "tags"
        tag_data = {
            'name': name,
            **kwargs
        }
        response = self.request("POST", endpoint, data=tag_data)
        tag_id = response.get('id')
        self.tag_cache[name] = tag_id
        return tag_id

    def get_or_create_tag_id(self, name, **kwargs):
        """
        タグ名を指定して、そのIDを取得する。存在しない場合は新規作成する
        :param name: タグの名前
        :param kwargs: タグのその他のデータ(スラッグなど)
        :return: タグのID
        """
        # キャッシュをチェック
        if name in self.tag_cache:
            return self.tag_cache[name]

        # タグが存在しない場合、新規作成
        return self.create_tag(name, **kwargs)

    @staticmethod
    def format_date_for_wp(dt):
        """ISO 8601形式の文字列に変換する関数"""
        return dt.isoformat()

クラスの初期化 (__init__ メソッド)

まず、WordPressClient クラスの初期化部分から説明します。このクラスは、WordPressのREST APIに対してリクエストを送信し、投稿やページの作成、更新、削除などの操作を行うためのクライアントです。

__init__ メソッド

def __init__(self, wp_url, auth_method, auth_info):
    """
    WordPress APIクライアントの初期化
    :param wp_url: WordPressサイトのURL
    :param auth_method: 認証方法 ("application_password", "jwt", "oauth1")
    :param auth_info: 認証情報の辞書
    """
    self.wp_url = wp_url
    self.auth_method = auth_method
    self.auth_info = auth_info
    self.headers = {}
    self.media_cache = {}
    self.category_cache = {}
    self.tag_cache = {}

    # 認証設定
    self.set_auth()

    self.update_category_cache()
    self.update_tag_cache()

初期化パラメータ

  1. wp_url: WordPressサイトのURL。クライアントがAPIリクエストを送信する対象のサイトのURLです。

  2. auth_method: 認証方法。WordPress REST APIを利用するためには認証が必要です。auth_methodは、認証の種類を指定します。このクラスでは3つの認証方法に対応しています。
    "application_password": WordPressのアプリケーションパスワードによる認証
    "jwt": JSON Web Token (JWT) による認証
    "oauth1": OAuth 1.0 による認証

  3. auth_info: 認証情報の辞書。この辞書には、各認証方法に必要な情報(ユーザー名とパスワード、トークン、OAuthクレデンシャルなど)が含まれています。

インスタンス変数

  • self.headers: リクエストに使用するHTTPヘッダーを保持します。
  • self.media_cache: メディアのキャッシュ(ファイル名とIDのマッピング)を保持します。
  • self.category_cache: カテゴリーのキャッシュ(カテゴリー名とIDのマッピング)を保持します。
  • self.tag_cache: タグのキャッシュ(タグ名とIDのマッピング)を保持します。

メソッド呼び出し

  • self.set_auth(): 認証設定を行うメソッドを呼び出します。詳細は後述します。
  • self.update_category_cache(): カテゴリーのキャッシュを更新します。
  • self.update_tag_cache(): タグのキャッシュを更新します。

認証設定 (set_auth メソッド)

次に、set_auth メソッドについて解説します。このメソッドは、APIリクエストで使用する認証情報を設定する役割を担っています。

def set_auth(self):
    """ 認証設定を行う """
    if self.auth_method == "application_password":
        username = self.auth_info.get("username")
        password = self.auth_info.get("password")
        self.headers["Authorization"] = f"Basic {requests.auth._basic_auth_str(username, password)}"

    elif self.auth_method == "jwt":
        token = self.auth_info.get("token")
        self.headers["Authorization"] = f"Bearer {token}"

    elif self.auth_method == "oauth1":
        from requests_oauthlib import OAuth1
        consumer_key = self.auth_info.get("consumer_key")
        consumer_secret = self.auth_info.get("consumer_secret")
        token_key = self.auth_info.get("token_key")
        token_secret = self.auth_info.get("token_secret")
        self.auth = OAuth1(consumer_key, consumer_secret, token_key, token_secret)
    else:
        raise ValueError("Unsupported authentication method")

認証方法ごとの設定

  1. Application Password 認証 (application_password):
    – ユーザー名とパスワードを使用してBasic認証を行います。
    requests モジュールの requests.auth._basic_auth_str メソッドを使用して、Base64エンコードされた認証ヘッダーを生成し、self.headers に設定します。

  2. JWT認証 (jwt):
    – トークンを使用して認証を行います。
    – トークンは Authorization ヘッダーの値として Bearer スキームで送信されます。self.headers に設定します。

  3. OAuth1認証 (oauth1):
    – OAuth 1.0を使用して認証を行います。
    requests_oauthlib ライブラリの OAuth1 クラスを使用して認証オブジェクト (self.auth) を作成します。このオブジェクトはリクエストごとに auth パラメータとして渡されます。

  4. 未サポートの認証方法:
    – 指定された auth_method がサポートされていない場合、ValueError を発生させます。

request メソッド

WordPressClient クラスの request メソッドは、WordPress REST APIに対してHTTPリクエストを送信し、そのレスポンスを処理するための重要なメソッドです。このメソッドを使って、WordPressサイトに対してデータの取得(GET)、作成(POST)、更新(PUT)、削除(DELETE)など、さまざまな操作を行います。

以下に request メソッドのコードを示します。

def request(self, method, endpoint, data=None, files=None):
    """
    WordPress APIへのリクエストを行う
    :param method: HTTPメソッド (GET, POST, etc.)
    :param endpoint: APIエンドポイント
    :param data: リクエストデータ
    :param files: ファイルデータ(画像アップロード用)
    :return: レスポンスオブジェクト
    """
    url = f"{self.wp_url}/wp-json/wp/v2/{endpoint}"

    if self.auth_method == "oauth1":
        response = requests.request(method, url, auth=self.auth, json=data, files=files)
    else:
        response = requests.request(method, url, headers=self.headers, json=data, files=files)

    if not response.ok:
        raise Exception(f"Error: {response.status_code} - {response.text}")

    return response.json()

パラメータ

  • method: 使用するHTTPメソッドを指定します。例えば、データの取得には GET、新規作成には POST、更新には PUT、削除には DELETE を使用します。

  • endpoint: APIエンドポイントのパスを指定します。WordPressのREST APIでは、さまざまなエンドポイント(例: posts, pages, media, categories など)があります。例えば、投稿を取得する場合は posts、新しいページを作成する場合は pages と指定します。

  • data: APIに送信するJSON形式のデータを指定します。POSTやPUTメソッドで使います。例えば、投稿を作成する場合には、{"title": "新しい投稿", "content": "投稿の内容"} などのデータを送信します。

  • files: ファイルをアップロードする場合に使用されるファイルデータです。画像やその他のメディアをアップロードする際に指定します。

処理の流れ

  1. URLの生成:
    url 変数に、WordPressのREST APIのエンドポイントを組み合わせて、完全なURLを生成します。
    – 例: https://example.com/wp-json/wp/v2/posts

  2. 認証方法によるリクエストの分岐:
    – OAuth1 認証を使用する場合は、auth パラメータに self.authOAuth1 オブジェクト)を設定してリクエストを送信します。
    – それ以外の認証(Basic認証やJWT認証)を使用する場合は、headers パラメータに self.headers(認証ヘッダーを含む辞書)を設定してリクエストを送信します。

  3. リクエストの送信:
    requests ライブラリの requests.request() メソッドを使用して、指定したHTTPメソッドとエンドポイントに基づきリクエストを送信します。
    json=data で送信するデータをJSON形式で指定し、files=files でファイルデータを指定できます。

  4. エラーチェック:
    – レスポンスの ok プロパティが False の場合(すなわち、HTTPステータスコードが2xxでない場合)、例外を発生させてエラーメッセージを表示します。これにより、エラーが発生した場合にすぐに気づき、デバッグしやすくなります。

  5. レスポンスの返却:
    – レスポンスのJSONデータをPythonの辞書型として返します。このため、呼び出し元のメソッドでレスポンスの内容を簡単に処理できます。

使用例

以下は、request メソッドを使用して投稿の一覧を取得する例です。

# WordPressクライアントのインスタンスを作成
client = WordPressClient(wp_url="https://example.com", auth_method="application_password", auth_info={"username": "user", "password": "pass"})

# 投稿を取得する
response = client.request("GET", "posts")
print(response)

この例では、"GET" メソッドを使用して、"posts" エンドポイントから投稿の一覧を取得します。取得したレスポンスはPythonの辞書型で返されるため、print(response) で内容を表示できます。

投稿関連のメソッド

WordPressClient クラスの create_or_updatecreate_post、および create_page メソッドは、WordPress REST APIを使用して投稿やページの作成および更新を行うための重要なメソッドです。これらのメソッドを使うことで、WordPressサイトに対してプログラムから投稿やページの管理を行うことができます。

create_or_update メソッド

create_or_update メソッドは、WordPressに投稿やページを新規作成するか、既存の投稿やページを更新するための汎用的なメソッドです。

def create_or_update(self, post_type, item_id=None, **kwargs):
    """
    WordPressに投稿またはページを作成または更新する
    :param post_type: 'posts' または 'pages' など、作成または更新するアイテムの種類
    :param item_id: 更新するアイテムのID(新規作成の場合はNone)
    :param kwargs: アイテムのデータ(タイトル、コンテンツ、ステータス、親ページIDなど)
    :return: アイテムID
    """
    # アイテムデータ
    item_data = {key: value for key, value in kwargs.items() if value is not None}

    # date および date_gmt の変換
    if 'date' in kwargs and isinstance(kwargs['date'], datetime):
        item_data['date'] = self.format_date_for_wp(kwargs['date'])
    if 'date_gmt' in kwargs and isinstance(kwargs['date_gmt'], datetime):
        item_data['date_gmt'] = self.format_date_for_wp(kwargs['date_gmt'])

    # カテゴリーとタグをIDに変換
    if 'categories' in kwargs:
        item_data['categories'] = [self.get_or_create_category_id(cat_name.strip()) for cat_name in kwargs['categories'] if cat_name.strip() != '']

    if 'tags' in kwargs:
        item_data['tags'] = [self.get_or_create_tag_id(cat_name.strip()) for cat_name in kwargs['tags'] if cat_name.strip() != '']

    if item_id:
        # アイテムの更新
        endpoint = f"{post_type}/{item_id}"
        method = "PUT"  # 更新にはPUTメソッドを使用
    else:
        # 新規アイテムの作成
        endpoint = post_type
        method = "POST"

    # アイテムを作成または更新するリクエスト
    response = self.request(method, endpoint, data=item_data)
    return response.get('id')

パラメータ

  • post_type: 作成または更新するアイテムの種類を指定します。たとえば、"posts"(投稿)や "pages"(ページ)などを指定します。

  • item_id: 更新する場合のアイテムIDを指定します。新規作成の場合は None を指定します。

  • kwargs: 投稿やページの詳細情報を指定するためのキーワード引数です。たとえば、titlecontentstatuscategoriestags などを指定します。

処理の流れ

  1. データの準備:
    kwargs から値が None でないキーと値のペアを取り出して、item_data 辞書を作成します。

  2. 日時のフォーマット:
    datedate_gmt キーが datetime 型で渡されている場合、WordPressで必要なISO 8601形式に変換します。

  3. カテゴリーとタグの変換:
    categoriestags のデータが指定されている場合、それらの名前を対応するIDに変換します。get_or_create_category_idget_or_create_tag_id メソッドを使ってカテゴリやタグが存在しない場合は新しく作成します。

  4. HTTPメソッドとエンドポイントの決定:
    – 更新(PUT)または新規作成(POST)に応じて、適切なHTTPメソッドとエンドポイントを設定します。

  5. APIリクエストの実行:
    request メソッドを呼び出して、APIリクエストを送信します。

  6. レスポンスの処理:
    – APIレスポンスから作成または更新されたアイテムのIDを取得し、返します。

create_post メソッド

create_post メソッドは、WordPressに投稿を作成または更新するためのメソッドです。create_or_update メソッドを内部で呼び出します。

def create_post(self, post_id=None, **kwargs):
    """
    WordPressに投稿を作成または更新する
    :param post_id: 更新する投稿のID(新規作成の場合はNone)
    :param kwargs: 投稿のデータ(タイトル、コンテンツ、ステータス、カテゴリーなど)
    :return: 投稿ID
    """
    return self.create_or_update("posts", post_id, **kwargs)

パラメータ

  • post_id: 更新する投稿のIDを指定します。新規作成の場合は None を指定します。

  • kwargs: 投稿に関する詳細なデータをキーワード引数で指定します。例として、titlecontentstatuscategoriestags などがあります。

処理の流れ

  • create_or_update メソッドに "posts"post_type として渡し、その他の引数をそのまま渡します。このメソッドの役割は、投稿の作成や更新を簡単に行えるようにすることです。

使用例

# 投稿を新規作成
post_id = client.create_post(title="新しい投稿", content="これは新しい投稿の内容です", status="publish")
print(f"新しい投稿が作成されました。ID: {post_id}")

create_page メソッド

create_page メソッドも create_or_update を内部で使用して、WordPressにページを作成または更新するメソッドです。

def create_page(self, page_id=None, **kwargs):
    """
    WordPressにページを作成または更新する
    :param page_id: 更新するページのID(新規作成の場合はNone)
    :param kwargs: ページのデータ(タイトル、コンテンツ、ステータス、親ページIDなど)
    :return: ページID
    """
    return self.create_or_update("pages", page_id, **kwargs)

パラメータ

  • page_id: 更新するページのIDを指定します。新規作成の場合は None を指定します。

  • kwargs: ページに関する詳細なデータをキーワード引数で指定します。例として、titlecontentstatusparent(親ページのID)などがあります。

処理の流れ

  • create_or_update メソッドに "pages"post_type として渡し、その他の引数をそのまま渡します。これにより、ページの作成や更新が簡単に行えるようになります。

使用例

# ページを新規作成
page_id = client.create_page(title="新しいページ", content="これは新しいページの内容です", status="publish")
print(f"新しいページが作成されました。ID: {page_id}")

メディア関連のメソッド

get_media_idsget_media_by_name、および get_media_by_id メソッドは、WordPressサイトにあるメディア(画像、ビデオ、音声、ファイルなど)を取得および検索するためのメソッドです。
これらのメソッドを使うことで、メディアアイテムのIDを取得したり、特定の条件に合うメディアを検索したりできます。

upload_imagedelete_image メソッドは、WordPressサイトに対する画像のアップロードや削除するためのメソッドです。これらを利用することで、WordPressのメディアライブラリを簡単に管理することができます。

get_media_ids メソッド

get_media_ids メソッドは、WordPressサイト内のメディアアイテムを検索し、そのメディアのIDをリストとして返すメソッドです。

def get_media_ids(self, **kwargs):
    """
    指定した条件に一致するすべてのメディアIDを取得します
    :param kwargs: 検索条件(例:'search', 'media_type', 'mime_type'など)
    :return: メディアIDのリスト
    """
    media = self.request("GET", "media", params=kwargs)
    return [m.get('id') for m in media]

パラメータ

  • kwargs: 検索条件を指定するためのキーワード引数。例として、search(メディア名やタイトル)、media_type(画像、ビデオなど)、mime_typeimage/jpeg などのMIMEタイプ)などがあります。

処理の流れ

  1. APIリクエストの送信:
    self.request メソッドを使って、GET リクエストを media エンドポイントに送信します。paramskwargs を渡して、特定の条件に一致するメディアアイテムを取得します。

  2. メディアIDの抽出:
    – レスポンスとして取得したメディアアイテムから、各メディアの id を取り出し、リストとして返します。

使用例

# "image/jpeg" タイプのすべてのメディアIDを取得
media_ids = client.get_media_ids(mime_type='image/jpeg')
print(media_ids)

get_media_by_name メソッド

get_media_by_name メソッドは、指定した名前またはタイトルに一致するメディアアイテムを取得するためのメソッドです。

def get_media_by_name(self, name, **kwargs):
    """
    指定した名前に一致するメディアアイテムを取得します
    :param name: メディア名またはタイトル
    :param kwargs: その他の検索条件
    :return: メディアオブジェクトのリスト
    """
    params = {"search": name, **kwargs}
    media = self.request("GET", "media", params=params)
    return media

パラメータ

  • name: メディアの名前またはタイトルを指定します。
  • kwargs: 他の検索条件を追加するためのキーワード引数。

処理の流れ

  1. 検索パラメータの準備:
    name パラメータを search キーに設定し、その他の条件を params 辞書に追加します。

  2. APIリクエストの送信:
    self.request メソッドを使って、GET リクエストを media エンドポイントに送信し、指定した名前に一致するメディアアイテムを取得します。

  3. メディアアイテムの返却:
    – レスポンスとして取得したメディアアイテムのリストを返します。

使用例

# タイトルに "example" を含むメディアを検索
media_items = client.get_media_by_name("example")
print(media_items)

get_media_by_id メソッド

get_media_by_id メソッドは、指定したIDのメディアアイテムを取得するためのメソッドです。

def get_media_by_id(self, media_id):
    """
    指定したIDのメディアアイテムを取得します
    :param media_id: メディアのID
    :return: メディアオブジェクト
    """
    media = self.request("GET", f"media/{media_id}")
    return media

パラメータ

  • media_id: 取得したいメディアアイテムのIDを指定します。

処理の流れ

  1. APIリクエストの送信:
    self.request メソッドを使って、GET リクエストを media/{media_id} エンドポイントに送信します。media_id は取得したいメディアアイテムのIDです。

  2. メディアアイテムの返却:
    – レスポンスとして取得したメディアオブジェクトを返します。

使用例

# IDが123のメディアアイテムを取得
media_item = client.get_media_by_id(123)
print(media_item)

upload_image メソッド

upload_image メソッドは、WordPressのメディアライブラリに画像をアップロードするためのメソッドです。

def upload_image(self, image_path):
    """
    指定したパスの画像をWordPressにアップロードします
    :param image_path: 画像ファイルのパス
    :return: アップロードされたメディアオブジェクト
    """
    filename = os.path.basename(image_path)
    mime_type = self.upload_image_type(filename)
    headers = {
        'Content-Disposition': f'attachment; filename={filename}',
        'Content-Type': mime_type
    }
    with open(image_path, 'rb') as img:
        response = self.request("POST", "media", headers=headers, files={'file': img})
    return response

パラメータ

  • image_path: アップロードする画像ファイルのパス。

処理の流れ

  1. 画像ファイル名の取得:
    os.path.basename(image_path) を使用して、指定された画像のファイル名を取得します。

  2. MIMEタイプの決定:
    self.upload_image_type(filename) メソッドを呼び出して、画像のMIMEタイプ(例: image/jpeg)を取得します。

  3. HTTPヘッダーの設定:
    Content-Disposition ヘッダーにファイル名を設定し、Content-Type ヘッダーにMIMEタイプを設定します。

  4. 画像のアップロード:
    self.request メソッドを使用して、POST リクエストを media エンドポイントに送信します。リクエストの本文には、画像ファイルの内容が含まれています。

  5. アップロード結果の返却:
    – WordPressからのレスポンスとして返されたメディアオブジェクトを返します。

使用例

# "example.jpg" という画像をアップロードする
media_object = client.upload_image("example.jpg")
print(media_object)

delete_image メソッド

delete_image メソッドは、WordPressのメディアライブラリから画像を削除するためのメソッドです。

def delete_image(self, media_id):
    """
    指定したIDの画像をWordPressから削除します
    :param media_id: 削除するメディアのID
    :return: 削除操作の結果
    """
    response = self.request("DELETE", f"media/{media_id}", params={"force": True})
    return response

パラメータ

  • media_id: 削除する画像のメディアID。

処理の流れ

  1. APIリクエストの送信:
    self.request メソッドを使用して、DELETE リクエストを media/{media_id} エンドポイントに送信します。media_id は削除対象の画像のIDです。
    params={"force": True} パラメータを指定することで、画像を完全に削除します。

  2. 削除結果の返却:
    – WordPressからのレスポンスを返します。

使用例

# IDが123の画像を削除する
delete_result = client.delete_image(123)
print(delete_result)

カテゴリー関連のメソッド

WordPressClient クラスには、WordPressのカテゴリーを操作するためのいくつかのメソッドが含まれています。

update_category_cache メソッド

def update_category_cache(self):
    """ カテゴリーのキャッシュを更新する """
    categories = self.get_categories()
    self.category_cache = {category['name']: category['id'] for category in categories}

update_category_cache メソッドは、WordPressサイトからすべてのカテゴリーを取得し、self.category_cache に名前とIDのペアとして保存します。これにより、APIに複数回リクエストを送ることなく、カテゴリーIDを簡単に参照できるようになります。

キャッシュを更新することで、カテゴリーの取得を効率化し、WordPressサーバーへのリクエスト回数を減らすことができます。

get_categories メソッド

def get_categories(self):
    """
    すべてのカテゴリーを取得する
    :return: カテゴリーのリスト
    """
    endpoint = "categories"
    categories = []
    page = 1
    per_page = 100  # 一度に取得するアイテムの数(必要に応じて調整)

    while True:
        response = self.request("GET", endpoint, data={'per_page': per_page, 'page': page})
        if not response:
            break

        categories.extend(response)

        if len(response) < per_page:
            break

        page += 1

    return categories

get_categories メソッドは、WordPressのすべてのカテゴリーを取得します。このメソッドはページネーション(ページ区切り)を使って、APIから大量のデータを効率的に取得します。per_page パラメータは一度に取得するアイテムの数を指定し、page パラメータは現在のページ番号を指定します。

この方法により、サイトに存在するすべてのカテゴリーを一度に取得することができます。

create_category メソッド

def create_category(self, name, **kwargs):
    """
    新しいカテゴリーを作成する
    :param name: カテゴリーの名前
    :param kwargs: カテゴリーのその他のデータ(スラッグなど)
    :return: カテゴリーのID
    """
    endpoint = "categories"
    category_data = {
        'name': name,
        **kwargs
    }
    response = self.request("POST", endpoint, data=category_data)
    category_id = response.get('id')
    self.category_cache[name] = category_id
    return category_id

create_category メソッドは、新しいカテゴリーをWordPressに作成します。このメソッドはカテゴリー名とオプションの追加データ(例: スラッグなど)を受け取り、APIに対してPOSTリクエストを送信します。

新しいカテゴリーが作成されると、そのIDが返され、self.category_cache にキャッシュされます。これにより、後で同じカテゴリーを検索する際にAPIリクエストを省略できます。

get_or_create_category_id メソッド

def get_or_create_category_id(self, name, **kwargs):
    """
    カテゴリー名を指定して、そのIDを取得する。存在しない場合は新規作成する
    :param name: カテゴリーの名前
    :param kwargs: カテゴリーのその他のデータ(スラッグなど)
    :return: カテゴリーのID
    """
    # キャッシュをチェック
    if name in self.category_cache:
        return self.category_cache[name]

    # カテゴリーが存在しない場合、新規作成
    return self.create_category(name, **kwargs)

get_or_create_category_id メソッドは、指定した名前のカテゴリーIDを取得します。このメソッドはまずキャッシュをチェックし、既存のカテゴリーIDが見つからない場合にのみ、新しいカテゴリーを作成します。

このアプローチにより、同じカテゴリーを複数回作成するのを防ぎ、既存のデータを再利用してAPIリクエストを最小限に抑えることができます。

WordPressClient クラスには、WordPressのタグを操作するためのいくつかのメソッドが含まれています。タグ関連のメソッドを使用すると、タグの取得、作成、キャッシュの更新などが可能です。それぞれのメソッドについて詳しく解説していきます。

タグ関連のメソッド

update_tag_cache メソッド

def update_tag_cache(self):
    """ タグのキャッシュを更新する """
    tags = self.get_tags()
    self.tag_cache = {tag['name']: tag['id'] for tag in tags}

update_tag_cache メソッドは、WordPressからすべてのタグを取得し、self.tag_cache にタグの名前とIDのペアとしてキャッシュします。これにより、複数回APIにリクエストを送ることなく、タグIDを素早く参照できるようになります。

キャッシュを更新することで、タグの取得を効率化し、WordPressサーバーへのリクエスト回数を削減できます。

get_tags メソッド

def get_tags(self):
    """
    すべてのタグを取得する
    :return: タグのリスト
    """
    endpoint = "tags"
    tags = []
    page = 1
    per_page = 100  # 一度に取得するアイテムの数(必要に応じて調整)

    while True:
        response = self.request("GET", endpoint, data={'per_page': per_page, 'page': page})
        if not response:
            break

        tags.extend(response)

        if len(response) < per_page:
            break

        page += 1

    return tags

get_tags メソッドは、WordPressのすべてのタグを取得します。このメソッドは、ページネーション(ページ区切り)を使って大量のデータを効率的に取得します。per_page パラメータは一度に取得するアイテムの数を指定し、page パラメータは現在のページ番号を指定します。

この方法を使うことで、サイトに存在するすべてのタグを一度に取得できます。

create_tag メソッド

def create_tag(self, name, **kwargs):
    """
    新しいタグを作成する
    :param name: タグの名前
    :param kwargs: タグのその他のデータ(スラッグなど)
    :return: タグのID
    """
    endpoint = "tags"
    tag_data = {
        'name': name,
        **kwargs
    }
    response = self.request("POST", endpoint, data=tag_data)
    tag_id = response.get('id')
    self.tag_cache[name] = tag_id
    return tag_id

create_tag メソッドは、新しいタグをWordPressに作成します。このメソッドはタグ名とオプションの追加データ(例: スラッグなど)を受け取り、APIに対してPOSTリクエストを送信します。

新しいタグが作成されると、そのIDが返され、self.tag_cache にキャッシュされます。これにより、後で同じタグを検索する際にAPIリクエストを省略できます。

get_or_create_tag_id メソッド

def get_or_create_tag_id(self, name, **kwargs):
    """
    タグ名を指定して、そのIDを取得する。存在しない場合は新規作成する
    :param name: タグの名前
    :param kwargs: タグのその他のデータ(スラッグなど)
    :return: タグのID
    """
    # キャッシュをチェック
    if name in self.tag_cache:
        return self.tag_cache[name]

    # タグが存在しない場合、新規作成
    return self.create_tag(name, **kwargs)

get_or_create_tag_id メソッドは、指定した名前のタグIDを取得します。このメソッドはまずキャッシュをチェックし、既存のタグIDが見つからない場合にのみ、新しいタグを作成します。

このアプローチにより、同じタグを複数回作成するのを防ぎ、既存のデータを再利用してAPIリクエストを最小限に抑えることができます。

まとめ

長くなりましたが、全体のコードは以上です。
このクラスを使うことで、画像入りのブログ記事原稿を投稿する方法は以下になります。

コメント

タイトルとURLをコピーしました