IMPOV::In My Point Of View

仕事、SEO、ウェブマーケティング、時事問題、健康、生き方などなど、書きたいことを勝手に書き倒しているブログです。とどのつまり「便所の落書き」

MovableType でページ送りを指定したページ数ずつ分割して表示する為のソース

MTでページ分割といえば、SKYARCさんのPagebuteという素敵なページ分割プラグインがありますが、今回のオーダーではお客さまからプラグインを導入することを許してもらえませんでした。そこそこ大きい企業さんでは有りがちな展開ですね。

そこで、MTのデフォルトテーマに最近追加された「Rainier」にあるページ分割用のソースを大改造して使用することにしました。

もともとこの「Rainer」についているコードは、たしかMT4の頃にアメリカの方?がフォーラムにアップしてたコードにそっくりなので(うろ覚えですが・・・)、それが原型になっているんでしょうね。

前にそれを改造して使っていたことがあったのですが、いつの間にかソースを無くしてしまいましたので改めて改造し直しです。ついでに、次の似たようなオーダーがあった時に備え、汎用的に使えるものにしようとゴテゴテと書き加えてみました。(だいたい、こうやって準備万端にしておくと、オーダーは来ないんですけどね・・・)

一応、MT5.2.3と6.0.1では軽く動作確認はしましたが、不具合が残っているかもしれません。うまくすると4.2とかでも動くのかもしれません。

チャレンジャーな方で不具合を見つけた方がいましたら、是非教えて下さい。

あと、MTタグで変数の計算とかとてもメンドウすぎて、冗長な部分がいっぱい残っていると思いますが、取りあえず動くようなので磨いてません。(磨く気力がありません。)

改善できそうな部分がありましたら、勉強になりますので是非教えてください。

ソース

ページネーション生成部分
<mt:Ignore>===================ページネーション生成===================</mt:Ignore>
<mt:Ignore>設定----------------------------------------------------</mt:Ignore>
<mt:Ignore>ページあたりの表示記事数</mt:Ignore>
    <$MTVar name="entries_per_page" value="5"$>

<mt:Ignore>ナビゲーションの最大表示数</mt:Ignore>
    <$MTVar name="navi_per_page" value="5"$>

<mt:Ignore>前へ</mt:Ignore>
    <MTSetVarBlock name="navi_prev">&lt;&nbsp;前へ&nbsp;</MTSetVarBlock>

<mt:Ignore>次へ</mt:Ignore>
    <MTSetVarBlock name="navi_next">&nbsp;次へ&nbsp;&gt;</MTSetVarBlock>

<mt:Ignore>前のNページ</mt:Ignore>
    <MTSetVarBlock name="navi_prev_page">&laquo;&nbsp;前の<$MTVar name="navi_per_page">ページ&nbsp;</MTSetVarBlock>

<mt:Ignore>次のNページ</mt:Ignore>
    <MTSetVarBlock name="navi_next_page">&nbsp;次の<$MTVar name="navi_per_page">ページ&nbsp;&raquo;</MTSetVarBlock>

<mt:Ignore>最初へ</mt:Ignore>
    <MTSetVarBlock name="navi_first">&laquo;&nbsp;最初へ&nbsp;</MTSetVarBlock>

<mt:Ignore>最後へ</mt:Ignore>
    <MTSetVarBlock name="navi_last">&nbsp;最後へ&nbsp;&raquo;</MTSetVarBlock>

<mt:Ignore>ナビ番号接頭</mt:Ignore>
    <MTSetVarBlock name="navi_prefix"><span></MTSetVarBlock>

<mt:Ignore>ナビ番号接尾</mt:Ignore>
    <MTSetVarBlock name="navi_suffix"></span></MTSetVarBlock>

<mt:Ignore>検索クエリ</mt:Ignore>
    <MTSetVarBlock name="search_link">
        <$MTCGIPath$><$MTSearchScript$>?IncludeBlogs=<$MTBlogID$>
        &amp;template_id=<$MTBuildTemplateID$>
        &amp;limit=<$MTVar name="entries_per_page"$>
        &amp;archive_type=Index
        &amp;page=
    </MTSetVarBlock>
    <$MTVar name="search_link" strip="" trim="1" setvar="search_link"$>


<mt:Ignore>動的ページ----------------------------------------------------</mt:Ignore>
    <MTIf name="search_results">

