「WordPressで学ぶPHP(3)関数編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」の続編にあたり、PHP組み込みの関数や、独自の関数を作る方法などを解説します。
Kindle本で、定価400円です。
管理画面左上のメニューで表示されるブログ/ウェブサイトの数を変える
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;
}
