
WC 11.0の注文アイテム削除アクションタイミング変更と開発者対応
WooCommerce 11.0.0のリリースに伴い、注文アイテム削除時のアクションフック woocommerce_removed_order_items の発火タイミングが大きく変わった。これまでは削除メソッド内で即座にデータベースからアイテムを消した直後にフックが走っていたが、今後は save() が呼ばれるタイミングまで遅延される。
この変更の本質は、注文復元フローで発生し得る「行アイテム消失」バグの修正だ。決済中断後の再開処理で、意図せず注文明細が空になる問題がこれで解消される。ただし、従来のタイミングを前提にした拡張機能やカスタムコードは、コールバックの変更が必要になる可能性がある。
この記事では、変更の背景、具体的な動作の差、そして開発者が取るべき対応策を整理する。内部的で動作確認用のフックに依存している開発者は特に注意が必要だ。
WooCommerce 11.0の注文アイテム削除フックに何が起きたのか

WooCommerceのコアクラス WC_Abstract_Order には、注文アイテムをまとめて削除する remove_order_items() メソッドがある。このメソッドは、チェックアウト時に注文内容を再構築する場面などで内部的に呼ばれる。
10.9系以前では、remove_order_items() が呼ばれるとすぐにデータベースから該当のアイテム行が削除され、その直後に woocommerce_removed_order_items アクションが発火していた。いわば「削除してからお知らせ」の流れだ。
11.0.0からは、アイテムのデータベース削除そのものは save() が呼ばれるまで引き延ばされる。そして woocommerce_removed_order_items アクションは、実際に削除がコミットされた直後の save_items() 内で発火するようになった。すぐに消さず、「保存のタイミングで消して知らせる」形へと変更されたわけだ。
この図のように、preフック(woocommerce_remove_order_items)の位置は変わっていない。変更されたのはpostフックのほうだけで、発火の場所が remove_order_items() の中から save_items() へと移動した。
なぜ削除の遅延が必要だったのか

変更の直接のきっかけは、チェックアウト時の注文再開フローで発生していたバグだ。WooCommerceの内部では、決済途中で何らかのエラーや中断が起きた場合、同じ注文データを使って再開を試みる仕組みがある。
10.9以前の処理は次のような流れだった。まず remove_order_items() で既存のアイテムをデータベースから削除し、その後に新しい内容を再構築して save() で保存する。ところが、削除と再構築の間に何らかの例外が発生したり、決済ゲートウェイが二重チェックアウトをトリガーしたりすると、新しいアイテムが書き込まれないまま保存処理に進んでしまうケースがあった。
その結果、合計金額は正しいのに注文明細が空になるという不整合が発生していた。管理者や店舗スタッフから見ると「注文はあるのに何を買ったのかわからない」状態で、商売上の大きな問題だ。
そこで11.0.0では、データベースからの削除を save() のタイミングまで遅延させる設計に変更された。これにより、再構築の途中で何か問題が起きても、直前の正しい注文内容がデータベース上に残っている。中断したら元のまま、成功したら新しい内容で上書きされる。再開フロー全体が原子的になるわけだ。
preフックの woocommerce_remove_order_items は引き続き remove_order_items() の先頭で同期的に発火する。postフックだけが「保存時に遅延」される形になる。両方のフックを組み合わせて使っているコードだけが影響を受ける可能性がある。
開発者が影響を受ける具体的なパターン

今回の変更は、あらゆる拡張機能に一律で影響するわけではない。影響を受けるかどうかは、フックの使い方によって明確に切り分けられる。
影響を受けるケース
次のようなコードが該当する。
woocommerce_removed_order_itemsにコールバックを追加し、その中で「アイテムはもうデータベースに存在しない」という前提で処理を行っているwoocommerce_remove_order_items(pre)とwoocommerce_removed_order_items(post)のペアで一連の操作を挟み込んでいるremove_order_items()が戻った直後に「データベースからアイテム行が消えている」と期待している
要するに、postフックが「同じコールスタック内ですぐ実行される」という暗黙の前提に依存しているコードは、動作が変わる可能性が高い。
影響を受けないケース
一方、次のような使い方をしている場合は問題ない。
- 最終的な保存済みの注文状態だけを監視する目的でpostフックを使っている
- コールバック内で、DB削除がコミットされた後の最終状態だけを参照している
- WooCommerceコア自体にはこのフックの利用箇所はないため、標準機能への影響はゼロ
postフックは変わらず「データベース削除の完了後」に発火するため、単純に「削除が終わったことを検知したい」だけのコードはそのまま動く。
開発者が今すぐ取るべき具体的な対応

