PythonでのWordPress画像のアップロード
PythonでWordPressに画像を単純にアップロードする方法は以下の記事で紹介したようにpython-wordpress-xmlrpc
のmedia.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
: すべてのケースでアップロード
コードの流れ
-
アップロード条件の判断:
–upload_type
が0
の場合、アップロードせずに、すでに存在する画像のIDを返します。
–upload_type
が1
または2
の場合、画像が存在しない場合にのみアップロードするか、既存の画像を更新します。 -
画像の存在確認:
– 指定したパスの画像ファイルが実際に存在するか確認します。 -
既存画像の管理:
– 既に同名の画像が存在する場合、その画像を削除するかどうかの選択肢を提供します。overwrite
がTrue
の場合、確認を求めて画像を削除します。 -
画像のアップロード:
– 画像をバイナリ形式で読み込み、media.UploadFile
メソッドを使ってWordPressにアップロードします。 -
結果の表示:
– アップロードが成功した場合は画像の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
を指定しているため、すでにファイルが存在する場合には、確認メッセージが表示され、上書き可能になります。