環境情報
検証・運用で確認した構成は以下のとおりです。
- WordPress: 6.5系 / 6.7系
- WooCommerce: 8.9系 / 9.4系
- PHP: 8.1 / 8.3
- Advanced Custom Fields Pro: 6.2系(商品に独自フィールドを多数追加)
- テーマ: 独自テーマ(子テーマ運用)
- 商品数: 約500件、運用担当は shop_manager 権限
- 管理画面のメニューラベルを日本語でリネームしている(
admin_menuフック)
結論から書くと、「商品」というラベルはWooCommerce標準で複数箇所に存在し、リネームすると編集用メニューだけ別名になって、レポート側だけが「商品」として残るのが原因です。編集画面に確実に入るには post.php?post=<ID>&action=edit の直リンクが最も堅い、というのが本記事の主張です。
事象: 「商品」を開いたら商品編集画面に行けない
発生したのは次のような流れです。
- 管理画面左メニューに「商品」が2つ並んでいる
- 上にある方をクリックして一覧を開く
- 商品名のリンクをクリックする
- 編集画面に遷移せず、同じレポート画面がフィルタ付きで開き直る
- もう一度クリックしても同じ。ブラウザバックすると一覧に戻る
「リンクが壊れている」「権限がない」「プラグインのJSエラー」を疑いたくなりますが、実際はそもそも別のメニューを開いていただけです。押していたのは商品一覧ではなく、WooCommerce Analytics(分析)配下の「商品」レポートでした。
Analytics の商品レポートでは、テーブル内の商品名が「その商品でレポートを絞り込むリンク」になっています。URLは概ね次の形です。
/wp-admin/admin.php?page=wc-admin&path=/analytics/products&product_includes=<ID>
つまり product_includes にIDが入るだけで、遷移先はあくまで Analytics です。「商品名リンクを押してもレポートが開き直す」という挙動は仕様どおりで、バグではありません。
なぜ「商品」が2つ(環境によっては3つ)あるのか
WooCommerceは商品を独自の投稿タイプ product として登録し、管理メニューを edit.php?post_type=product に割り当てます。ラベルは「商品」です。一方、WooCommerce Analytics もまた「商品」というサブメニューを持ちます。結果としてラベルが衝突します。
| メニュー | 実体のURL | 開くもの | 商品編集へ行けるか |
|---|---|---|---|
| 商品(Products) | /wp-admin/edit.php?post_type=product |
商品一覧(WP_List_Table) | ○ |
| 分析 > 商品 | /wp-admin/admin.php?page=wc-admin&path=/analytics/products |
売上レポート | × |
| レポート > 商品 | /wp-admin/admin.php?page=wc-reports&tab=orders&report=sales_by_product |
集計レポート | × |
WordPressはトップレベルメニューのスラッグが重複すると「商品 2」のように連番を振りますが、Analytics 側は別スラッグ(wc-admin)のトップレベルメニュー配下なので連番が付きません。これが「同じ名前なのに番号が付かず見分けられない」理由です。
さらにリネームが効くのは post_type 側だけです。register_post_type_args や admin_menu で「商品管理」に変えても、Analytics 側の翻訳文字列はそのままなので、残った「商品」=レポートという状態が出来上がります。
見分け方: 迷ったらURLを見る
ラベルではなくURLで判断してください。ホバーしてステータスバーを見るだけで9割解決します。
-
edit.php?post_type=product→ 商品一覧。ここから入るのが正解 -
admin.php?page=wc-admin&path=/analytics/...→ レポート。編集画面はない -
admin.php?page=wc-reports&...→ 旧レポート。編集画面はない
対処1: 直リンクで編集画面を開く(最確実)
商品の編集画面は投稿と同じ仕組みなので、以下で直接開けます。
/wp-admin/post.php?post=<商品ID>&action=edit
商品IDの調べ方はいくつかあります。
- 一覧の商品名にホバーして
post=<数値>を読む - 編集画面を開いたときの
postパラメータを見る - WP-CLI を使う
wp post list --post_type=product --post_status=publish \
--fields=ID,post_title --format=table | head -20
特定の商品だけ探すなら --s で検索します。
wp post list --post_type=product --s="検索語" --fields=ID,post_title
テーマやプラグインから案内URLを出す場合は、admin_url() を通して組み立てます。
<?php
/**
* 商品IDから編集画面のURLを生成する
*/
function my_product_edit_url( int $product_id ): string {
if ( get_post_type( $product_id ) !== 'product' ) {
return '';
}
return admin_url(
sprintf( 'post.php?post=%d&action=edit', $product_id )
);
}
この関数を管理画面のダッシュボードウィジェットや、独自の運用ガイドページに貼っておくと、担当者が迷子になっても復帰できます。
<?php
add_action( 'admin_notices', function () {
$screen = get_current_screen();
if ( ! $screen || $screen->id !== 'dashboard' ) {
return;
}
$id = (int) get_option( 'my_pickup_product_id', 0 );
if ( ! $id ) {
return;
}
printf(
'<div class="notice notice-info"><p>注目商品の編集は <a href="%s">こちら</a>。</p></div>',
esc_url( my_product_edit_url( $id ) )
);
} );
ACFで商品に追加したフィールドも、product 投稿タイプの編集画面(=post.php)に表示されます。フィールドグループの位置ルールが「投稿タイプ = 商品」になっていれば、Analytics 側の画面には当然出ません。「ACFのフィールドが見当たらない」と相談されたら、まずどのURLを開いているかを確認するのが定石です。
対処2: メニューラベルの衝突を根本から消す
運用で何度も事故るなら、ラベルを変えるかサブメニューを消すのが有効です。WooCommerce は admin_menu を早い優先度で登録するため、遅い優先度(999など)でフックするのがハマりポイントです。
<?php
/**
* 商品メニューのラベルをリネームする
*/
add_action( 'admin_menu', function () {
global $menu;
foreach ( $menu as $index => $item ) {
if ( isset( $item[2] ) && $item[2] === 'edit.php?post_type=product' ) {
$menu[ $index ][0] = '取扱商品';
}
}
}, 999 );
Analytics 側のサブメニューを消す場合は、スラッグを決め打ちせず走査する方が安全です。WooCommerce のバージョンで親スラッグが変わる余地があるためです。
<?php
/**
* Analytics 配下の「商品」サブメニューを非表示にする
*/
add_action( 'admin_menu', function () {
global $submenu;
foreach ( $submenu as $parent_slug => $items ) {
foreach ( $items as $item ) {
if ( ! isset( $item[2] ) ) {
continue;
}
if ( str_contains( (string) $item[2], '/analytics/products' ) ) {
remove_submenu_page( $parent_slug, $item[2] );
}
}
}
}, 999 );
実際のスラッグは環境で異なるので、まず確認用に一時的なデバッグを仕込むのが確実です。
<?php
add_action( 'admin_menu', function () {
global $submenu;
if ( current_user_can( 'manage_options' ) ) {
error_log( print_r( array_keys( $submenu ), true ) );
}
}, 998 );
wp-content/debug.log に親スラッグの一覧が出るので、それを元に remove_submenu_page() の第1引数を確定させます。調査が終わったらデバッグコードは必ず外してください。
なお、WooCommerce Admin 自体を無効化するフィルタも存在しますが、分析機能全体が使えなくなるため本件の解決策としては非推奨です。レポートを見たい運用担当者がいるなら、ラベル変更と教育で解決すべきです。
手順まとめ
- 左メニューの「商品」にホバーし、URLが
edit.php?post_type=productかadmin.php?page=wc-admin...かを確認する - レポート側だった場合は、正しい商品一覧メニュー(リネーム後の名前)を探す
- それでも分からなければ
post.php?post=<ID>&action=editを直接叩く - 商品IDは一覧のホバーか
wp post listで取得する - ACFのフィールドが出ない場合は、フィールドグループの位置ルールを確認する
- 再発防止として
admin_menu(優先度999)でラベルを統一する - 運用ドキュメントに直リンクのテンプレートを記載する
ハマりポイント
-
admin_menuの優先度: デフォルトの10だと WooCommerce の登録と順序が競合し、ラベル変更が上書きされることがある -
remove_submenu_pageの引数: 親スラッグとメニュースラッグの両方が完全一致していないと何も起きない - 翻訳ファイル由来のラベル: 直接文字列を書き換えるとアップデートで戻るため、必ずフックで上書きする
-
post.phpとpost-new.phpの違い: 新規作成はpost-new.php?post_type=product。混同しやすい -
権限:
edit_productsがないとpost.phpを開いても弾かれる。shop_manager のロール設定も確認する -
HPOS(High-Performance Order Storage): 注文はカスタムテーブルに移行されるが、商品は対象外で従来どおり
wp_postsに保存される。したがってpost.phpの直リンクは HPOS 有効環境でもそのまま使える
FAQ
Q. 商品名リンクを押したら毎回レポートが開きます。壊れていませんか?
A. 壊れていません。Analytics の商品レポートでは商品名が絞り込みリンクになっているためです。一覧は edit.php?post_type=product です。
Q. 商品IDが分かりません。
A. 一覧で商品名にホバーするか、wp post list --post_type=product --fields=ID,post_title で一覧できます。
Q. post.php を開いたら真っ白になります。
A. 権限不足か、PHPエラーの可能性があります。WP_DEBUG を有効にして debug.log を確認してください。
Q. メニュー名を変えたのに「商品」が残ります。
A. 残っているのは Analytics 側です。本記事の走査コードでサブメニューを確認してください。
Q. 複数サイトで同じ運用にしたい。
A. mu-plugins にまとめて配置すると、テーマ変更やプラグイン更新の影響を受けにくくなります。
まとめ
「商品」が2つ並ぶ問題は、ラベルの衝突という単純な原因でありながら、症状としては「リンクが壊れている」ように見えるのが厄介です。切り分けの第一歩はラベルではなくURLを見ること。そのうえで、編集したい商品が確定しているなら post.php?post=<ID>&action=edit の直リンクが最も確実で、ACFのカスタムフィールドも含めて必ず目的の画面に着地します。再発防止までやるなら、admin_menu を優先度999でフックしてラベルを統一し、Analytics 側のサブメニューを走査して非表示にしておくのがおすすめです。
この記事を書いた人
BENTEN Web Works — 業務自動化・システム開発のフリーランスエンジニアです。
GAS / Python / RPA を使った業務自動化や、Web制作・システム開発のご相談を承っています。
「こんなこと自動化できる?」というご質問だけでもお気軽にどうぞ。
👉 BENTEN Web Works — 詳細・お問い合わせはこちら
🐦 X(旧Twitter) — 日々の知見を発信中