コールバックの動作確認と修正
影響を受ける可能性のあるコードを発見したら、まず次の3点を確認してほしい。
remove_order_items()が戻った直後にデータベースのアイテム削除を前提にしている場合は、削除を期待する処理の前に明示的に$order->save()を呼ぶ- preフックとpostフックをペアで使っている場合は、postフックのロジックを注文の保存後に実行するように再構成する
- 動作確認はWooCommerce 11.0.0以降の環境で必ず実施する
コールバックが単に「削除後の状態を見たい」だけなら、特に対応は不要だ。postフックは依然としてDB削除のコミット後に発火するため、観測できる最終状態に違いはない。
save() を明示的に呼ぶことの意味
11.0.0以降のバージョンでは、remove_order_items() を呼んだだけではデータベースへの変更は一切発生しない。あくまでオブジェクトの内部状態が変わるだけだ。データベースへの反映は後続の save() でまとめて行われる。
つまり、「アイテムが消えた状態の注文をデータベース上で確定させたい」のであれば、プログラムの流れの中で明示的に $order->save() を実行する必要がある。これは今回の変更を正しく扱う上で最も重要なポイントだ。
この変更がもたらす開発者体験への影響

一見すると「動いていたコードが壊れるのか」と不安に思うかもしれないが、この変更の根底にはコードの安全性を高めるという明確な意図がある。削除と保存を分離することで、中途半端な状態に陥る可能性を根本から断ち切っている。
WooCommerceの内部設計に詳しい開発者であれば、データベース操作の遅延実行はむしろ現代的なパターンだと感じるだろう。トランザクション的な一貫性を重視する設計は、拡張機能の品質向上にもつながる。
影響範囲が限定的であることも安心材料だ。WooCommerceコア自身はこのフックを消費しておらず、実質的にはサードパーティ製のプラグインやテーマだけが該当する。大半のショップ運営者は特に意識することなくアップデートできる。
この記事のポイント
- WooCommerce 11.0.0で
woocommerce_removed_order_itemsフックの発火タイミングがsave()実行時へ変更された - preフックの
woocommerce_remove_order_itemsは変わらず同期的に動作する - 変更の目的は注文再開時の行アイテム消失バグの修正で、削除処理を遅延させることで安全なフローを実現
- postフックが「削除直後に走る」ことを前提にしたコードのみが影響を受ける可能性がある
remove_order_items()の直後にDB反映を期待するなら明示的にsave()を呼ぶこと

・ 複数業界における17年間のデジタルビジネス開発経験
・ ウェブサイト開発のためのHTML、PHP、CSS、JavaScript等の実用的知識
・ 15ヶ国語対応の多言語SaaSの開発経験
・ 17年間にも及ぶ、Eコマース長期運営経験
・ 幅広い業界でのSEO最適化の豊富な経験

Events Manager更新後に公開イベントが下書きに戻る原因と修正
Events Manager 7.3.7.4 にアップデート後、公開済みイベントの編集画面で「更新」をクリックすると、ステータスが「下書き」に戻ってしまう現象が報告されている。原因は、終日設定のイベントに対してタイムレンジ(時間範囲)が重複してデータベースに登録されてしまうことだ。このバグにより、プラグイン内部のバリデーションが失敗し、自動的に下書きへと巻き戻される。データベースの重複を削除し、プラグインファイルに一時的なパッチをあてることで解決する。
なぜ公開済みイベントが更新時に下書きに戻ってしまうのか

Events Manager はイベントを表す EM_Event クラスが、記事が保存される前に validate_meta() メソッドで内部データの整合性をチェックしている。このチェックに引っかかると wp_insert_post_data フックが介入し、投稿ステータスを強制的に「下書き」に変更する仕様だ。
今回の問題では、「Timeranges cannot overlap with each other.(タイムレンジが重複しています)」というエラーが発生している。しかし、エディタ上では終日(All Day)設定の単一の時間範囲しか表示されていない。実際にデバッグ出力を取得すると、同一イベントに属する同一の終日タイムレンジ(開始 00:00:00、終了 23:59:59)が2件存在しており、これが重複エラーの直接的な原因だ。
データベースで重複したタイムレンジを削除する手順

