見出し画像

CSVファイルから自動でWordPressに投稿するための全手順

割引あり

皆さんこんにちは、ぼっち企業界隈のえ17うです。
フリーランス生活や個人ビジネスをしていると、なるべく人手をかけずに効率よく業務を回したいと思うことが多いですよね。私自身、過去には物理的に膨大なデータをExcelや手作業でWordPressにコツコツ投稿していた時期がありましたが、あまりにも時間と労力がかかって大変でした。

ファイル構造を追記しました🙇

そんな私がアドバイスをしたAさん(仮名)の事例をご紹介します。Aさんは当初、「素人同然」で、まさに右も左もわからない状態でした。外注するには予算が足りず、自分でなんとかするしかない……。だけど、WordPressのテーマ設定やプラグイン導入すらままならない。さらに投稿数も多く、しかもカテゴリ分けやタグ付けが頻繁に必要。そんな厳しい状況から一念発起して、今回ご紹介するPythonスクリプト+複数CSV自動読み込みの手法を導入し、試行錯誤の末に大きな成果を上げたのです。

このマニュアルでは、そんなAさんのように、大量のCSVデータを抱えつつ「一気にWordPressへ投稿したい」方や、一回で処理をまとめて実行したい方、そしてプログラミングや自動化にはまだ自信がないという方に向けて、最短で結果を出すための具体的な流れをまとめています。

本記事の目的・概要
今回のノートの最大の目的は、「複数階層に分かれたCSVをまとめて再帰的に読み込み、WordPressに自動で予約投稿する」という仕組みを作ることにあります。そして、同時に下記のような皆さんの悩みや課題を解決する指針を提供します:

膨大なCSVデータの管理と投稿に時間がとられている
一度に複数ファイルを扱いたいが、どこから手を付けていいかわからない
プログラミングの経験が少なくて、動かし方のイメージがわかない
WordPress運用をもっと効率化したい
無料部分では、本記事全体の流れとメリット、そして導入に際して必要な基礎知識・ポイントを余すことなく解説します。
そしてその先の有料パートにて、実際のコードの全容や細かい設定、さらに追加の応用事例や強化ポイント、トラブルシューティングまでを、私自身の経験や失敗談を大幅に加えつつ解説していきます。
ぜひ最後までご覧いただき、これを機にあなたも“CSV自動投稿”の面倒な作業を一気にスマートにしてみてください。

最初にお断りしておきたいこと
このノートでは、WordPressの基本的な利用方法(例:サーバ設置、テーマ設定、プラグイン導入)は理解している前提で解説を進めます。
また、Pythonのインストール方法や仮想環境(venv)の基礎についても触れますが、本格的なプログラミング学習の書籍レベルの超基礎まではすべて網羅しきれませんのでご容赦ください。

それと同時に、API呼び出しの料金やサーバ負荷、通信エラー等は実行環境によって異なりますので、最終的な判断と責任は自己責任でお願いいたします。実行中のトラブルや、WordPressのバージョンアップに伴う影響なども考慮しながら、ご自身で十分にテストしたうえで本番運用されることを推奨します。

ですがご安心ください。私のノートを最後まで読んでいただければ、可能な限り安全かつスムーズに導入するためのノウハウを最大限詰め込みました。初心者が「どうしてエラーになるの?」「なぜ思うように動かないの?」と混乱しがちなポイントも、丁寧にカバーしています。

このノートで得られるもの
大量のCSVを一気に読み込み、自動でWordPressに投稿できるPythonスクリプトの実行方法を把握できる
複数のディレクトリに分散しているCSVファイルを漏れなく処理する仕組みが手に入る
カテゴリやタグを自動生成して投稿するための原理と実装ノウハウを得られる
投稿エラーやAPI疎通エラーに対してログを記録し、トラブルを早期発見・対応できる
予約投稿の実装やテストモード(1件だけ投稿)による安全な確認手順がわかる
最終的には、面倒な手作業を大幅に削減でき、時間とコストを節約できる
さらに有料パートでは、私自身がぶち当たった数々の失敗談や、思わぬ落とし穴とその対策、“もっと便利に使うための改造アイデア”などを具体的に解説します。そうすることで、あなたが同じ罠にハマるリスクを一気に減らし、快適に自動投稿を回す道が開けるでしょう。

