PythonでWordPressに記事を自動投稿する

WordPressをいじっていると、自動投稿って試してみたくなりますよね。

この記事では、Pythonを使った記事の自動投稿をお伝えします。

自動投稿の準備

プラグインは不要

プラグインは必要ありません。

自動投稿について書かれているサイトを見ると、「WP REST API プラグインを入れる」とか「Application Passwords プラグインを入れる」とか書かれていますが全部不要でした。

この記事を書いている時点の私のWordPressのバージョンは5.7.2です。

自動投稿用のパスワードの発行

Pythonで自動投稿するときにユーザー名とパスワードは必要です。
そこで、パスワードを発行してみたいと思います。

WordPress左側Menuにある ユーザー => ユーザー一覧 から、自動投稿に使うユーザーを選択し編集を押します。

下の方に「アプリケーションパスワード」という欄があります。
ここでパスワードを発行します。

新しいアプリケーションパスワード名」の欄に「Pythonから自動投稿用」とか適当な名前を入れます。
何用のパスワードを発行するか?ってことです。

その後、「新しいアプリケーションパスワードを追加」ボタンを押すと、下にパスワードが表示されます。
このパスワードは二度と表示されることがなさそうなので、スクショしておくといいと思います。

記事を自動投稿する

自動投稿のサンプルコード

実装したコードがこちらです。(※サンプルコードが見づらかったので、一部省略しました。)

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

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

    user = '****' # ユーザー名
    password = 'AIGV W6AI 9PSX F8pI POXc M3qA'

    content = 'これは自動投稿テストです。下記記事参照。※ここ一部省略しました。'

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

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

if __name__ == '__main__':
    wp_post()

自動投稿の全体の参考として、下記サイトを見ました。
WordPress REST API With Python

サーバーに記事を送るのは、Pythonのrequestsを使います。下記サイトのpost部分を参考にしました。
Requests クイックスタート

ユーザー認証は、下記サイトを参考にしました。
Basic Authentication

Create Postのときのパラメータの意味は、下記サイトを参考にしました。
REST API Handbook

自動投稿された記事はこちらになります。

WordPress自動投稿テスト WordPress自動投稿テスト

ちょっとした疑問

このコードを、そのままもう一度実行すると、どうなるのでしょう?
パーマリンクとか同じページができてしまうのでしょうか?

やってみると、post_idが異なる記事がもう一つ投稿されていました。

自動投稿した2つの記事の両方のパーマリンクに”-2″という文字列が最後に追加されていました。
さらに、後から自動投稿した記事をゴミ箱へ捨てると、先に自動投稿した記事のパーマリンクは元に戻っていました。
これはバグなのか、パラメータが足りていないのかは、まだわかっておりません。
なので、同じslug名で自動投稿を繰り返さない方が良さそうです。

記事のカテゴリーID・タグIDを複数指定する

カテゴリーID、タグID は複数指定することができます。

カテゴリーIDにを複数指定する場合は ‘categories’: ‘5, 8’のように指定します。
カンマのあとにスペースは要りません。

タグIDの場合は‘tags’: ‘1,2’のように指定します。

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

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

    user = 'xxx'
    password = 'xxx'

    post = {
        'title': 'WordPress自動投稿テスト2',
        'status': 'draft', # draft(下書き), publish(公開)
        'slug': 'wordpress-auto-post-test2', # パーマリンク
        'categories': '5, 8', # カテゴリID
        'date': datetime.now().isoformat(),
        'content': 'test2',
    }

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

if __name__ == '__main__':
    wp_post()

上記プログラムを実行後にWordPressの投稿一覧を見ると、カテゴリーID を複数指定できていることが確認できます。