記事とページを一括で扱う
数が多い仕事は、mtb の利点がもっとも大きい場面です。管理画面で1件ずつ開いて いた作業が、1つのコマンドで済みます。
記事を投入する
mtb sites entries create --site-id 1 --entry '{
"title": "タイトル",
"body": "本文",
"status": "Publish"
}'status を省くと下書きになります。本文をファイルから渡すなら --set entry.body=@draft.md、作成したものの ID だけ受け取るなら --fields id --compact です。
./drafts の Markdown を全部サイト4に下書きとして入れて。 ファイル名の日付を公開日にして、本文は Markdown のまま扱って。
書式を指定しないと MT の既定になります
Markdown で書いた原稿を入れるなら format を明示してください (指定できる値は mtb text-filters list で確かめられます)。
探して直す
mtb sites entries list 4 --search "キーワード" --limit 50 --fields id,title,status
mtb sites entries update 4 42 --entry '{"title":"直したタイトル"}'更新は渡したフィールドだけを書き換えます。全体を送り直す必要はありません。
一覧の --search は Data API 側の検索で、認証しているので下書きも 対象になります。対象を絞るなら --search-fields body (既定は title,body,more,keywords,excerpt,basename)。
本文を書き換えるときは取り出し方に注意
get が返す body は変換後の HTML です。Markdown やブロックエディタの 記事に書き戻すと原稿が変換後の HTML に置き換わります。編集のために取り出すなら --no-text-filter 1(データの受け渡し)。
本文を含まない部分更新(タイトルだけ、ステータスだけ)は安全です。
一括置換は次の形で行うと安全です。
for id in $(mtb sites entries list 4 --all --search old.example.com --extract items | jq -r '.[].id'); do
mtb sites entries get 4 "$id" --no-text-filter 1 --extract body --out /tmp/b.txt
sed -i '' 's/old\.example\.com/example.com/g' /tmp/b.txt
mtb sites entries update 4 "$id" --set entry.body=@/tmp/b.txt
doneまず1件で実行して結果を確かめてから、残りを処理します。
jq を使うのは、シェルで一覧を順に処理するときだけです。1件ずつの値の取り出しは --extract で足ります。
画像をまとめてアップロードする
mtb assets upload --site-id 1 --file ./photo.jpg --path /2026
mtb assets upload --site-id 1 --dir ./dist/images --path /2026 # ディレクトリ丸ごと- サブディレクトリの構成は
--pathの下にそのまま再現します(icons/menu.svg→<path>/icons) - 隠しファイル(
.DS_Storeなど)は送りません - 途中で失敗したらそこで止まり、何件目で止まったかを標準エラーに出します
- 何が送られるかは
--dry-runで先に確認できます
同名のファイルは上書きできません
MT は 409 を返します(A file named '...' already exists.)。 Data API に上書きの手段がないためです。入れ替えるなら --replace を使います。 送り先にある同名のアセットを削除してからアップロードします(--yes が要ります)。 削除するのは送り先まで一致したアセットだけなので、別フォルダの同名ファイルは 削除されません。
記事に添付するには、アップロードしたあとにアセットの ID を記事に渡します。
mtb assets upload --site-id 1 --file ./photo.jpg --path /2026 --fields id,url
mtb sites entries update 1 42 --entry '{"assets":[{"id":7}]}'
mtb sites entries assets list 1 42 # 添付されているもの
mtb sites assets entries list 1 7 # 逆引き(このアセットを使う記事)MT は画像を再保存します
アップロードしたバイト列そのままでは保存されず、JPEG は quality 85 で 保存し直されます(4000×3000 の 3.3MB が 1.8MB になった実測があります)。 画像以外(PDF・テキストなど)はバイト単位でそのままです。
分類を付け替える
mtb sites categories list 4 --fields id,label,basename,parent
mtb sites entries update 4 42 --set-json entry.categories='[{"basename":"news"}]'親子関係は parent に親の ID を指定するだけです(0 で最上位に戻ります)。
並べ替えには permutate を使いますが、取り出すときの並び順に注意してください。
mtb sites categories list 4 --sort-by user_custom --sort-order ascend --extract items --out c.json
# c.json を並べ替えてから
mtb sites categories permutate 4 --categories @c.jsonlist の既定は --sort-order descend です。そのまま並べ替えて送ると 逆順になります。user_custom の昇順が「管理画面で見える順」です。
数え上げる・棚卸しする
mtb sites entries list 4 --all --fields id,title,status,date --out entries.json--all は limit と offset を自動で進めて全ページを取得し、1つにまとめます。 261件を3リクエストで取得できます。集計や突き合わせは、この JSON に対して行えば済みます。
反映を忘れない
静的公開のサイトでは、保存しただけではページが書き出されません。
mtb publish entries --ids 42,43 --wait詳しくは公開と再構築。