スタッフブログ Staff Blog

Movable Typeで記事をファイル出力しない方法を調べてみた

Movable Typeを使用して構築しているサイトで、一部の記事をHTMLファイルに出力したくない場面に遭遇したので、実現方法をご紹介してみようと思います。

昨年以前の記事をファイル出力しないケース

とあるグッズを紹介するページで、「今年発表のグッズは記事ページを出力してグッズの詳細データなどを紹介し、昨年以前発表のグッズは記事ページを出力せず年別アーカイブページで商品名と写真の紹介に留める」という仕様がありました。

これを実現する方法を調べたところ、build_file_filterコールバックを利用し、公開日が特定の日以前になる場合に記事ページの出力をキャンセルするようにプラグインを書けば良いことが分かりました。

まずconfig.yamlは次のように書きます。

id: BuildFileFilter
name: BuildFileFilter
version: 1.0.0

callbacks:
    build_file_filter: $BuildFileFilter::BuildFileFilter::Plugin::_build_file_filter

これで、再構築が行われる際に_build_file_filterルーチンが呼ばれるようになります。_build_file_filterルーチンは次のように書きます。

package BuildFileFilter::Plugin;
use strict;

sub _build_file_filter {
    my ($cb, %args) = @_;

    if ($args{Blog}->id == 1) {
        return 1 if $args{ArchiveType} ne 'Individual';

        if ($args{Entry}->authored_on + 0 < 20160101000000) {
            return 0; # Don't publish.
        }
    }

    return 1;
}

1;

if $args{ArchiveType} ne 'Individual';で記事ページか否かを判定します。そして$args{Entry}->authored_onで各記事の公開日が取得できるので2016年1月1日00:00:00より前かどうかを調べ、該当する場合はreturn 0;を返しファイルの出力をキャンセルします。

なお、$args{ArchiveType}をダンプしてみたところ次のような値が取得でき、テンプレートの種類が判断できます。

  • index
  • Individual
  • Page
  • Category
  • Daily
  • Monthly
  • Weekly

indexだけは全て小文字のようです。

お知らせの記事リストから直接指定のURLに飛ばすケース

お知らせブログの記事の中で、記事本文をなしにして記事リストのタイトルをクリックすると直接指定のURLに飛ばしたい、という仕様も時々遭遇するのではないでしょうか。

この場合はURLを入力するカスタムフィールドを用意するので、カスタムフィールドへの入力の有無をチェックし、入力がある場合は記事ページのファイル出力をキャンセルするようにプラグインを書けば良さそうです。具体的には次のようなコードになりました。

package BuildFileFilter::Plugin;
use strict;
use CustomFields::Util qw( get_meta );

sub _build_file_filter {
    my ($cb, %args) = @_;

    if ($args{Blog}->id == 1) {
        return 1 if $args{ArchiveType} ne 'Individual';

        my $meta = get_meta($args{Entry});

        if ($meta->{ entry_link_url }) {
            return 0; # Don't publish.
        }
    }

    return 1;
}

1;

if ($meta->{ entry_link_url })でURLを入力するカスタムフィールドへの入力の有無をチェックし、入力がある場合はreturn 0;を返しファイルの出力をキャンセルします。

まとめ

ファイル出力をキャンセルしようと思うと難しいのでは? と思っていましたが、調べてみるとプラグインの基本的な知識があれば、出力をキャンセルする条件を指定するコードを書くだけで簡単に実現できることが分かりました。無駄なファイルが出力されなくなり、トラブル回避につながりそうです。

ただ、既にファイルが出力されている場合は手動でファイルを消す必要があるので注意が必要です。上記のコードは再構築するかしないかを決めているだけなのです。ファイルを消すコードはアルファサード様の「RebuildFilterプラグイン」が参考になると思います。

サンプルコード

hideki-a/mt-plugin-build-file-filter

お問い合わせ Contact

制作のご依頼、ご相談などは下記のフォームからご連絡ください。