<mt:Ignore>表示ページの計算</mt:Ignore>
        <$MTCurrentPage setvar="current_page"$>
        <$MTVar name="current_page" op="-" value="1" setvar="current_page_minus"$>
        <$MTVar name="current_page_minus" op="/" value="$navi_per_page" regex_replace="/(\d*)\.(\d*)/","$1" setvar="navi_page_minus"$>
        <$MTVar name="navi_page_minus" op="*" value="$entries_per_page" setvar="navi_start_pages"$>
        <$MTVar name="navi_start_pages" op="+" value="1" setvar="navi_start_pages"$>
        <$MTVar name="navi_page_minus" op="+" value="1" setvar="navi_page"$>
        <$MTVar name="navi_page" op="*" value="$navi_per_page" setvar="navi_end_pages"$>
        <$MTVar name="navi_start_pages" op="-" value="1" setvar="navi_page_prev_page"$>
        <$MTVar name="navi_end_pages" op="+" value="1" setvar="navi_page_next_page"$>
        <$MTTotalPages setvar="total_pages"$>
        
        <MTIf name="navi_page_minus" le="0">
            <MTVar name="navi_page_prev" value="">
        <MTElse>
            <MTSetVarBlock name="navi_page_prev">
                <a href="<$MTVar name="search_link"$><$MTVar name="navi_page_prev_page"$>" rel="nofollow"><$MTVar name="navi_prev_page"$></a>
            </MTSetVarBlock>
        </MTIf>
        
        <MTIf name="navi_page_next_page" le="$total_pages">
            <MTSetVarBlock name="navi_page_next">
                <a href="<$MTVar name="search_link"$><$MTVar name="navi_page_next_page"$>" rel="nofollow"><$MTVar name="navi_next_page"$></a>
            </MTSetVarBlock>
        <MTElse>
            <MTVar name="navi_page_next" value="">
            <$MTVar name="navi_end_pages" value="$total_pages"$>
        </MTIf>
    
<mt:Ignore>HTML出力</mt:Ignore>
        <MTSetVarBlock name="pagination_navigation">
            <MTIfPreviousResults>
                <$MTVar name="navi_prefix"$><a href="<$MTVar name="search_link"$>1" rel="prev nofollow" onclick="return swapContent(-1);"><$MTVar name="navi_first"$></a><$MTVar name="navi_suffix"$>
                <$MTVar name="navi_prefix"$><$MTVar name="navi_page_prev"><$MTVar name="navi_suffix"$>
                <$MTVar name="navi_prefix"$><a href="<$MTPreviousLink$>" rel="prev nofollow" onclick="return swapContent(-1);"><$MTVar name="navi_prev"$></a><$MTVar name="navi_suffix"$>
            </MTIfPreviousResults>
            <MTFor from="$navi_start_pages" to="$navi_end_pages" step="1">
                <MTIf name="__index__" eq="$current_page">
                    <$MTVar name="navi_prefix"$><$MTVar name="__index__"$><$MTVar name="navi_suffix"$>
                <MTElse>
                    <$MTVar name="navi_prefix"$><a href="<$MTVar name="search_link"$><$MTVar name="__index__"$>" rel="nofollow"><$MTVar name="__index__"$></a><$MTVar name="navi_suffix"$>
                </MTIf>
            </MTFor>
            <MTIfMoreResults>
                <$MTVar name="navi_prefix"$><a href="<$MTNextLink$>" rel="next nofollow" onclick="return swapContent();"><$MTVar name="navi_next"$></a><$MTVar name="navi_suffix"$>
                <$MTVar name="navi_prefix"$><$MTVar name="navi_page_next"><$MTVar name="navi_suffix"$>
                <$MTVar name="navi_prefix"$><a href="<$MTVar name="search_link"$><$MTVar name="total_pages"$>" rel="next nofollow" onclick="return swapContent();"><$MTVar name="navi_last"$></a><$MTVar name="navi_suffix"$>
            </MTIfMoreResults>
        </MTSetVarBlock>
    
<mt:Ignore>静的ページ----------------------------------------------------</mt:Ignore>
    <MTElse>
        <MTIf name="archive_template">
            <$MTArchiveCount setvar="total_entries"$>
        <MTElse>
            <$MTBlogEntryCount setvar="total_entries"$>
        </MTIf>
        
        <MTIf name="total_entries" gt="$entries_per_page">