STEP 1:必ずデータベースをバックアップする
今回の作業ではデータを直接操作するため、必ず事前にデータベース全体のエクスポートを取得する。何か問題が起きても元に戻せるようにしておこう。
STEP 2:重複タイムレンジを検出する
テーブル名はプラグインの設定により異なるが、多くは wp_em_timeranges となる。phpMyAdmin のSQLタブで次のクエリを実行し、同一 event_id・同一 timerange_start・timerange_end の組み合わせが複数存在しないか確認する。
SELECT event_id, timerange_start, timerange_end, COUNT(*)
FROM wp_em_timeranges
GROUP BY event_id, timerange_start, timerange_end
HAVING COUNT(*) > 1;結果が返ってきたら、該当の event_id をメモしておく。
STEP 3:重複行のうち一方を削除する
重複している行のうち、より古いIDの行を削除する。以下のクエリは最も小さい ID 以外を削除する例だ。必ず削除対象を SELECT で事前確認してから実行する。
DELETE t1 FROM wp_em_timeranges t1
INNER JOIN wp_em_timeranges t2
WHERE t1.timerange_start = t2.timerange_start
AND t1.timerange_end = t2.timerange_end
AND t1.event_id = t2.event_id
AND t1.ID > t2.ID;STEP 4:イベントを再編集して正常に保存されるか確認する
データベースの重複を除いたら、WordPress管理画面に戻り、該当のイベント編集画面を開く。内容を微修正して「更新」をクリックし、再び「下書き」に戻らず公開状態が維持されることを確かめる。
プラグインファイルの一時修正で重複登録を防ぐ

根本的な原因は、何らかのトリガーでタイムレンジオブジェクトが二重に追加されてしまうことだ。以下は EM_Event::validate_meta() の中で重複を除去する応急処置のコード例だ。必ずファイルのバックアップを取ったうえで追記する。
// events-manager/classes/em-event.php の validate_meta メソッド内
public function validate_meta( $data, $postarr ) {
// タイムレンジを取得して重複を排除する
$timeranges = $this->get_timeranges();
$unique_timeranges = [];
foreach ( $timeranges as $timerange ) {
// timerange_group_id などのキーで一意にする
$key = $timerange->timerange_group_id . '_' . $timerange->timerange_start . '_' . $timerange->timerange_end;
if ( ! isset( $unique_timeranges[ $key ] ) ) {
$unique_timeranges[ $key ] = $timerange;
}
}
// 重複排除済みのコレクションでバリデーション
if ( ! $unique_timeranges || ! $this->validate_timeranges_collection( $unique_timeranges ) ) {
// エラー処理...
}
// 以下略
}ただし、このパッチはあくまで暫定的なものだ。プラグインが公式に修正をリリースするまでは、更新のたびに再適用が必要になる。公式サポートフォーラムを定期的に確認し、バグ修正版がリリースされたら速やかにアップデートしよう。
よくある質問
この問題はイベントマネージャーのどのバージョンから発生したのか
少なくとも 7.3.7.4 で報告されている。それ以前のバージョンでは発生していなかった可能性が高いが、同様の重複が偶発的に起きているケースもある。
クラシックエディターを使えば回避できるか
根本原因はデータ保存時のバリデーションにあるため、グーテンベルクエディターかクラシックエディターかは関係ない。ただし、編集画面のUIの違いでトリガーが変わる可能性は否定できない。試す価値はある。
終日イベント以外でも起こるのか
現在報告されているのは終日設定時のケースだ。しかし、時間指定のあるイベントでも重複が起きれば同じエラーで下書きに戻る。該当イベントの編集時は要注意だ。
データベースを直接触らずに直す方法はあるか
現時点では、管理画面から重複を操作できる機能はない。比較的安全な方法としては、一度イベントを複製→元のイベントを削除→複製イベントを公開する、という手順でタイムレンジが正常な状態になることがある。
公式の修正はいつリリースされるのか
これはバグトラッカーや公式フォーラムを見守るしかない。開発チームが認識している問題であれば、次のパッチに含まれる可能性がある。
この記事のポイント
- Events Manager 7.3.7.4 で発生する既知のバグで、バリデーションエラーによってステータスが下書きに変更される
- 原因は終日イベントのタイムレンジがデータベース上で重複していること
- phpMyAdmin から重複行を削除することで一時的に解決する
- プラグインファイルの修正パッチで再発を防げるが、公式アップデートまでは注意が必要
- データベース操作前には必ずバックアップを取得する

