2026年7月2日

2026年7月2日

WooCommerceの注文ステータスが変わらない原因と、独自ステータスの追加方法

WooCommerceの注文ステータスは、決済の結果や管理者の操作によって切り替わります。「支払い待ちのまま処理中にならない」「処理中から完了に自動で変わらない」といった相談の多くは、ステータスが変わる条件を知ると原因が分かります。この記事では、標準のステータスと切り替わる仕組み、変わらないときの確認手順、独自ステータスの追加方法を説明します。

ステータスの日本語表記は、WooCommerceのバージョンや翻訳によって異なることがあるため、英語名とコード上の名前(スラッグ)を併記します(2026年10月時点)。

標準の注文ステータスと意味

日本語表記の例 英語名 スラッグ 意味
支払い待ち Pending payment pending 注文は受け付けたが、支払いがまだ
処理中 Processing processing 支払いを受け取り、在庫を減らした。発送などの対応待ち
保留中 On hold on-hold 在庫は減らしたが、支払いの確認が必要(銀行振込など)
完了 Completed completed 対応が終わった
キャンセル Cancelled cancelled 管理者または顧客が取り消した
返金済み Refunded refunded 全額を返金した
失敗 Failed failed 支払いが失敗した、または拒否された
下書き Draft checkout-draft ブロック版の決済画面で、注文確定前に一時的に作られる記録

コードでは、データベースに保存するときは wc-processing のように wc- を付けた名前、update_status() などに渡すときは processing のように wc- を外した名前を使います。

ステータスが切り替わる仕組み

支払いが確認されると「処理中」か「完了」になる

決済プラグイン(ゲートウェイ)が支払いの完了をWooCommerceに伝えると、注文は次のどちらかになります。

  • 配送が必要な商品を含む注文:「処理中」(processing)
  • すべての商品が「バーチャル」かつ「ダウンロード」の注文:「完了」(completed)

WooCommerceのソースコードでは、バーチャルかつダウンロード可能な商品だけの注文は処理が不要と判定され、直接「完了」になります。「処理中」から「完了」へは、WooCommerceが自動で切り替えることはありません。発送などが終わったら、管理者が「完了」に変更します。

銀行振込などは「保留中」になる

銀行振込(BACS)のように、入金をお店が自分で確かめる決済方法では、注文は「保留中」(on-hold)になります。入金を確認したら、管理者が手動で「処理中」や「完了」に変えます。

未払いの注文は自動でキャンセルされることがある

「WooCommerce」→「設定」→「商品」→「在庫」の在庫保持時間(Hold stock)が設定されていると、その時間を過ぎた決済画面からの「支払い待ち」の注文は、自動で「キャンセル」になります。この処理はWordPressのスケジュール機能(WP-Cron)で動くため、WP-Cronを止めている環境では、サーバー側のcronが正しく動いているかも確認してください。

「支払い待ち」のまま変わらないときの確認手順

  1. 注文メモを見る:注文の編集画面の右側にある注文メモに、決済プラグインからの記録やステータスの変更履歴が残ります。支払いの記録がなければ、WooCommerceまで支払い完了の通知が届いていません
  2. 決済サービス側の管理画面を見る:決済サービスで支払いが成功しているかを確認します。成功しているのに注文が変わらない場合は、決済サービスからサイトへの通知(Webhookなど)が届いていない可能性があります
  3. 決済プラグインのログを見る:「WooCommerce」→「ステータス」→「ログ」で、決済プラグインのログを確認します。多くの決済プラグインは、設定画面でログの記録を有効にできます
  4. 通知を妨げるものがないか確かめる:セキュリティプラグイン、WAF、Basic認証、メンテナンスモードなどが、決済サービスからの通知を拒否していることがあります。決済プラグインの説明にある通知先のURLへのアクセスが許可されているかを確認します

決済サービスごとの通知の設定方法は、各決済プラグインのマニュアルで確認してください。

