うまくいかないとき
Movable Type には「エラーにならないのに何も起きていない」という失敗の 仕方がいくつもあります。症状から原因と対処を引ける表にまとめました。
接続と認証
| 症状 | 原因 | 対処 |
|---|---|---|
401 Invalid login | サインインパスワードを使っている | Webサービスパスワードを確認する(認証) |
| 401 が実行のたびに出る | セッションが切れている | mtb auth login をやり直す |
| 403 | ユーザーの権限不足 | MT の管理画面でロールを確認する。リトライしても直らない |
| 404(パスは合っている) | ベースURLが mt-data-api.cgi までのパスを含んでいない | mtb profile show |
| JSON でなく HTML が返る | ベースURLが管理画面を指している | 同上 |
405 Method Not Allowed | 前段が PUT / DELETE を遮断している | --method-override を付ける |
| API で作ったユーザーがサインインできない | sign_in_data_api 権限・Webサービスパスワード・サイトの Data API 許可のどれかが欠けている | 権限は API で付与できる。残りの2つは管理画面で設定する |
| 対話入力で止まる/失敗する | 端末から実行していない | --yes / --username / --password-stdin |
取得
| 症状 | 原因 | 対処 |
|---|---|---|
| 一覧が10件で切れる | --limit を指定していない | --limit と totalResults、または --all |
| 応答が大きすぎて読み切れない | 全属性が返っている | --fields で絞る |
--fields を付けたら {} が返った | 属性名の綴り違い | mtb が知らせる。サーバ側で絞る endpoint では --fields を外して名前を確かめる |
mtb search の件数が 0 | limit で打ち切られると totalResults が 0 になる | --all を使う |
| 下書きが出てこない | 既定の絞り込みは公開済みだけではない | --status Draft などを明示する |
保存できたのにサイトに反映されない
| 症状 | 原因 | 対処 |
|---|---|---|
| 変更したのにサイトに反映されない | 再構築していない | mtb publish entries --ids ... |
Rebuilding が返るのにファイルが変わらない | 再構築は1回の呼び出しでは完了しない | --wait を付ける |
呼び直しても restIds が減らない | startTime を渡していない(毎回最初から再構築される) | 応答の startTime を --start-time で渡す。--wait なら自動で渡す |
| 保存は 200 なのに静的ファイルが増えない | 関係のないテンプレートに誤りがあり、再構築全体が失敗している | --verify-publish、または mtb sites logs list <site> --level error |
| 保存し直しても再構築されない | 値が変わらない更新では MT は何も処理しない | 実際に変わる値を送る |
詳しくは公開と再構築。
記事・ページ・コンテンツ
| 症状 | 原因 | 対処 |
|---|---|---|
| 本文が HTML に置き換わった | get の body は変換後の値 | 編集用に取り出すときは --no-text-filter 1(データの受け渡し) |
| 記事の著者を変えたのに変わらない | author は読み取り専用。200 が返るが、値は無視される | 作成時の著者はサインインしている利用者になる |
タイトルの — が -- や — になった | 作成のときだけ記号が置換される(更新では起きない) | 作成したあとに同じ値で更新し直す |
| 空の更新をしたら URL が変わった | --entry '{}' でフォルダ・カテゴリの指定が解除された | 変更する項目だけを書いて送る |
| ページ作成時に folder を指定したのに root に出る | 作成時は無視される | 作成したあとに、更新でフォルダを設定する |
| ページの状態やタイトルを変えたら URL がサイト直下に移った・トップページが別のページになった | ページは folder を書かない更新でフォルダの指定が解除される(空の更新でなくても。basename が index ならトップの index.html を上書きする) | 更新のたびに folder を一緒に送る。上書きされたトップはインデックステンプレートを書き出し直す |
| ページをフォルダの basename で選り分けたら全部が「該当なし」 | ページの一覧の folder は id・label・parent だけで basename を持たない | フォルダの一覧で basename → id を引き、id で比べる。削除の処理でこの比較を誤ると、自前のページまで削除される |
コンテンツデータが "Data Label" is required. | label を書いていない | label はフィールドではなくデータ自体の名前 |
permutate が 400 | id だけの配列を渡した | list の出力をそのまま並べ替えて渡す |
| 並べ替えたら逆順になった | list の既定は --sort-order descend | user_custom の昇順が管理画面での表示順 |
| ページにコメントできない | page リソースに allowComments が無い | サイト側の allowCommentsDefault を有効にしてからページを作る |
| コンテンツデータの URL の最後の段が40桁の英数字になった | identifier を送った。API の項目名は basename | basename で作り直す |
| ウェブページの本文が空 | 本文の項目名を text にした。ページも body | body で更新し直す |
| コンテンツタイプのフィールドを作ったら 500。以後そのタイプが何をしても 500 | フィールドの options に真偽値("multiple": false など)を入れた | options に真偽値を入れない。500 を返すようになったタイプは削除して作り直す |
| 記事の個別ページの「ほかの記事」が、その記事より古いものだけになる | 記事アーカイブの中の mt:Entries は、その記事より前に絞られる | ignore_archive_context="1" を付ける |
| 管理画面で画像を入れた記事だけ、画像が出ず HTML がそのまま出力される | 画像のカスタムフィールドの値は、API だと URL、管理画面だと <form mt:asset-id> の HTML になる | テンプレートで両方の形式を処理する。構築の確認では、管理画面で1本作るところまで行う |
| 記事を公開しても、サイトのトップやサイトマップに出ない | 他のブログの記事を表示するインデックスは自動で再構築されない | 公開のあとにそのテンプレートを書き出す(mtb sites templates publish) |
| 取り下げた・削除した記事が、カテゴリの一覧に残る | カテゴリアーカイブは書き出し直されない | そのブログを再構築する |
| ロールを作ったのに権限が付与されていない | MT が認識しない権限名は、知らされないまま破棄される | mtb roles get で読み戻す。コンテンツタイプ単位は manage_content_data:<タイプのUUID> |
| コンテンツタイプの「タグ」の欄に値を入れると 409・500 | MT 9.3.1 で観測。API からは値を保存できなかった | 代わりに「リスト」の欄を使う |
アセット
| 症状 | 原因 | 対処 |
|---|---|---|
409 A file named '...' already exists. | MT はアセットを上書きできない | --replace で削除してから送る |
'.js' is not allowed to upload by system settings. | DeniedAssetFileExtensions の既定が js html などを拒否 | インデックステンプレートとして配置する(テンプレート) |
アップロードが 500 unable to write to the "Upload Destination" | ウェブサーバがサイトの配置先に書き込めない | mtb sites get <ID> --fields sitePath の場所の権限を確認する |
| 上げた画像のバイト列が元と違う | MT は画像を再保存する(JPEG は quality 85) | 画像以外(PDF・テキスト)はそのまま保存される |
テーマ
| 症状 | 原因 | 対処 |
|---|---|---|
テーマのエクスポートが success なのに中身が空 | 静的ファイルの対象フォルダがサイトに保存されていない | 管理画面のテーマエクスポート画面で保存する。API からは設定できない |
themes apply が --yes だけでは実行できない | テンプレートの総入れ替えなので --confirm <サイト名> も要る | 対象を確かめてから名前を入力する |
| 適用したら静的ファイルが 404 | blog_static/ の下に置いていない | 置き場所を直す(テーマ) |
| backup テンプレートが増え続ける | 適用のたびに旧テンプレートが残る | API からは削除できない。 管理画面で削除する |
サイトの構成
| 症状 | 原因 | 対処 |
|---|---|---|
サイトを作っただけで /index.html や styles.css が公開される | sites create は既定のテーマのテンプレートとサンプルのページを入れる | 自前のテンプレートで組むなら削除する。書き出し済みのファイルは消えないので、中身を空にして公開してから削除するか、サーバ側で削除する |
テンプレートの公開が 403 Do not have permission to publish a template(管理者なのに) | まだ MT に無いモジュールを mt:Include で読んでいる | 原因は権限ではない。モジュールを先に作る |
<mt:Categories sort_by="user_custom"> で並べ替えが反映されない | MT 9.3.1 で観測 | 並び順が重要なら、その順に並べた固定の HTML にする |
A resource "blog" is required. | 子サイトを --website で更新した | --blog を使う(種別は mtb sites get <id> --fields class) |
| 子サイトのURLが二重になる | 絶対URLを渡した | "url": "blog/" のように親からの相対で書く |
カスタムフィールドが invalid | select / radio は options が必須。datetime も options が必須 | date_and_time / date_only / time_only |
systemObject の値が受け付けられない | 指定できる値はサイトの種別で異なる | ウェブサイトに blog は無く、ブログに website は無い |
その他
| 症状 | 原因 | 対処 |
|---|---|---|
500 malformed JSON string | @ファイル名 が展開されずにそのまま送られた | 文字列の項目では展開されない。警告が出ていないか確認する |
| 数値のはずのIDで 404 | パスに不正な値が入った | mtb が送信前に拒否するので、そのエラーメッセージを読む |
Unknown endpoint / 見覚えのない 404 | そのMTに無い機能 | mtb endpoints list でサーバが実際に持つ一覧を確認する |
| メールを送信する操作が 500 | EmailAddressMain 未設定 | MT の全般設定でシステムのメールアドレスを設定する |
統計が 400 startDate is required | 集計期間は必須 | --start-date と --end-date を渡す |
取り込みで Invalid encoding | 有効な値は MT の言語設定次第 | 既定の guess を使うのが最も簡単 |
--cd-search 1 で 500 | MT の不具合(並び順の列名が不正になる) | --search-sort-by を一緒に渡す |
--publish 0 にしたのに公開されている | これは再構築の抑止で、ステータスではない | 下書きにするなら status を Draft にする |
| 同時に更新したら片方が消えた | MT に楽観ロックは無い(後勝ち・両方成功で返る) | 別々の項目なら互いの変更は失われない。更新の順序は呼び出し側で決める |
そのMTに何があるか調べる
仕様に載っていてもサーバに無い機能があります。 プラグインが追加した機能も あります。迷ったら、サーバが実際に持つエンドポイントの一覧を確認してください。
bash
mtb endpoints list --all --fields component,verb,routecomponent が提供元です。検証した MT では 246 が Core、20 がプラグイン由来 (Professional Pack / Comments / FormattedText)でした。 カスタムフィールドもコメントも、実はプラグインが追加したエンドポイントです。
定義に無いエンドポイントは mtb api から呼び出せます。
bash
mtb api GET /sites/1/things --all --fields id,label
mtb api POST /sites/1/things --set thing.label=ラベル