管理画面左上のメニューで表示されるブログ/ウェブサイトの数を変える

MTQに「管理画面左上の表示されるブログ/ウェブサイトの数を変えたい」という質問がありました。
Movable Type 5.1時代のコアの書き換え方法は小粋空間様の記事にありますが、Movable Type 6.1ではファイルの配置や内容が変わっていて、そのままでは適用できませんでした。
そこで、Movable Type 6.1.1での書き換え方法を調べてみました。

1.書き換え対象のファイル

書き換える対象のファイルは、Movable Typeのインストール先ディレクトリの「lib」→「MT」→「App」ディレクトリにある「CMS.pm」の1つだけです。

なお、Movable Type 5.1の頃はもう1つ書き換えるファイルがありました。
しかし、Movable Type 6.1では、管理画面左上のメニューの仕様が以下のように変わりました(Movable Type 6.1のリリースノートより)

サイトセレクタ(ページ上部のナビゲーションメニュー)に表示されていないウェブサイトやブログをダイアログから選択するとき、サイトセレクタに表示されているウェブサイトまたはブログが除外されなくなりました。

この関係で、もう1つのファイルは修正する箇所がなくなりました。

2.ブログの表示数を変える

ブログの表示数を10個に変えるには、CMS.pmの3030行目以降のあたりを、以下のように書き換えます。
網掛けした4行が書き換えた行です。
これらの行で、元のソースコードで4/5/6だった箇所を、それぞれ9/10/11に書き換えます。

sub build_blog_selector {
    my $app = shift;
    my ($param) = @_;

    return if exists $param->{load_selector_data};

    my $blog = $app->blog;
    my $blog_id;
    $blog_id = $blog->id if $blog;
    $param->{dynamic_all} = $blog->custom_dynamic_templates eq 'all' if $blog;

    my $blog_class    = $app->model('blog');
    my $website_class = $app->model('website');

    # Any access to a blog will put it on the top of your
    # recently used blogs list (the blog selector)
    if ( $blog && $blog->is_blog ) {
        $app->add_to_favorite_blogs($blog_id);
        $app->add_to_favorite_websites( $blog->parent_id );
    }
    elsif ( $blog && !$blog->is_blog ) {
        $app->add_to_favorite_websites($blog_id);
    }
    my $auth = $app->user or return;

    # Load favorites blogs
    my @fav_blogs = @{ $auth->favorite_blogs || [] };
    if ( scalar @fav_blogs > 10 ) {
        @fav_blogs = @fav_blogs[ 0 .. 9 ];
    }

    # How many blogs that the user can access?
    my %args;
    my %terms;
    $args{join}
        = MT::Permission->join_on( 'blog_id',
        { author_id => $auth->id, permissions => { not => "'comment'" } } )
        if !$auth->is_superuser
        && !$auth->permissions(0)->can_do('edit_templates');
    $terms{class}     = 'blog';
    $terms{parent_id} = \">0";    # FOR-EDITOR";
    $args{limit}      = 11;        # Don't load over 6 blogs
    my @blogs = $blog_class->load( \%terms, \%args );

# Special case. If this user can access 5 blogs or smaller then load those blogs.
    $param->{selector_hide_blog_chooser} = 1;
    if ( @blogs && scalar @blogs == 11 ) {

        # This user can access over 6 blogs.
        if (@fav_blogs) {
            @blogs
                = $blog_class->load( { class => 'blog', id => \@fav_blogs } );
        }
        else {
            @blogs = ();
        }
        $param->{selector_hide_blog_chooser} = 0;
    }

3.ウェブサイトの表示数を変える

ウェブサイトの表示数を変えるには、先ほど変更した部分の直後を書き換えます。
網掛けした4行が書き換えた行です。
これらの行で、元のソースコードで4/5/6だった箇所を、それぞれ9/10/11に書き換えます。

    # Load favorites or all websites
    my @fav_websites = @{ $auth->favorite_websites || [] };
    if ( scalar @fav_websites > 10 ) {
        @fav_websites = @fav_websites[ 0 .. 9 ];
    }
    my @websites;
    @websites = $website_class->load( { id => \@fav_websites } )
        if scalar @fav_websites;

    my $max_load = 11;
    if ( scalar @fav_websites < $max_load ) {

        # Load more accessible websites
        %args  = ();
        %terms = ();

        $args{join} = MT::Permission->join_on( 'blog_id',
            { author_id => $auth->id, permissions => { not => "'comment'" } }
            )
            if !$auth->is_superuser
            && !$auth->permissions(0)->can_do('edit_templates');
        $terms{class} = 'website';
        my $not_ids;
        push @$not_ids, @fav_websites;
        push @$not_ids, $blog->website->id if $blog && $blog->is_blog;
        $terms{id} = { not => $not_ids } if scalar @$not_ids;
        $args{limit} = $max_load
            - ( scalar @fav_websites );    # Don't load over 3 ~ 4 websites.
        my @sites = $website_class->load( \%terms, \%args );
        push @websites, @sites;
    }

    if (@fav_websites) {
        my $i;
        my %sorted = map { $_ => $i++ } @fav_websites;
        foreach (@websites) {
            $sorted{ $_->id } = scalar @websites if !exists $sorted{ $_->id };
        }
        @websites
            = sort { ( $sorted{ $a->id } || 0 ) <=> ( $sorted{ $b->id } || 0 ) }
            @websites;
    }

# Special case. If this user can access 3 websites or smaller then load those websites.
    $param->{selector_hide_website_chooser} = 1;
    if ( @websites && scalar @websites == 11 ) {
        pop @websites;
        $param->{selector_hide_website_chooser} = 0;
    }

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください