2013年03月28日
アーカイブの出力を制御する(特定条件のアーカイブを出力したくない)
Movable Type / PowerCMS で特定のアーカイブを出力したくないケースがあります。例えば以下のような条件指定がしたいとします。
- 特定のカテゴリ配下のブログ記事はトップページへのお知らせとして表示したいだけなので、ファイルは生成したくない(あるいはカスタムフィールドで分岐したい)。
- 特定のカテゴリ配下のブログ記事は、ニュースリリースのPDFファイルへのリンクだけを表示させたいので、ファイルは生成したくない(あるいはカスタムフィールドで分岐したい)。
- トップレベルカテゴリのアーカイブのみ出力したい。サブカテゴリのアーカイブは出力したくない。
このような場合、Movable Typeのアーカイブマッピングを工夫してアーカイブの出力を抑制するような Tips があって、以下のような方法で実現しているケースを見かけます(EntryOutputFlagはカスタムフィールドで定義したタグ)。
<mt:If tag="EntryOutputFlag">%y/%m/%-f<mt:Else></mt:If>
カスタムフィールド(チェックボックス)の初期値にチェックを入れ、チェックが外れている場合にはアーカイブのパスが空になるため、ファイルが出力されないという方法です。
一見、この方法でうまく動作しそうなように見えますが、このような指定ではうまくいかないケースがあり、推奨されません。
- アーカイブのパスが空になり、ブログ(ウェブサイト)パスのディレクトリに対してファイルとしてアクセスを試みることになるため、MT::FileMgrがエラーを吐くケースがある。
- 同一パスのFileInfoレコードが生成され、ダイナミックパブリッシング(DynamicMTML)がエラーとなる。
カスタムフィールドの値によってアーカイブの出力を制御するプラグイン
RebuildFilterプラグインを利用することで実現できます。
- プラグインをダウンロードし、pluginsディレクトリにアップロードします。
- カスタムフィールドを作成します。種類はチェックボックス、ラベルは「このアーカイブを出力しない」とし、カスタムフィールドのベースネームをブログ記事の場合「entryfilter」ウェブページの場合「pagefilter」カテゴリの場合「categoryfilter」フォルダの場合「folderfilter」とします。
システムオブジェクトは出力しないアーカイブに合わせて、選択します。例えば「categoryfilter」を使用してカテゴリのアーカイブを出力しない場合は「カタゴリ」を選択します。 - チェックを入れたオブジェクトのアーカイブは出力されないことを確認します(アーカイブマッピングのカスタマイズは不要です)。
既に同じベースネームのカスタムフィールドが存在する場合、mt-config.cgiに「IndividualFilterBasename(ブログ記事)」「PageFilterBasename(ウェブページ)」「CategoryFilterBasename(カテゴリ)」「FolderFilterBasename(フォルダ)」を指定することで、カスタムフィールドのベースネームを変更することが可能です。
風の中
2019年2月 5日 16:25参考になる記事をありがとうございます。
こちらのプラグインですが、MT7でも稼働いたしますか?
ver.1のリリースが2016年でしたので気になりました。
風の中2
2019年2月 5日 16:27あと前段部分の「<mt:If tag="EntryOutputFlag">%y/%m/%-f<mt:Else></mt:If>」ですが、
<mt:Else>無しだと問題ないですよね。
<mt:Else>を使う意味がわかりませんでした。
アルファサードから風の中への返信
2019年2月21日 21:49コメントありがとうございます。
未検証となりますが、MT7 でも (実装に利用している build_file_filter コールバックとカスタムフィールドが使えるため) 動作すると考えます。
もし MT7 での動作に問題がありましたらお知らせ下さい。
渡邊から風の中2への返信
2019年2月21日 22:15コメントありがとうございます。
ご指摘の通り MTElse の記述の有無で動作に違いはありません。
ただし、記事で取り上げた「うまくいかないケース」は MTElse の記述の有無に関係なく発生するため、アーカイブマッピングの記述のみでファイルを出力しないようにすることはおすすめしません。