WordPressでの投稿を続けていると、前の記事をベースにリライトしたいとき、画像や中身の表現だけを少し変えて投稿したいなというときはございませんか?
私は毎週更新している [資産運用の週次報告] はその週の「本文の一部」「画像ファイル」「リンクURL」を差し替えて手動で更新しています。ある程度の型が決まっているため更新作業自体は30分ほどで終了できるのですが、今回その作業を自動化する方法をステップに分けて紹介して行きます。
本記事では最後の「 REST APIでHTML文とアイキャッチ画像を設定してWordpressに自動投稿 」する方法をコード付きで紹介したいと思います。なお、本記事は今まで紹介してきた「REST API」を用いて記事の下書きの投稿、複数メディアファイルのuploadができるようになった段階を想定しておりますので、まだの方は上記記事をまずは参照ください。
はじめに
WordPressで[資産運用の週次報告]のページのように実用的な自動投稿を実現するため本記事を含めて5つのステップに分けて解説していきます。
- PythonとWordPressを連携して記事の下書き投稿する
- PythonでWordPressに画像を追加
- PythonでWordPressに複数の画像を一括で追加
- PythonとJinja2でWordPress投稿記事を編集 (本文・画像追加・ギャラリー)
- REST APIでHTML文とアイキャッチ画像を設定して投稿する (本記事)
各ステップの流れを一つの流れに整理すると以下のフロー図で示すことができ、本記事で紹介する範囲は黄色ハイライトした箇所です。複数の記事にまたがるとどの内容を見ているかを見失ってしまいやすいので、適宜このフローチャートを確認してください。
◆ Mac OS
◆ Python 3
◆ JupyterLab
◆ WordPress ver. 5.8
REST APIでHTML文とアイキャッチ画像を設定して投稿する
先に紹介した関連記事を読み終わった人は「WP REST API」の設定も終わり、メディアファイルも複数uploadできているかと思います。具体的な想定読者は、以下の悩みを持つ人たちです。
今まで作成してきたHTML投稿用のコードが知りたい!
本文(HTML)中でアイキャッチ画像を設定しなかったけど、どこで指定できるのかな。
上記の悩みを解決するには、以前「Pythonを使ってWordpressに自動投稿」で紹介したコードの中の「post」で設定します!
上記記事で言及したコードは以下の通りで「post」の設定は7行目以下の部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def wp_create_post() -> dict: credentials = MY_USER + ':' + MY_APP_PASSWORD token = base64.b64encode(credentials.encode()) headers = {'Authorization': 'Basic ' + token.decode('utf-8')} post = { 'title': 'Pythonで自動投稿 -確認-',#投稿記事タイトル 'status': 'draft',#ステータス 公開:publish, 下書き:draft 'content': 'テスト',#投稿記事本文 'categories': [140],#カテゴリーID 'tags': [202],#タグID 'slug': 'pre_test',#URLスラッグ } res = requests.post(f"{MY_URL}/wp-json/wp/v2/posts/", headers=headers, json=post) if res.ok: print("投稿の追加 成功 code:{res.status_code}") return json.loads(res.text) else: print(f"投稿の追加 失敗 code:{res.status_code} reason:{res.reason} msg:{res.text}") return {} |
これから、この「post」で 1) 本文(HTML) と 2) アイキャッチ画像 の設定方法について紹介します。
投稿記事の本文(HTML)の設定方法
投稿記事の本文は「post」中の「’content’」にて定義されるのでこのcontentに準備したHTMLコードを定義します。以下の例では準備したHTMLコードを「rendered_HTML」としておりますが、直接HTMLコードを記載しても構いません。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# rendered HTMLの設定 content = rend_html # 投稿設定: post post = { 'title': '下書き投稿',#投稿記事タイトル 'status': 'draft',#ステータス 公開:publish, 下書き:draft 'content': content, 'categories': [140],#カテゴリーID 'tags': [202],#タグID 'slug': 'weekly_' + date + '/',#URLスラッグ 'featured_media': eyecatch_id, # アイキャッチのID } |
HTMLが長くなる場合には別ファイルとして保存している場合もあるかと思います。その際には、同様に「content = xxx」という形でHTMLを定義すれば問題ありません。
投稿記事のアイキャッチ画像の設定方法
アイキャッチ画像
今まで関連記事で何回か紹介してきましたが、アイキャッチ画像はWordpressのテキスト本文中には表示されず、REST APIで投稿時にmedia_id
を指定することで設定されます。その指定は以下のコード例でいうと9行目のfeatured_media
の部分です。
1 2 3 4 5 6 7 8 9 10 |
# 投稿設定: post post = { 'title': '下書き投稿',#投稿記事タイトル 'status': 'draft',#ステータス 公開:publish, 下書き:draft 'content': content, 'categories': [140],#カテゴリーID 'tags': [202],#タグID 'slug': 'weekly_' + date + '/',#URLスラッグ 'featured_media': eyecatch_id, # アイキャッチのID } |
1 2 3 4 |
import pandas as pd media_info_df = pd.DataFrame(media_info_list) media_info_df.to_csv('media_info.csv',header=False, index=False) |
media_idの確認方法
私は、「media_info_list」からpandas dataframeを作成して、そのdataframeで何番目かと整理して「media_id」を取得しています。なぜなら、ファイル名や作成する画像の種類が変更にならない限り、ファイル名の順番は変更なしのため、media_id自体の番号がuploadされるたびに変わっても「上から何番目のファイルか」という情報のみでmedia_idを取得できます。
1 2 3 |
import pandas as pd media_info_df = pd.read_csv('media_info.csv') media_info_df |
実行結果
実行すると以下のような形でdataframeが得られるかと思います。なお、dfの中身自体はuploadされたファイル名などによって異なります。
filename | filepath | media_id | ||
---|---|---|---|---|
0 | 20220713_xxx.png | /Users/mark/xxx/20220713_xxx.png | 1 | |
1 | 20220713_yyy.png | /Users/mark/xxx/20220713_yyy.png | 2 | |
2 | 20220713_zzz.png | /Users/mark/xxx/20220713_zzz.png | 3 |
このdfから「media_id」を取り出すには.iloc
を使用します。この.iloc
はdataframeの[何行目、何列]かを指定することで得られます。
1 2 3 4 5 6 |
# media_idの表示例 media_info_df.iloc[0,2] #> 1 media_info_df.iloc[1,2] #> 2 |
アイキャッチ画像のように1ファイルのみのmedia idの確認であれば、Wordpressのメディア一覧からでも以下の手順で確認することができます。
アイキャッチ画像用のメディアIDを確認できましたら、「post」中の「’featured_media’」にてアイキャッチ画像用のメディアIDを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# eyecatch_idの設定 eyecatch_id = media_info_df.iloc[0,2] #直接media_idの番号を指定しても良い # 投稿設定: post post = { 'title': '資産の見える化 ウィークリーレポート <' + date[0:4] + '年' + date[4:6] + '月' + date[6:8] + '日週>',#投稿記事タイトル 'status': 'draft',#ステータス 公開:publish, 下書き:draft 'content': content, 'categories': [140],#カテゴリーID 'tags': [202],#タグID 'slug': 'weekly_' + date + '/',#URLスラッグ 'featured_media': eyecatch_id, # アイキャッチのID } |
上記の設定を「post」に追加して実行することで、Wordpressに下書き記事が投稿されます。なお「カテゴリーID」や「タグID」の確認についてはこちらの記事を参照ください。
最後に
今回は「REST APIでHTML文とアイキャッチ画像を設定して投稿」するための「pythonのコード」を紹介しました。
WordPressで[資産運用の週次報告]のページのように実用的な自動投稿を実現するため今まで5つのステップに分けて解説してきました。
- PythonとWordPressを連携して記事の下書き投稿する
- PythonでWordPressに画像を追加
- PythonでWordPressに複数の画像を一括で追加
- PythonとJinja2でWordPress投稿記事を編集 (本文・画像追加・ギャラリー)
- REST APIでHTML文とアイキャッチ画像を設定して投稿する (本記事)
各ステップの流れを一つの流れに整理すると以下のフロー図で示すことができます。
私自身、Wordpressの自動投稿をしたいなと思っていても、実用的なレベルで一連の流れを整理した記事を見つけることができませんでした。私の記事でもコードや設定で分かりにくいところがあればコメントもらえれば返信します。
本記事が少しでもWordpressの自動投稿を行いたい人の助けになり、より快適なブロフライフを送る一助となればと思います。
コメント