これまでの shopify.print はシステムの印刷ダイアログを開くことしかできず、専用レシートプリンタを狙い撃ちできなかった。新しい shopify.printing は端末に繋がったプリンタを列挙し、ダイアログ無しで直接印刷ジョブを飛ばせる。
shopify.printing)が追加された。shopify.printできるのは「システムの印刷ダイアログを開く」ことだけ。ダイアログは専用レシートプリンタをターゲットにできないため、スタッフが毎回手で選ぶ/そもそも出せないという状態だった。
shopify.printinggetPrinters() で繋がっているプリンタを取得し、print(src, {printer}) で直接印刷。ダイアログは出ない。printer を省略すれば従来どおりダイアログも使える。
shopify.print は deprecated(非推奨)になったが、即時対応は不要。2026-07 を採用するタイミングで移行を計画すればよい。それより前の POS UI Extensions API バージョンは変更なし。
shopify.printing.getPrinters()その端末で利用できる ハードウェアプリンタの一覧 を返す。各プリンタは id / name / connected(接続状態)を持つ。
POS 11.11.0 未満では常に空配列。レシートプリンタがペアリング済みでも空になる。
shopify.printing.print(src, options?)src のドキュメントを印刷する。
options.printer 省略 → システム印刷ダイアログが開く。getPrinters() が返したプリンタを渡す → ダイアログ無しでそのプリンタに直接印刷。
| プリンタ情報 | 内容 |
|---|---|
id | プリンタの識別子 |
name | プリンタ名 |
connected | 接続状態。実装では connected が true のものを選ぶのが基本 |
Printing API は すべての POS UI extension ターゲット で利用できる。
| 項目 | shopify.print(非推奨) | shopify.printing(2026-07〜) |
|---|---|---|
| プリンタの列挙 | 不可 | getPrinters() id / name / connected |
| レシートプリンタ指定 | 不可 ダイアログは専用レシートプリンタをターゲットにできない | 可能 ダイアログ無しで直接印刷 |
| システム印刷ダイアログ | これだけ | printer 省略で従来どおり利用可 |
| ステータス | deprecated ただし即時対応不要 | 推奨 2026-07 採用時に移行 |
| 旧 API バージョン | それ以前の POS UI Extensions API バージョンは変更なし | |
application_url に付く相対パス例 : '/print/receipt'
オリジンが違う URL は対象外。
レシートプリンタが直接レンダリングできる。printer を渡してダイアログ無し印刷が可能。
HTML と同様、レシートプリンタが直接レンダリングできる。
システム印刷ダイアログが必須。src が PDF のときに printer を渡すと print はエラーを throw する。PDF では必ず options.printer を省略する。
getPrinters() が空配列を返すケースは 必ず ハンドリングし、システム印刷ダイアログにフォールバックする。これは POS 11.11.0 未満の端末だけでなく、レシートプリンタを持たないマーチャント のカバーにもなる。
const printers = await shopify.printing.getPrinters();
const receiptPrinter = printers.find((printer) => printer.connected);
if (receiptPrinter) {
await shopify.printing.print('/print/receipt', {printer: receiptPrinter});
} else {
await shopify.printing.print('/print/receipt');
}
getPrinters() で一覧取得し、connected が true のものを選ぶ。
print(src, {printer})。ダイアログは開かない。
print(src) のみ。旧環境・プリンタ無し店舗もこれで動く。
getPrinters() は空配列を返す。
なお、この制約はシステム印刷ダイアログには影響せず、ダイアログは引き続き利用できる。
開発ストアで POS 11.11.0 以上+ペアリング済みレシートプリンタ を用意し、getPrinters() で取得したプリンタを shopify.printing.print に渡す。ダイアログが出ずに印刷されれば直接印刷が効いている。
POS 11.11.0 未満、またはレシートプリンタ非所持の店舗では getPrinters() が空配列を返す。常にダイアログへフォールバックする分岐を必ず書く。例外扱いにするとその環境で印刷できなくなる。
src が PDF を指しているときに printer を渡すと shopify.printing.print はエラーを投げる。PDF は常に options.printer を省略してダイアログに任せる。レシート系は HTML/画像で作るのが素直。
渡せるのは application_url 起点の相対パスか、同一オリジンのフル URL のみ。取得は拡張のセッショントークン経由なので、印刷用エンドポイントはそのトークンで認証して描画結果を返す設計にする。
shopify.print は deprecated だが 即時対応は不要。それ以前の API バージョンは変更されないので、既存拡張は動き続ける。2026-07 に上げるタイミングで一緒に置き換えるのが最小コスト。
Printing API は すべての POS UI extension ターゲット で利用可能。特定の画面に縛られないので、注文詳細・カート・カスタムアクションなど、業務動線に合わせて印刷ボタンを配置できる。検証は開発ストア+POS 11.11.0 以上+ペアリング済みレシートプリンタで、ダイアログが出ずに印字されるかを見る。
getPrinters() → connected なプリンタを選択 → print(src, {printer}) の 3 行に置き換える。getPrinters() の結果が空かどうかだけで分岐する実装にする。バージョン判定を書かず、空配列=ダイアログ の 1 本のフォールバックで両方を吸収する。/print/<帳票> エンドポイントを用意し、POS UI extension のカスタムアクションから shopify.printing.print で同じレシートプリンタへ流す。src は application_url 起点の相対パス or 同一オリジン URL。拡張のセッショントークンで fetch されるため、エンドポイント側でそのトークンを検証して HTML を返す。shopify.print は非推奨だが即時対応は不要 = 2026-07 採用時にまとめて移行すればよい。」