注意事項
コードのコピペ実行による結果や動作保証については、動作環境やライブラリバージョンなどによって異なります。あくまで自己責任でお願いいたします。
PythonやWordPressのバージョンアップに伴う将来的な変更には対応しきれない場合があります。
本ノートのコンテンツはリリース時点の情報をもとに作成しています。最新のセキュリティパッチやライブラリ互換性などは随時チェックしてください。
有料部分にはさらに深いノウハウが含まれますが、このノートを購入いただいた時点で「返金は不可」となります。ご納得の上でお買い求めください。
有料部分のご案内
この後の無料パートでは、「そもそもどうやって環境を整えるのか?」という導入部分から、CSVとWordPress APIを連携させる際に必要な基本要件を解説します。
それを読んで全体像を掴んでから、有料パートへお進みいただければ、具体的なソースコードの詳細や応用的な活用方法、Q&A集、トラブルシューティングなどが“整理された形”で手に入り、すぐに再現できる状態になります。

もしあなたが「もう環境構築でつまづきたくない」「同じエラーを繰り返したくない」「実行して確実に成功させたい」という場合は、ぜひこの先の有料パートもあわせてお読みいただくことを強くおすすめします。
では早速、無料パートへ進みましょう!

無料パート
無料パートでは、これから本番のコードを動かすにあたり、最低限知っておいてほしい要点を解説していきます。ここを押さえておけば、スクリプトを走らせたときになぜ動くのかが理解しやすくなり、エラー発生時の原因究明がやりやすくなります。

  1. Pythonと仮想環境(venv)の基礎
    まず、今回の自動投稿はPythonで実装します。Pythonにはバージョンの違いやライブラリの依存関係があり、同じマシン上に複数の環境を持つとライブラリが衝突してエラーになる場合があります。
    そこでvenv(仮想環境)を使って、投稿スクリプト専用の環境をきちんと分離し、ライブラリが混在しない状態で整えるのがオススメです。

例えば、Windowsだと以下の手順で仮想環境を作成します:

  1. python -m venv venv を実行

  2. venv\Scripts\activate を実行して仮想環境を有効化

  3. 必要なライブラリを pip install ライブラリ名 でインストール
    macOSやLinuxであれば、source venv/bin/activate といった具合に少しコマンドが異なります。
    この仕組みを知らない状態でライブラリをインストールしていると、「なぜかライブラリが見つからない」といったエラーや、「バージョン違いで動かない」などのトラブルが起きやすいので注意してください。

  1. WordPress REST APIと認証
    次にWordPress REST APIについて。WordPressには管理画面から記事を投稿する方法が一般的ですが、それとは別に「REST APIを使って外部から投稿」する仕組みがあります。
    これを活用することで、Pythonからでも「記事を投稿する」という操作が可能になるわけです。

ただし、REST APIで記事を登録するには認証が必要です。
WordPress 5.6以降では「アプリケーションパスワード」という機能を用いて、プラグインを入れなくてもAPI経由での投稿認証がしやすくなっています。
このアプリケーションパスワードを正しく設定し、ユーザー名と合わせてBasic認証の形でリクエストヘッダーに乗せて送ることで、無事に記事が投稿できる仕組みとなります。

  1. CSVファイルの取り扱い
    CSVファイルは表形式のデータです。
    本スクリプトでは各列を特定の用途(例:タイトル、本文、ステータス)に割り振った形で読み込みます。
    加えて、今回は複数のフォルダに分かれているCSVファイルすべてを再帰的に巡回します。つまり、dataというフォルダの下にあるあらゆるサブフォルダ(data/january/、data/february/など)にある .csvファイルを一気に探し出し、順番に処理していくイメージです。

