PythonでWordPressにアイキャッチ付きの記事を自動投稿する

自動投稿の基本画像の自動アップロード については、すでに記事を書きました。
これらをまとめて アイキャッチ付きの記事の自動投稿 をやってみます。

PythonでWordPressに記事を自動投稿する PythonでWordPressのメディアライブラリに画像を自動アップロードする

作成するコードの流れはこれです。

  • アイキャッチ画像をメディアライブラリへ自動アップロードする。
  • レスポンスからアイキャッチ画像のIDを取得する。
  • アイキャッチ付きの記事を自動投稿する。

アイキャッチ画像を用意する

この画像を使います。ファイル名は eyecatch_auto_post_test_20210518.png です。

アイキャッチ画像を自動アップロードする

アイキャッチ画像へのパスを引数にし、自動アップロードに成功したら、画像に付与されるIDを返す関数を作成します。

# auto_upload.py
import requests
from urllib.parse import urljoin
import os
import json

def wp_upload_media(file_path):
    url_base = 'https://kamiki.blog/'
    url = urljoin(url_base, 'wp-json/wp/v2/media/')

    user = 'xxx' # ユーザー名
    password = 'xxx' # アプリケーションパスワードで発行したパスワード

    f = open(file_path, 'rb')
    image_data = f.read()
    f.close()

    filename = os.path.basename(file_path)
    print(filename)
    headers = {
        'Content-Type': 'image/png',
        'Content-Disposition': 'attachment; filename=' + filename,
    }

    res = requests.post(
        url,
        data=image_data,
        headers=headers,
        auth=(user, password),
        )
    res_dict = res.json()
    print(json.dumps(res_dict, indent=4))
    unique_id = res_dict['id'] # アップロードした画像のID
    return unique_id

アイキャッチ付きの記事を自動投稿する

WP REST API Handbook を見てみます。

Posts の “featured_media” の説明を見てみると、”The ID of the featured media for the object.” と書いてあります。これがアイキャッチです。featured_media にアイキャッチの ID を設定してPOSTします。

※サンプルコードが読みづらいので、一部省略しています。

import requests
from urllib.parse import urljoin
from datetime import datetime
import os

import auto_upload

def wp_post(unique_id):
    url_base = 'https://kamiki.blog/'
    url = urljoin(url_base, 'wp-json/wp/v2/posts/')

    user = 'xxx' # ユーザー名
    password = 'xxx' # アプリケーションパスワードで発行したパスワード

    content = 'これはアイキャッチ付き記事の自動投稿テストです。下記記事参照。※ここ一部省略します。'

    post = {
        'title': 'WordPress自動投稿テスト(アイキャッチ付き)',
        'status': 'publish', # draft(下書き), publish(公開)
        'slug': 'wordpress-auto-post-test-with-eyecatch', # パーマリンク
        'categories': 5, # カテゴリID
        'date': datetime.now().isoformat(),
        'content': content,
        'featured_media': unique_id, # アイキャッチのID
    }

    res = requests.post(
        url,
        json=post,
        auth=(user, password),
        )
    print(res)
    return

if __name__ == '__main__':
    filename = 'eyecatch_auto_post_test_20210518.png'
    file_path = os.path.join(os.getcwd(), filename)
    print(file_path)
    unique_id = auto_upload.wp_upload_media(file_path)
    print(unique_id)
    wp_post(unique_id)

自動投稿結果

こちらがアイキャッチ付きの自動投稿の記事です。

WordPress自動投稿テスト(アイキャッチ付き)