・ Reddit、Stack Overflow、WordPress.org フォーラムを日々巡回し、現場の悩みを拾い上げて記事化
・ WordPress、WooCommerce、Next.js などモダンWeb制作領域のトラブルシューティングが専門
・ 「検索しても答えが見つからなかった」を一つでも減らすことが目標
・ エラーメッセージから根本原因にたどり着く粘り強い調査が得意
・ 初心者がつまずきやすい箇所を先回りで解決する記事作りを心がけている

WooCommerceのバグ修正キャンペーン「Bug Blitz」で150件以上のバグを短期間で解決
WooCommerceのサポートチームが「Bug Blitz」と呼ばれる集中キャンペーンを実施した。数週間という短期間で、カタログ内20以上の製品に対して150件以上のバグ修正をリリースした。この取り組みは、サポートエンジニアリングの未来像と製品開発への関わり方を根本から変える可能性を示している。
バグ修正キャンペーンは、既知のバグがバックログに滞留する現状を改善する目的で始まった。サポートチームの技術力を活用し、AIツールを駆使することで、従来の開発プロセスを超えるスピードでの問題解決を実現した。この実験的な取り組みから得られた知見は、AI時代のサポート業務の在り方に大きな示唆を与える。
Bug Blitzの始まりと基本コンセプト

Bug Blitzの発端は、WooCommerceのアーティスティックディレクター兼リードであるBeau氏と、サポートチームのリーダーとの会話だった。両者は「修正方法の見当がついている既知のバグがバックログに放置されるべきではない」という点で意見が一致した。この問題意識を共有し、Automatticの品質部門責任者であるLance氏を巻き込んでプロジェクトが動き始める。
「できるだけ多くのバグを修正する」というシンプルな目標
Lance氏が「Bug Blitz」と名付けたこのキャンペーンのコンセプトは極めてシンプルだ。WooCommerceのサポートエンジニア全員に参加を呼びかけ、「できるだけ多くのバグを修正する」ことを目標に掲げた。品質エンジニアチームが迅速にレビューを行い、修正を可能な限り早くリリースするという流れを確立した。
ここでの「Happiness Engineers」とは、WooCommerceがサポートチームメンバーに与える称号である。顧客の満足度向上を使命とする彼らが、直接的に製品の品質改善に携わる機会を設けた点がこのプロジェクトの特徴だ。
技術的サポートスタッフのリーダーシップ発揮
キャンペーン開始後、技術力の高いサポートスタッフが自然とリーダーシップを発揮し始めた。単に先頭に立つだけでなく、他のメンバーへの指導役としても活躍した。あるHappiness Engineerは、WooCommerce開発環境をセットアップするためのClaude Skillを作成した。別のチームは、ClaudeのSuperpowersプラグインをベースにしたバグ修正支援スキルを開発した。
複数のチームが週次ミーティング中にチュートリアルを開催するなど、知識共有の文化が自然発生した。Developer WooCommerce Blogの記事では、この現象を「人々は単に製品を構築しているだけでなく、互いを構築していた」と表現している。
キャンペーンがもたらした3つの変化

Bug Blitzは単なるバグ修正キャンペーンを超え、組織に複数の重要な変化をもたらした。チームの士気向上、業務の本質的な変容、そして製品への直接的な貢献という3つの側面で影響が確認された。
1. 部門全体に広がった熱気とエンゲージメント
キャンペーン発表後、部門全体に独特の熱気が生まれた。Happiness EngineerのKamlesh Vidhani氏は「これは本当に素晴らしいですね。これに取り組むのが楽しみです」というメッセージを寄せた。顧客を助けることの喜びはサポート業務の原動力だが、有形の何かを構築したり貢献したりする感覚も同様に強力な動機付けとなることが実証された。
AIの能力が高まる中、サポート業界を含む多くの職種で将来への不安が広がっている。このような実験は、単純な顧客質問への回答ではなく、顧客インタラクションと製品構築を密接に結びつけることが未来の方向性であることを明確に示した。
2. 製品への直接的な貢献実績
数週間にわたるBug Blitz期間中、チームは170件以上の修正を提出した。その多くは小規模な修正だったが、顧客体験には非常に大きな影響を与えるものばかりだった。長期間バックログに滞留していた問題や、他の高優先度エンジニアリング作業の影で緊急性が低く見られていた問題が数多く解決された。
サポートチームが直接的に製品の品質向上に貢献するという新しいモデルが機能したことで、組織内の境界線が再定義されるきっかけとなった。
3. サポートエンジニアリングという職種の変容
Developer WooCommerce Blogの記事では、サポートエンジニアリングという職種そのものが変化していると指摘している。WooCommerceでは既に全員がAIツールを日常的に利用することが期待されているが、さらに一歩進んで「エージェント的アプローチ」への移行が進んでいる。
エージェント的アプローチとは、AIツールが実際に業務の一部を実行する形態を指す。近い将来、サポートに携わるすべての人間は複数のAIエージェントを管理・指導する必要が出てくると予想されている。草案をレビューするエージェント、トラブルシューティングを支援するエージェント、バグを報告するエージェント、そして修正するエージェントなど、専門化されたAIエージェント群を統括する役割が人間に求められる。
AIツールを駆使した新しい開発アプローチ