重要なのは、既に投稿済みの行と、まだ投稿していない行を区別する仕組みです。
このマニュアルで紹介するスクリプトでは、M列(ステータス列)に値が入っている行は「すでに投稿済み」とみなし、2度目の投稿をスキップする仕様となっています。これによって重複投稿の事故を防ぎます。

  1. テストモードとログ出力
    「一気に投稿を走らせるのは怖い……」という場合に備え、テストモードを用意しています。
    .envファイル内でTEST_MODE=Trueと設定しておくと、全CSVを巡回しても最初の1件だけ投稿して終了する仕組みです。
    これはエラーの有無を確認したり、投稿フォーマットが期待通りに仕上がっているかを確かめたりするのに便利です。

さらに、処理の経過やエラーメッセージなどはExecutionLogs.csvに蓄積されるようになっています。
どのCSVのどの行をいつ投稿したか、あるいはエラーがあったかなどが記録されるので、後から原因追究もしやすくなります。

  1. 購入メリットのおさらい
    ここまでの話をまとめると、次のようなメリットを得られます:

データが多くても複数フォルダにあるCSVをすべて一気に投稿できる
テストモードで事前確認ができるため、公開前に安全に動作検証が可能
ステータス列で重複投稿を防ぐので、安心して再実行できる
カテゴリやタグも自動生成、予約投稿まで自動化できる
ログを残すことで、エラー原因を後から追いやすい
これからこのノートを最後まで読み進めていただければ、あなたもコピペ実行だけでこの仕組みを手に入れることができます。
さらに実際に動かす中で私が経験したノウハウや失敗事例を読み解けば、最初から“躓きにくい方法”を選択し、スムーズに運用を始められるでしょう。

注意点・自己責任
冒頭でも述べましたが、ツールの実行や設定によるトラブルについては、基本的に各自の環境やバージョンに依存します。
WordPressテーマの個別仕様やプラグインの競合など、他要素の影響でうまく動作しない場合もあるため、くれぐれも本番運用前にテストを行いましょう。

以上が、無料部分で知っておくべき基礎知識となります。
この先の有料パートでは、いよいよ「どのようにコードを書けばいいのか?」「具体的なコピペ用スクリプトはどうなっているのか?」といった実行手順や応用Tips、トラブルシュートを含めたノウハウを解説していきます。

もし、この無料パートを読んでみて「なるほど、なんだかできそうだけど、実際のコードを見ないとピンとこないな……」と思った方は、ぜひ有料パートをご覧ください。
それでは次のパートに進んでみましょう!

中間部分
お待たせしました。ここから有料パートです。ここでは、実際に「複数階層のCSVファイルを巡回し、WordPressに自動投稿するスクリプト」をどのように組み立てればよいのか、コピペで実行できるレベルまで詳しく説明していきます。
実際のソースコードをそのまま動かせば、前章で紹介した機能(カテゴリ自動生成、タグ自動生成、予約投稿、ログ出力、テストモード等)を全て含んだ形で、一度に複数のファイルを処理できるようになります。

ただしここで重要なのは、Pythonコードをコピペする前に、自分のWordPress環境とCSVファイル列の仕様が合っているかを再確認することです。以下のセクションでは、実際のコードとともに要注意ポイントを解説しますので、しっかりと目を通してください。

  1. ディレクトリ構成の押さえどころ
    まずは、今回のスクリプトを使うにあたって想定しているディレクトリ構成例をもう一度おさらいします。特に、data/フォルダ以下にサブフォルダを切って、その中にCSVファイルを入れる、という部分が肝です。
    下記のようにフォルダを分けてファイルを管理するケースが多いでしょう:

project_root/
  ├─ venv/                  ← 仮想環境
  ├─ .env                   ← WordPress接続情報やTEST_MODEを設定
  ├─ wp_auto_post.py        ← 本スクリプト
  ├─ data/                  ← 下層にさらにフォルダがあるかも
  │   ├─ january/
  │   │   ├─ file1.csv
  │   │   └─ file2.csv
  │   └─ february/
  │       └─ file3.csv
  ├─ ExecutionLogs.csv      ← ログファイル (自動生成)
  └─ ...