<mt:Ignore>表示ページの計算</mt:Ignore>
            <$MTVar name="total_entries" op="/" value="$entries_per_page" regex_replace="/(\d*)\.(\d*)/","$1" setvar="navi_end_pages"$>
            <MTIf  name="total_entries" op="/" value="$entries_per_page" gt="$navi_end_pages"$>
            	<$MTVar name="navi_end_pages" op="+" value="1" setvar="navi_end_pages"$>
            </MTIf>
            <$MTVar name="navi_per_page" op="+" value="1" setvar="navi_page_next_page"$>
            
            <MTIf name="navi_end_pages" gt="$navi_per_page">
                <MTSetVarBlock name="navi_page_next">
                    <$MTVar name="navi_prefix"$><a href="<$MTVar name="search_link"$><$MTVar name="navi_page_next_page"$>" rel="nofollow"><$MTVar name="navi_next_page"$></a><$MTVar name="navi_suffix"$>
                </MTSetVarBlock>
                <$MTVar name="navi_last_pages" value="$navi_per_page"$>
            <MTElse>
                <$MTVar name="navi_page_next" value=""$>
                <$MTVar name="navi_last_pages" value="$navi_end_pages"$>
            </MTIf>

<mt:Ignore>HTML出力</mt:Ignore>
    		<MTSetVarBlock name="pagination_navigation">
                <MTFor from="1" to="$navi_last_pages" step="1">
                    <MTIf name="__first__">
                        <$MTVar name="navi_prefix"$><$MTVar name="__index__"$><$MTVar name="navi_suffix"$>
                    <MTElse>
                        <$MTVar name="navi_prefix"$><a href="<$MTVar name="search_link"$><$MTVar name="__index__"$>" rel="nofollow"><$MTVar name="__index__"$></a><$MTVar name="navi_suffix"$>
                    </MTIf>
                </MTFor>
                <$MTVar name="navi_prefix"$><a href="<$MTVar name="search_link"$>2" rel="next nofollow"><$MTVar name="navi_next"$></a><$MTVar name="navi_suffix"$>
                <$MTVar name="navi_page_next"$>
                <$MTVar name="navi_prefix"$><a href="<$MTVar name="search_link"$><$MTVar name="navi_end_pages"$>" rel="next nofollow" onclick="return swapContent();"><$MTVar name="navi_last"$></a><$MTVar name="navi_suffix"$>
    		</MTSetVarBlock>
        <MTElse>
        	<$MTVar name="pagination_navigation" value=""$>
        </MTIf>
    </MTIf>

<$MTVar name="pagination_navigation" strip=" " trim="1" setvar="pagination_navigation"$>
<mt:Ignore>===================ページネーション生成ここまで===================</mt:Ignore>
記事概要の出力部分
<mt:Entries limit="$entries_per_page" search_results="1">
    <$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
ナビゲーションの出力部分
<MTIf name="pagination_navigation">
    <div>
        <$MTVar name="pagination_navigation"$>
    </div>
</MTIf>

使い方

ページネーション生成部分をメインインデックスなどのテンプレートの上の方に置きます。具体的には、記事概要の出力部分やナビゲーションの出力部分よりも前に置いておけば大丈夫です。

試してないですが「Rainer」のように、一部をモジュールに登録してしまっても動くかもしれません。そのほうがスッキリしそうですね。

ページネーション生成の設定パートで、適宜お好みの設定をします。

ナビゲーションのリンクは、rel="nofollow"としてありますので、気に入らなければ、検索して該当する部分を全部削除してください。

記事の一覧が1ページに納まってしまう場合は、ナビゲーションは表示されません。

また、ジャンプ用のナビゲーションが「次へ」「次のNページヘ」「最後のページヘ」の3種類出力されますが、これらも、該当がない場合は表示されません。

ジャンプ用ナビは普通は3種類もいらないので、必要な物以外は、動的ページ用と静的ページ用のそれぞれの「HTML出力」パートで該当のものを見つけ、mt:Ignore でコメントアウトするか、まるっと削除してください。

デザインの都合で出力するナビ番号にタグを付けたくなることを想定して、設定部分に、ナビ番号の前後に付加する prefix と suffix の変数を用意していますが、これで対応しきれない場合も、「HTML出力」パートを直接いじくってください。

ステップ数が多いソースなので非力なサーバーで動かすと重いかもしれませんね。というわけで、わかる人は不要な部分をまるっと削除してください。

データに直接影響を与えることは無いと思いますが、ご使用にあたっては自己責任でよろしくお願いいたします。

不備がみつかったら、適宜修正するつもりではいます。