WP-CLIで注文の状況を確認する

ステータスごとの件数は wc_orders_count() で確認できます。

wp eval 'foreach ( array_keys( wc_get_order_statuses() ) as $s ) { printf( "%s: %d\n", $s, wc_orders_count( str_replace( "wc-", "", $s ) ) ); }'

特定の注文のメモ(ステータスの変更履歴を含む)は、次のように表示できます。123 は注文番号に置き換えます。

wp eval '$order = wc_get_order( 123 ); foreach ( wc_get_order_notes( array( "order_id" => $order->get_id() ) ) as $note ) { echo $note->date_created->date( "Y-m-d H:i" ), " ", wp_strip_all_tags( $note->content ), "\n"; }'

ステータスをコードで変更する

注文のステータスは update_status() で変更します。2つ目の引数に書いた文が、注文メモに残ります。

<?php
$order = wc_get_order( 123 );
if ( $order ) {
	$order->update_status( 'completed', '発送済みのため完了に変更。' );
}

7日以上前の「支払い待ち」の注文をまとめてキャンセルする場合は、次のようなファイルを作り、wp eval-file で実行します。対象を確かめるため、まず $dry_run = true; のまま実行して件数と注文番号を確認してください。

<?php
// cancel-old-pending.php: wp eval-file cancel-old-pending.php
$dry_run = true; // 確認が済んだら false にする

$order_ids = wc_get_orders(
	array(
		'status'       => 'pending',
		'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
		'limit'        => 50,
		'return'       => 'ids',
	)
);

foreach ( $order_ids as $order_id ) {
	if ( $dry_run ) {
		WP_CLI::log( "対象: #{$order_id}" );
		continue;
	}
	$order = wc_get_order( $order_id );
	$order->update_status( 'cancelled', '7日以上支払いがないためキャンセル。' );
	WP_CLI::log( "キャンセル: #{$order_id}" );
}

WP_CLI::success( count( $order_ids ) . '件を処理しました。' );

limit は一度に処理する件数です。件数が多い場合は、何回かに分けて実行します。在庫保持時間の設定で足りる場合は、そちらを使うほうが簡単です。

独自の注文ステータスを追加する

「発送済み」のような独自のステータスは、2つのフィルターで追加します。

  • woocommerce_register_shop_order_post_statuses:ステータスをWordPressに登録する一覧に加える
  • woocommerce_order_statuses:WooCommerceのステータス一覧(注文編集画面の選択肢など)に加える
<?php
// テーマの functions.php、または独自プラグインに追加

// 1. ステータスを登録する
add_filter(
	'woocommerce_register_shop_order_post_statuses',
	function ( $statuses ) {
		$statuses['wc-shipped'] = array(
			'label'                     => '発送済み',
			'public'                    => false,
			'exclude_from_search'       => false,
			'show_in_admin_all_list'    => true,
			'show_in_admin_status_list' => true,
			/* translators: %s: 件数 */
			'label_count'               => _n_noop( '発送済み <span class="count">(%s)</span>', '発送済み <span class="count">(%s)</span>' ),
		);
		return $statuses;
	}
);

// 2. 「処理中」の次に表示されるよう、ステータス一覧に加える
add_filter(
	'woocommerce_order_statuses',
	function ( $order_statuses ) {
		$new = array();
		foreach ( $order_statuses as $key => $label ) {
			$new[ $key ] = $label;
			if ( 'wc-processing' === $key ) {
				$new['wc-shipped'] = '発送済み';
			}
		}
		return $new;
	}
);

追加したステータスは、注文編集画面のステータスの選択肢に表示されます。注意点は次のとおりです。

  • スラッグは wc- を含めて20文字以内にする。注文のステータスを保存する列が20文字までのため
  • 既存のステータスや、他のプラグインが使っているスラッグと重ならない名前にする
  • コードを削除する前に、そのステータスの注文を別のステータスに変更しておく。登録が消えたステータスの注文は、ステータス別の絞り込みや変更の選択肢に出てこなくなり、管理画面で扱いにくくなる