このように、複数フォルダに分散して置かれているCSVを一度のスクリプト実行で全て処理し、投稿するのが今回のポイントです。これにより、januaryやfebruaryなど年月ごとに分類したファイルをわざわざ手動で一つずつ実行しなくてすむようになります。

  1. .envファイルの作り方
    PythonコードからWordPressにアクセスする際、接続情報(サイトURL、ユーザー名、アプリケーションパスワード)を平文で直接ソース内に書くと、セキュリティ的に好ましくありません。
    そこで、.envファイルに接続情報を定義し、Pythonからはpython-dotenvライブラリを使って読み込みます。
    .envファイルには、具体的に次のような内容を書いてください:

.env

WP_SITE_URL=https://example.com/
WP_USER=your_wp_username
WP_APP_PASSWORD=your_wp_app_password

TEST_MODE=True
大事な点:

TEST_MODEをTrueにすると、全てのCSVを巡回しても最初の1件しか投稿しない。テスト確認に最適。
本番稼働時にはTEST_MODE=Falseに変更して、最大投稿件数(スクリプト内のMAX_POSTS_PER_EXEC)まで実行できます。
3. CSVの列構成とヘッダ
今回のスクリプトでは、以下のように列を読み込む想定で実装しています(前回のコード例を踏襲しています)。

追記部分

以下の表に、本コードが想定しているCSVの列定義をまとめています。
「どの列に何を書いておくと、コードのどこで・どのように使われるのか」を整理したものです。
実際には Python で 0 から始まるインデックスを使っていますが、便宜上「A列=1」という 1 始まりの列番号も併記しています。

コード上での列定義一覧

  1. A列 / B列 / C列

      • まとめてリスト化されるため、「本文のどこかで繰り返し使いたい HTMLパーツや画像URL」を並べておく想定です。

      • A列 の内容は「見出しが出てくるたびに2回に1回挿入するHTMLブロック」としてランダムに使われる。

      • B列 は最初の見出し後に1枚目の画像を挿入する用途。

      • C列 は2番目以降のH2見出しを3つおきにチェックし、そのタイミングでランダムに画像を挿入する処理が実装されています。

  2. H列 / I列 / J列 / K列 / L列

      • H列: 文章内で「replace_quotes_with_kaiwa()」を経由し、「~」 の部分を会話吹き出しタグ [st-kaiwa1]...[/st-kaiwa1] や [st-kaiwa2]...[/st-kaiwa2] に変換。

      • I列

      • J列 / K列: それぞれ段落や強調文字として使われる。

      • L列: HTMLブロックを本文の上下に挟みこむイメージ(l_top と l_bottom)。

  3. M列(ステータス) / N列(タイムスタンプ) / S列(投稿ID)

      • M列 (空欄なら未投稿扱い)

      • N列 (投稿/失敗した日時)

      • S列 (WordPress投稿ID)

      • この3つはコードの実行結果を書き戻して重複投稿やエラーの管理に使います。

  4. O列(カテゴリ) / P列(タグ)

      • カンマ区切りで複数指定が可能。

      • スクリプト内で get_or_create_term_id() が呼ばれ、未登録ならカテゴリ/タグを自動生成する仕組みになっています。

  5. Q列 / R列 / T列 / U列

      • Q列: 本文の最上部に挿入する HTML ブロック

      • R列: 本文の最下部に挿入する HTML ブロック

      • T列 / U列: 2番目の H2 や 4番目の H2 見出しの後に YouTube埋め込みブロックを追加するなどの処理例が実装されています。

  6. D列 / E列 / F列 / G列

      • 現在のコードでは全く参照していません(未使用)。

      • 必要であれば、自由に拡張して独自のカラムを使えます。





運用上のポイント


  • タイトルが空の行(I列が空)

  • M列(ステータス) に何か文字が入っている場合(「予約投稿済み」「投稿失敗:…」など)、再投稿を防ぐため自動でスキップします。

      • 「もう一度投稿したい」場合は、M列を空欄に戻すか、別のCSVに移すなどの対応が必要です。

  • カテゴリ (O列)・タグ (P列) は CSV で指定された名前を元に自動生成されます。

      • 既存のカテゴリ・タグがある場合は、それらを検索して ID を再利用します。

  • 投稿に成功すると、N列に日時が、S列に投稿IDが書き込まれます。

      • 失敗時には「投稿失敗: HTTPステータスコード」などが M列に入り、N列はエラーが発生した時刻が入ります。




