MT(PowerCMS) でのCMS構築の際には tools以下にスクリプトをひとつ置いておく
公開日 : 2015-12-28 16:50:21
ここが変だよ Movable Type シリーズの続きです。「ニュースカテゴリに属する記事をトップページに最新10件表示して」で、後で追加で「非表示フラグ設定できるようにしてよ」って。もう、あるある過ぎますよね。
そこで、みんな大好きカスタムフィールド。チェックボックスフィールドをひとつ作ってフラグ付きを除外するとか、やるじゃないですか。で、以下のようにする。
<mt:Entries limit="10" field:entrynotop="0" category="ニュース">
</mt:Entries>
実はこいつは上手くいかない。
上手く行きますよね? 上手く行くと思うでしょ? でもこれ実は上手く行かないんだよ既に記事が入っていると。なぜならカスタムフィールドを追加で記事に対して作成しても、既に存在する記事フィールドには値は入ってくれんのである。じゃぁ、「表示フラグ」に変更して、初期値を1(checked) にしたら、ってこれも同じですわ。ね、やはりお前らのMTは間違っているでしょ?
そんな時のために、案件開始時には mt_dir/tools の下にひとつスクリプトを置いておくといいです。クライアント名とかプロジェクト名とかサイト名でいいです。あなたがビートルズのサイトを構築しているなら
mt_dir/tools/Beatles
のようなファイルです。ファイルの内容は以下でいいです。気になる人は package MT::Tool::Foo; を package MT::Tool:: Beatles; とかに変更すればいい。
https://gist.github.com/alfasado/4167792
#!/usr/bin/perl
package MT::Tool::Foo;
use strict;
use warnings;
use File::Spec;
use FindBin;
use lib map File::Spec->catdir( $FindBin::Bin, File::Spec->updir, $_ ), qw/lib extlib/;
use base qw( MT::Tool );
sub usage { '--debug 1' }
sub help {
return q {
Description Foo.
--debug 1
};
}
my ( $debug );
sub options {
return (
'debug=s' => \$debug,
);
}
sub main {
my $class = shift;
my ( $verbose ) = $class->SUPER::main( @_ );
if ( $debug ) {
print 'Some debug message.' ."\n";
}
# Do something.
1;
}
__PACKAGE__->main() unless caller;
で、今回の要件なら main サブルーチンに以下のように書いて,
my $field = 'field.entrynotop';
my $iter = MT::Entry->load_iter( { class => 'entry' } );
while ( my $obj = $iter->() ) {
if (! $obj->$field ) {
$obj->$f( 0 );
$obj->save or die $obj->errstr;
}
}
サーバーにログインして以下を実行すればOK。今後追加される記事は値が空になることはないしね。
$ cd path/to/mt_dir
$ perl tools/Beatles
他にも色々使えるよ。
- ブログで作成していたテンプレートを全部グローバルテンプレートに移し替えたい
- カテゴリの指定が聞いてた話しと途中で変わってしまった
- 大量のファイルをアップしておいてまとめてアイテムに登録したい
- アップしちゃいけないファイルがアップされているので纏めて削除したいがアイテムが1万件くらいある
とかね。まー要件変更とかあるあるだから、スクリプト置いておいて簡単な処理が書けるようにしておけば、芸は身を助けますよ。これ本当。