ステータスが変わったときに処理を実行する

ステータスが変わると、次のアクションフックが実行されます。

フック 実行されるとき 受け取る値
woocommerce_order_status_{新ステータス} 指定したステータスになったとき 注文ID、注文オブジェクト
woocommerce_order_status_{旧}_to_{新} 特定のステータスから特定のステータスに変わったとき 注文ID、注文オブジェクト
woocommerce_order_status_changed ステータスが変わるたび 注文ID、旧ステータス、新ステータス、注文オブジェクト

{新ステータス} には wc- を外した名前が入ります。「発送済み」(wc-shipped)になったときは woocommerce_order_status_shipped です。

次の例は、「発送済み」になったときに、顧客向けの注文メモを追加します。add_order_note() の2つ目の引数を true にすると顧客向けのメモになり、WooCommerceの「顧客へのメモ」メール(Customer note)が送られます。メールが送られるのは、「WooCommerce」→「設定」→「メール」でこのメールが有効になっている場合です。

<?php
add_action(
	'woocommerce_order_status_shipped',
	function ( $order_id, $order ) {
		$tracking = $order->get_meta( '_my_tracking_number' );
		$message  = $tracking
			? sprintf( 'ご注文の商品を発送しました。お問い合わせ番号: %s', $tracking )
			: 'ご注文の商品を発送しました。';
		$order->add_order_note( $message, true ); // true で顧客向けのメモ(メール送信)
	},
	10,
	2
);

_my_tracking_number は、追跡番号を保存しているメタキーに置き換えてください。配送追跡のプラグインを使っている場合は、そのプラグインの保存先を確認します。

ステータスの変更をきっかけに外部のシステムへ通知する場合は、woocommerce_order_status_changed で旧・新のステータスを確かめてから送ります。

<?php
add_action(
	'woocommerce_order_status_changed',
	function ( $order_id, $from, $to, $order ) {
		if ( 'processing' !== $from || 'shipped' !== $to ) {
			return;
		}
		$response = wp_remote_post(
			'https://warehouse.example.com/api/orders',
			array(
				'headers' => array( 'Content-Type' => 'application/json' ),
				'body'    => wp_json_encode( array( 'order_id' => $order_id ) ),
				'timeout' => 15,
			)
		);
		if ( is_wp_error( $response ) ) {
			$order->add_order_note( '倉庫システムへの通知に失敗: ' . $response->get_error_message() );
		}
	},
	10,
	4
);

外部への通知が失敗しても注文の処理は止まらないため、例のように失敗を注文メモに残しておくと、後から確認できます。

支払い完了時に設定されるステータスそのものを変えたい場合は、woocommerce_payment_complete_order_status フィルターを使います。このフィルターには、標準のステータス(processing か completed)、注文ID、注文オブジェクトが渡されます。すべての注文を一律に別のステータスにすると、ダウンロード商品の注文まで止まるため、条件を絞って使ってください。

まとめ

  • 支払いが確認されると、配送が必要な注文は「処理中」、バーチャルかつダウンロード商品だけの注文は「完了」になる。「処理中」から「完了」へは手動で変える
  • 銀行振込などは「保留中」になり、入金確認後に手動で変える。未払いの注文は在庫保持時間を過ぎると自動でキャンセルされることがある
  • 「支払い待ち」のまま変わらないときは、注文メモ、決済サービスの管理画面、決済プラグインのログ、通知を妨げる設定の順に確認する
  • 独自ステータスは woocommerce_register_shop_order_post_statuses と woocommerce_order_statuses の2つのフィルターで追加し、スラッグは20文字以内にする
  • ステータス変更時の処理は woocommerce_order_status_{ステータス} や woocommerce_order_status_changed で実行する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