WordPressカテゴリーを一括変更する方法|wp-cli+CSVで効率化

WordPressで記事を運営していると、「大量の投稿カテゴリーをまとめて変更したい」という場面に出会うことがあります。管理画面から一つずつ編集する方法では膨大な時間がかかり、作業ミスも増えてしまいがちです。プラグインを使って一括編集する手段もありますが、不要な機能が増えたり管理コストが高まるのが悩みどころです。

そこで便利なのが wp-cliCSVファイル を組み合わせる方法です。

サーバー上で直接コマンドを実行し、CSVにまとめた情報をもとにカテゴリーを一括変更できるため、大規模なサイト運営でも効率的に管理できます。本記事では、WordPressのカテゴリーをwp-cliとCSVを使って一括変更する手順を、実際のスクリプト例とあわせて解説していきます。

前提条件と準備

カテゴリーを一括変更する前に、いくつかの準備を整えておく必要があります。特にwp-cliを利用する場合は、環境やデータの取り扱いに注意しておくことが大切です。

wp-cliが利用可能な環境

まず大前提として、wp-cli が使える環境であることが必要です。サーバーにSSH接続できる場合や、ローカル環境にWordPressを構築している場合に導入できます。インストールされているかどうかは以下のコマンドで確認可能です。

wp --info

このコマンドでバージョン情報が表示されれば準備完了です。

CSVファイルを扱える環境

次に、変更対象の投稿とカテゴリーを整理したCSVファイルを準備します。ExcelやGoogleスプレッドシートなど、一般的な表計算ソフトで問題ありません。UTF-8形式で保存できるツールを使うと、文字化けを防ぎやすくなります。

バックアップの重要性

最後に忘れてはいけないのがバックアップです。カテゴリーの変更は大量に実行すると元に戻すのが難しく、誤った操作でサイト全体の分類が崩れてしまう可能性があります。必ずデータベースのバックアップを取得してから作業を始めましょう。特に本番環境では、変更前に開発環境でテストを行うことを強く推奨します。

WordPressカテゴリー一括変更のアプローチ

WordPressでカテゴリーをまとめて変更する方法はいくつか存在しますが、それぞれにメリットとデメリットがあります。運営しているサイトの規模や作業頻度に応じて、最適な方法を選ぶことが大切です。

管理画面から手作業

もっともシンプルなのは、WordPressの管理画面から投稿を選択し、カテゴリーを編集する方法です。数件程度の変更であれば手軽に行えますが、数百件、数千件といった大量の投稿に対しては極めて非効率です。作業時間が長くなるだけでなく、人的ミスも発生しやすくなります。

プラグインを利用する方法

「一括編集プラグイン」を導入することで、管理画面上から複数投稿のカテゴリーを一度に変更することも可能です。ただし、プラグインを増やすことでサイトの管理が煩雑になり、セキュリティリスクやアップデート対応の負担が増える点は無視できません。また、サイトによってはプラグインの動作が重くなるケースもあります。

wp-cli+CSVを使う方法

効率性と柔軟性を両立できるのが wp-cliとCSVの組み合わせ です。CSVファイルに投稿IDとカテゴリーを整理しておき、wp-cliコマンドで一括変更すれば、数百件以上の操作でも高速に処理できます。一度作成したスクリプトは繰り返し利用できるため、今後のカテゴリー整理や定期的な分類変更にも役立ちます。

この方法を採用することで、プラグイン不要で安全かつ効率的にカテゴリー管理を自動化することが可能になります。

CSVファイルの準備方法

カテゴリーを一括変更するためには、まず CSVファイル を準備する必要があります。このCSVがwp-cliの実行対象となるため、正しく整形することが成功のポイントです。

CSVの基本例

CSVファイルは以下のように、1行ごとに「投稿ID」と「新しいカテゴリーID」を記載します。

post_id,new_category
101,5
102,7
103,5

上記の例では、投稿ID「101」をカテゴリーID「5」に変更し、「102」を「7」に割り当てる、といった内容になります。

投稿IDを取得する方法

投稿IDは以下の方法で確認できます。

  • 管理画面から確認
    投稿一覧ページで記事タイトルにカーソルを合わせると、URLの末尾に post=数字 が表示されます。この数字が投稿IDです。
  • wp-cliで取得
    wp-cliを使えば一覧で取得可能です。 wp post list --fields=ID,post_title,post_date --post_type=post このコマンドで投稿IDとタイトルをまとめて表示できます。

複数カテゴリーに対応する場合

1つの投稿に複数カテゴリーを設定したい場合は、カテゴリーIDをスペース区切りまたはカンマ区切りで記述します。

例:スペース区切り

post_id,new_category
104,"5 7"
105,"3 8"