Bug Blitzでは、従来の「コパイロット」としてのAI活用を超えた、より積極的なAI統合が試みられた。Claude Code経験のあるHappiness Engineersはスキルやエージェント作成に集中し、経験の浅いメンバーは実際のコーディングに挑戦するという分業が自然発生した。
GitHub CopilotからClaude Codeへの進化
プロセス全体でGitHubのCopilotが広範に使用されたが、それだけにとどまらなかった。Claude Codeなどのツールがバグ修正コードの大部分を実際に記述する段階まで進んだ。これは単なる補助ツールとしての活用を超え、AIが開発プロセスの中心的な役割を担う新しいパラダイムを示している。
このアプローチの有効性は、短期間での大量のバグ修正という具体的な成果によって証明された。AIツールの適切な活用により、必ずしも高度なコーディングスキルを持たないサポートスタッフでも、実質的なコード貢献が可能になることが実証された。
エージェントによる自動修正への道筋
Bug Blitzが示す未来のサポートモデル

この実験的な取り組みは、サポート業務の未来像を具体的に描き出す貴重なデータを提供した。製品への影響力がより直接的になる未来、そして「迅速修正メンタリティ」が標準となる未来が現実味を帯びてきた。
製品への直接的な影響力の拡大
Bug Blitzの最大の成果の一つは、サポートチームが製品開発に対してこれまで以上に直接的な影響力を行使できる道筋を示した点にある。顧客からのフィードバックを最も間近で受け取る立場にあるサポートスタッフが、その知見を即座に製品改善に反映させる仕組みが構築されつつある。
このモデルが成熟すれば、顧客の声から実際の製品修正までのリードタイムが大幅に短縮される。市場の要求変化に迅速に対応できる競争優位性を獲得できる可能性がある。
「迅速修正メンタリティ」の実現に向けて
WooCommerceチームの最終目標は「迅速修正メンタリティ」の確立にある。これは、何かが壊れたらほぼ即座に修正されるという文化とプロセスを指す。Bug Blitzはこの目標に向けた重要な一歩となった。
次の実践的なステップとして、バグが報告されると同時にエージェントが自動的に修正作業を開始する仕組みの構築が検討されている。現在のAI開発の可能性を考慮すると、この現実化まであと数か月しかかからないと見られている。
開発者ブログの記事では、同様の実験を今後も繰り返し行い、サポートの未来形を模索していく方針が示されている。AI技術の進化に合わせて、人間とAIの役割分担を最適化する継続的な改善プロセスが重要となる。
この記事のポイント
- WooCommerceサポートチームは「Bug Blitz」キャンペーンで数週間で150件以上のバグ修正を実施した
- 技術力の高いサポートスタッフがリーダーシップを発揮し、チーム内の知識共有文化が促進された
- AIツールを駆使した新しい開発アプローチにより、従来の開発プロセスを超えるスピードでの問題解決が可能になった
- サポートエンジニアリングは「エージェント的アプローチ」へ移行しつつあり、人間は複数のAIエージェントを管理する役割へと進化する
- この実験は「迅速修正メンタリティ」の確立に向けた重要な一歩であり、製品への直接的な影響力拡大の道筋を示した

・ 複数業界における17年間のデジタルビジネス開発経験
・ ウェブサイト開発のためのHTML、PHP、CSS、JavaScript等の実用的知識
・ 15ヶ国語対応の多言語SaaSの開発経験
・ 17年間にも及ぶ、Eコマース長期運営経験
・ 幅広い業界でのSEO最適化の豊富な経験