もし列位置を変更したい場合


  • コード内では get_value_safe(row, X) の X が 0-based インデックスとして使われています。

  • たとえばタイトルが I列=8 に固定されている箇所は、別の列を使いたい場合は title_val = get_value_safe(row_data, 新しい列番号-1) のように書き換えてください。

  • 同様に COL_STATUS や COL_TIMESTAMP などの定数を変更すれば、ステータス管理列やタイムスタンプ列を別の場所に移動できます。




まとめ


  • 基本的には「A列 / B列 / C列」をリスト化し、H列以降の各種欄は1行ごとに投稿情報として扱う

  • M列 / N列 / S列 は状態管理(投稿済み/失敗/ID保存など)に使われる 重要な列 となります。

上記の表と説明を参考に、ご自身のCSVを作る際に


  1. 必要な列に必要なデータを入れる

  2. 不要な列は空欄でOK(あるいは列そのものを使わない)

  3. コードの一部を修正して自分好みのカラムマッピングにする

などの方法で運用してください。


この並びでないCSVを使う場合は、スクリプト内の列番号を適宜書き換えてください。例えば、タイトルがI列(インデックス8)であること、ステータスがM列であることなどが前提になっています。
自分のCSVの列順が違う場合は、その差分をきちんと追いかけ、get_value_safe(row_data, ○) の引数を正しい列番号に変更しましょう。

  1. コード全体の実行フロー
    スクリプトは以下の流れで動きます:

Python実行開始時に、.envファイルを読み込んで認証情報やTEST_MODEをセット
dataフォルダ以下にある全ての.csvファイルを再帰的に収集
各CSVファイルを読み込み、未投稿(ステータスが空)の行だけを抽出
1行ずつREST APIで記事を投稿。成功したらステータス列を「予約投稿済み」などの文字列に更新
全CSVの処理が終わったら終了(TEST_MODE=True時は1件投稿したら終了)
途中で投稿が失敗した場合は、その行のステータス欄に「投稿失敗: HTTPステータスコード」などが書かれます。原因追究した上で再実行すれば、失敗行以外は二重投稿を防止しながら進められます。

  1. コード(コピー用一部サンプル)
    次章では、いよいよ「フルバージョン」のスクリプトを掲載します。ですがその前に、実行フローの要となる部分を抜粋したサンプルを少しだけご紹介します:

CSVを探す処理例

csv_files = []
base_path = Path('data')
for p in base_path.rglob('*.csv'):
csv_files.append(str(p))
csv_files.sort() # ファイルパス順でソート

1ファイルずつ処理

for csv_path in csv_files:
with open(csv_path, 'r', encoding='utf-8', newline='') as f:
rows = list(csv.reader(f))
# ...行ごとにステータスを確認...
このように、pathlib の rglob()メソッドを使うことで、サブフォルダも含めて一気に.csvファイルをリスト化し、順番に開いていきます。
実際にはさらにAPI呼び出し部分やログ出力部分を追加する形となりますので、次のパートで

全体像をまとめたコード

を一気に公開します。併せて私が経験した細かい注意点も解説します。
それでは、ここからさらに深堀りしたソースコードの全容、および運用する際のコツや注意点を学んでいきましょう!

後半部分
いよいよ、フルバージョンのコードとともに、このコードを実際に運用する上での追加ノウハウやQ&A、トラブルシューティング例をまとめてご紹介します。ここを読み込んで実践すれば、誰でも同じように実行できるはずです。
私自身が数多くの失敗を経験したからこそ、“事前に知っておきたかった!”と思うテクニックや応用ポイントを盛り込んでいますので、ぜひ参考にしてください。

  1. フルソースコード(コピペで実行可)
    以下が、本マニュアルの最重要コピペ部分です。ご自身のプロジェクトディレクトリにwp_auto_post.pyという名前で保存し、.envファイルやvenv環境を整えた上で実行すれば、そのまま動くようになっています。

コピペ用

ここから先は

40,391字

Amazon Payで支払うと最大2%還元のチャンス! 9/30まで

この記事が気に入ったらチップで応援してみませんか?