この場合、投稿ID「104」にはカテゴリーID「5」と「7」が同時に割り当てられます。

例:カンマ区切り(スクリプト側で調整する場合)

post_id,new_category
106,"5,7,9"

実装方法によって解釈が異なるため、事前に小規模なテストを行って形式を統一しておくことをおすすめします。

wp-cli+Bashスクリプトの実装例

カテゴリー変更は、単発コマンドでもCSVを読むスクリプトでも実行できます。まずは最低限のコマンドから確認し、その後に実運用向けのBash例を示します。

基本コマンド例

特定の投稿にカテゴリーIDを割り当て(置き換え)ます。

# 投稿ID 101 を カテゴリーID 5 に置き換え
wp post term set 101 category 5
  • 既存のカテゴリーを置き換えたい → wp post term set
  • 既存に追加したい → wp post term add 101 category 5
  • スラッグ指定で操作したい → --by=slug を併用(例:wp post term set 101 category news --by=slug

CSVを読み込むBashスクリプト例

以下は、categories.csv(例:post_id,new_category)を読み、置き換えで一括反映する例です。
複数カテゴリーは「スペース区切り」または「カンマ区切り」を想定し、どちらでも動くようにしています。

#!/usr/bin/env bash
set -euo pipefail

CSV_FILE="categories.csv"   # ヘッダー: post_id,new_category
DRY_RUN=false               # true にすると実行せずコマンドだけ表示

# 依存チェック
command -v wp >/dev/null 2>&1 || { echo "wp-cli が見つかりません"; exit 1; }
[[ -f "$CSV_FILE" ]] || { echo "$CSV_FILE が見つかりません"; exit 1; }

# CSVを1行ずつ処理
# 先頭行(ヘッダー)はスキップ
tail -n +2 "$CSV_FILE" | while IFS=, read -r post_id new_category; do
  # 余分な空白・ダブルクォートを除去
  post_id="${post_id//\"/}"
  new_category="${new_category//\"/}"
  post_id="$(echo -n "$post_id" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')"
  new_category="$(echo -n "$new_category" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')"

  # 入力バリデーション
  [[ -z "$post_id" || -z "$new_category" ]] && { echo "スキップ: 不正な行($post_id, $new_category)"; continue; }

  # カンマ区切りをスペース区切りに正規化(例: "5,7,9" → "5 7 9")
  new_category_norm="$(echo "$new_category" | tr ',' ' ')"

  # 実行コマンド(置き換え: set / 追加: add)
  cmd=(wp post term set "$post_id" category $new_category_norm --quiet)

  if $DRY_RUN; then
    printf '[DRY_RUN] %q ' "${cmd[@]}"; printf '\n'
  else
    # 実行(失敗時に投稿IDを表示)
    if ! "${cmd[@]}"; then
      echo "エラー: 投稿ID $post_id のカテゴリー更新に失敗" >&2
    fi
  fi
done

echo "処理が完了しました。"

ポイント

  • DRY_RUNtrueにして、**本番前に“実行せず確認”**ができます。
  • post_id,new_categoryヘッダーの2列想定new_categoryは「IDのスペース区切り」または「カンマ区切り」に対応。
  • 置き換えを行うために wp post term set を使用(既存カテゴリを残したい場合は add を利用)。

処理の流れ解説(CSV → ループ → wp-cli実行)

  1. CSVの読み込みtail -n +2 でヘッダーを除外し、1行ずつ post_idnew_category を取得。
  2. 正規化"5,7,9" のようなカンマ区切りはスペース区切りへ変換し、wp-cliに渡しやすく整形。
  3. wp-cli実行wp post term set <post_id> category <IDs...> を呼び出し、各投稿のカテゴリーを一括置き換え
  4. 安全運用DRY_RUNで事前確認 → テスト環境で小規模実行 → 本番でフル実行、の順でリスクを低減。

実行と確認手順

準備したCSVとBashスクリプトを用意したら、いよいよ実際にコマンドを実行します。作業は必ずテスト環境で一度試し、その後に本番環境で実行するのが安全です。

コマンド実行の流れ

  1. スクリプトに実行権限を付与します。 chmod +x change-categories.sh
  2. DRY_RUNモードでテスト(スクリプト内の DRY_RUN=true を設定)。
    コマンド内容だけを表示し、実際の変更は行われません。
  3. 問題なければ DRY_RUN=false にして実行します。 ./change-categories.sh

成功したか確認するコマンド例

変更が反映されたかどうかをwp-cliで確認できます。

  • 特定の投稿に付与されているカテゴリーを確認する場合: wp post term list 101 category --fields=term_id,name,slug → 投稿ID 101 に割り当てられたカテゴリー一覧が表示されます。
  • 複数件を一括で確認する場合: wp post list --fields=ID,post_title,post_date --post_type=post --format=table ここでIDを指定して順に確認すると確実です。

エラーが出た場合のチェックポイント

  • wp-cliが実行できない
    → サーバー環境にwp-cliがインストールされているか確認(wp --info)。
  • カテゴリーIDが存在しない
    wp term list category --fields=term_id,name,slug で正しいIDを確認。
  • CSVの文字化けや改行問題
    → UTF-8形式で保存し、改行コードがLFになっているか確認。
  • パーミッションエラー
    → スクリプトに実行権限があるか (chmod +x) 確認。
  • 途中で処理が止まる
    set -e を外してエラーメッセージを確認し、該当行のCSVデータを見直す。

エラーが出ても焦らず、まずは小規模データで再現テストを行うことがトラブル防止につながります。

応用編

基本の「カテゴリー一括置き換え」だけでなく、wp-cliとCSVを組み合わせることで柔軟な操作が可能になります。ここでは、よくある応用パターンを紹介します。

複数カテゴリーの追加・上書き方法

通常の wp post term set既存のカテゴリーを置き換えますが、追加で割り当てたい場合は add を使用します。

# 投稿ID 201 にカテゴリーID 5 を追加
wp post term add 201 category 5

複数カテゴリーをまとめて追加することも可能です。

wp post term add 201 category 5 7 9

CSVと組み合わせれば、「基本カテゴリーを残したまま新しい分類を追加する」といった運用も簡単に実現できます。

タグなど他のタクソノミーでも応用可能

wp-cliの post term コマンドは、カテゴリーだけでなくタグやカスタムタクソノミーにも対応しています。

# 投稿ID 305 にタグID 12 を設定
wp post term set 305 post_tag 12
# 投稿ID 306 にカスタムタクソノミー "genre" のID 4 を設定
wp post term set 306 genre 4

記事分類を独自に設計している場合でも、この方法を応用すれば一括管理が可能になります。

定期的なカテゴリー整理の自動化(cronジョブ化)

CSVを更新し、スクリプトを cronジョブ に登録すれば、定期的にカテゴリーを整理する仕組みも構築できます。

例:毎週日曜深夜に実行する場合(cron設定例)

0 3 * * 0 /var/www/html/change-categories.sh >> /var/log/wp-cli-categories.log 2>&1

これにより、投稿数が増えてもCSVさえ最新化しておけば、自動的にカテゴリー分類が反映されます。特にニュースサイトや大量の記事を扱うメディア運営において有効です。

注意点とベストプラクティス

wp-cliとCSVを使ったカテゴリーの一括変更は強力な手法ですが、その分だけリスクも伴います。安全に運用するためには、以下の点を意識することが大切です。

大量変更の前には必ずバックアップを取る

投稿データやタクソノミーの変更は、一度実行すると元に戻すのが難しいケースがあります。特に「置き換え」を実行すると、既存のカテゴリー情報が失われるため注意が必要です。必ずデータベースのバックアップを取得し、復元できる状態を確保してから作業を行いましょう。

開発環境でテストしてから本番で実行

いきなり本番環境で実行するのは危険です。小規模なCSVを使い、開発環境やステージング環境で動作確認を行いましょう。スクリプトが正しく動作するか、意図したカテゴリー変更になっているかを確認してから本番に適用するのがベストです。

CSVの文字コードや改行コードに注意(UTF-8推奨)

CSVファイルは、文字コードや改行コードの違いで不具合が起きることがあります。特に日本語を含むファイルでは、UTF-8(BOMなし) で保存するのがおすすめです。また、Windows環境で作成したCSVをLinuxサーバーに持ち込む場合は、改行コードをLFに変換しておくと安全です。

これらの基本的なベストプラクティスを守ることで、大規模なサイトでも安心してカテゴリー整理を自動化できます。

まとめ

WordPressのカテゴリーを一括で変更する作業は、管理画面だけでは時間も手間もかかってしまいます。しかし、wp-cliとCSVを組み合わせることで、高速かつ正確に一括処理が可能になります。

  • コマンドラインから実行できるため、大量投稿でも一瞬で処理が完了する
  • CSVファイルを使うことで、変更内容を一覧化・再利用できる
  • プラグインを追加せずに運用できるため、サイトを軽量かつ安全に保てる

特に、日々の更新に追われる忙しい運営者にとっては、作業時間を大幅に削減できる効率化の手法です。一度スクリプトを整備しておけば、将来のカテゴリー整理や分類変更もスムーズに進められるでしょう。

「プラグインに頼らず、シンプルで再現性の高い運用を実現したい」 という方にこそ、wp-cli+CSVを使った一括変更はおすすめです。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント