PythonでWordPressに画像を更新しながらアップロードする方法

ブログ

PythonでのWordPress画像のアップロード

PythonでWordPressに画像を単純にアップロードする方法は以下の記事で紹介したようにpython-wordpress-xmlrpcmedia.UploadFileで実行可能です。

しかし、投稿の更新のように、画像を上書き、更新したいという場合もあるかと思います。

投稿と同じように更新用のメソッドがあればよいのですが、一通り見てみたところではそのようなメソッドを見つけることができませんでした。

通常通り、同じファイル名のファイルをアップロードした場合は、URLの後ろに-1のような数字が自動で付与されます。
しかし、URLはそのままで、画像を更新したいというケースもあると思います。
(すでに記事は存在していて、その中の画像を更新したい)

そこで、画像を上書き更新したい場合には、まず現在の画像を削除して、新しい画像をアップロードする方法があります。

必要な準備

Pythonライブラリのインストール:
python-wordpress-xmlrpc ライブラリを使用します。このライブラリをインストールするには、以下のコマンドを実行します。

pip install python-wordpress-xmlrpc

画像アップロード関数の拡張

以下のコードは、WordPressに画像をアップロードするためのPython関数を拡張したものです。この関数は、画像がすでに存在する場合には上書きするかどうかの選択肢できるようにしています。

削除の処理が入ってくるので、通常の処理で間違えて同じファイルを上書きしてしまわないように確認を出すようにしています。

いくつかアップロード方法の種類を分けたほうがよさそうなので、以下の3パターンに分類しました。

  • upload_type:0 アップロードしない。すでに同じ名前のファイルが存在する場合には、アップロードせずに、画像のIDだけ取得する
  • upload_type:1 ファイルがない場合のみupload。すでに同じ名前のファイルが存在する場合には、アップロードせずに、画像のIDを取得し、存在しない場合には、アップロードする。
  • upload_type 2 ファイルが存在している場合、既存ファイルを削除して、再度アップロードする。(ただし、overwrite=Trueかつ、確認のメッセージに対する入力がyの場合のみ)
import os
from wordpress_xmlrpc import Client, WordPressMedia
from wordpress_xmlrpc.methods import media, posts

def wp_upload_image(wp, img_path, out_img_name=None, overwrite=True, upload_type=1):
    '''
    upload_type:0 アップロードしない
    upload_type:1 ファイルがない場合のみupload
    upload_type 2 すべて
    '''
    if upload_type == 0:
        media_items = wp.call(media.GetMediaLibrary({'mime_type': 'image/png'}))
        for item in media_items:
            if item.metadata['file'] == out_img_name:
                return item.id
        return None

    if out_img_name is None:
        out_img_name = os.path.basename(img_path)

    if os.path.exists(img_path):
        # 既存の同名画像を削除
        if overwrite:
            media_items = wp.call(media.GetMediaLibrary({'mime_type': 'image/png'}))
            for item in media_items:
                if item.metadata['file'] == out_img_name:
                    if upload_type == 2:
                        check = input(f'{out_img_name}はすでに存在します。上書きしますか?(y/n/p)')
                        if check == 'y' or check == 'Y':
                            wp.call(posts.DeletePost(item.id))
                            print(f"{out_img_name} の既存ファイルを削除しました。ID: {item.id}")
                        elif check == 'p':
                            return item.id
                    else:
                        return item.id
        with open(img_path, 'rb') as f:
            binary = f.read()

        data = {
            "name": out_img_name,
            "type": 'image/png',  # 画像のMIMEタイプ
            "bits": binary
        }

        response = wp.call(media.UploadFile(data))
        media_id = response['id']
        print(f"{out_img_name} のアップロードに成功しました。ID: {media_id}")
        return media_id
    else:
        print(f"{out_img_name} が見つかりません")
        return None

関数の詳細

  • wp_upload_image:
    この関数は、指定した画像ファイルをWordPressにアップロードします。関数の引数とその役割は以下の通りです。

  • wp:

    • WordPressのXML-RPCクライアントオブジェクトです。これを使ってWordPressのAPIにアクセスします。
  • img_path:

    • アップロードする画像ファイルのパスを指定します。このパスに指定されたファイルが実際にアップロードされます。
  • out_img_name:

    • アップロード後の画像の名前を指定します。指定しない場合は、img_pathからファイル名を取得して使用します。
  • overwrite:

    • 既存の画像が同じ名前で存在する場合に、その画像を上書きするかどうかを指定します。Trueの場合は上書き、Falseの場合は既存の画像をそのままにします。
  • upload_type:

    • アップロードの条件を指定します。以下の3つのオプションがあります。
    • 0: アップロードしない
    • 1: ファイルが存在しない場合のみアップロード
    • 2: すべてのケースでアップロード

コードの流れ

  1. アップロード条件の判断:
    upload_type0の場合、アップロードせずに、すでに存在する画像のIDを返します。
    upload_type1または2の場合、画像が存在しない場合にのみアップロードするか、既存の画像を更新します。

  2. 画像の存在確認:
    – 指定したパスの画像ファイルが実際に存在するか確認します。

  3. 既存画像の管理:
    – 既に同名の画像が存在する場合、その画像を削除するかどうかの選択肢を提供します。overwriteTrueの場合、確認を求めて画像を削除します。

  4. 画像のアップロード:
    – 画像をバイナリ形式で読み込み、media.UploadFileメソッドを使ってWordPressにアップロードします。

  5. 結果の表示:
    – アップロードが成功した場合は画像のIDを表示し、失敗した場合や画像が見つからない場合はエラーメッセージを表示します。

使用例

以下のコードは、この関数を使用してWordPressに画像をアップロードする方法を示しています。

# WordPressのXML-RPCクライアントを設定します。
wp = Client('http://your-wordpress-site/xmlrpc.php', 'username', 'password')

# 画像のアップロードを実行します。
img_path = 'path/to/your/image.png'
wp_upload_image(wp, img_path, upload_type=2)

この例では、upload_type=2を指定しているため、すでにファイルが存在する場合には、確認メッセージが表示され、上書き可能になります。

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