タグ:MT

「About」ウィジェットとカテゴリ絞込み検索の相性(Movable Type)

MTのウィジェットである「About」。

検索結果ページなどで上記の画像のような文章が出るウィジェットですが、検索にて「カテゴリ」の絞り込みをするとバグります。

具体的にはカテゴリ絞込み検索で、かつ検索にヒットするエントリが存在しない場合は以下のような画面になってしまいます。

特に必要がなければ外しておきましょう。

カテゴリ絞込み検索については「MTにてカテゴリを絞り込んで検索する方法」をご覧ください。

nandani | 2010年10月26日 | コメント(0) | トラックバック(0) | CMS関連

MTにてカテゴリを絞り込んで検索する方法1

やりたいこと。

MTの検索フォーム。通常だとフリーワードの検索しかできないが、カテゴリを絞り込んだ状態でフリーワード検索を行いたい。

というわけでいい方法がないかな~とググっていると、こちらのサイトでバッチリ解決しました。

MT:検索フォームにカテゴリー絞り込み機能をつける(グラビカ学習帳さんのサイト)

MTブログ管理画面の「デザイン>ウィジェット>検索」ウィジェットにてformタグの直下に

<input type="hidden" id="select" name="limit" value="<$mt:SearchMaxResults$>" />
<select name="category">
<option value="0">全カテゴリー</option>
<MTTopLevelCategories>
<MTSubCatIsFirst></MTSubCatIsFirst><MTIfNonZero tag="MTCategoryCount">
<option value="<mt:categorylabel>"><$MTCategoryLabel$> [<$MTCategoryCount$>]</option>
</MTIfNonZero><MTSubCatsRecurse><MTSubCatIsLast></MTSubCatIsLast>
</MTTopLevelCategories>
</select>

を入力するだけ。(グラビカ学習帳さんのソースをまるまる引用)

これで、プルダウンでカテゴリを絞り込み、かつフリーワード検索を行うことができます。

ただ、問題点が。

上記の方法を試してみるとわかりますが、「検索結果」画面に移るとカテゴリ選択のプルダウンが「全カテゴリー」に戻ってしまいます。検索についてはもちろん選択したカテゴリで絞り込まれているので問題ないといえば問題ないんですが、できれば選択したままの状態で表示してほしい。

<$mt:SearchString$>のようにカテゴリの値も取得できるタグがあれば、selected="selected"をつけることができますが、どうもそういうタグが無いっぽい?

なぜ無いんだーーー!!

仕方ないのでjavascriptにてGETリクエスト値を取得することにします。

※以下の変更はMT5で行っております。MT4での動作は確認しておりません。

 

1.カテゴリプルダウンにIDをつけます。

上記の「検索」ウィジェットで追加したプルダウンの、selectタグに「id="select_category"」を追記します。

<input type="hidden" id="select" name="limit" value="<$mt:SearchMaxResults$>" />
<select name="category" id="select_category">
<option value="0">全カテゴリー</option>
<MTTopLevelCategories>
<MTSubCatIsFirst></MTSubCatIsFirst><MTIfNonZero tag="MTCategoryCount">
<option value="<mt:categorylabel>"><$MTCategoryLabel$> [<$MTCategoryCount$>]</option>
</MTIfNonZero><MTSubCatsRecurse><MTSubCatIsLast></MTSubCatIsLast>
</MTTopLevelCategories>
</select>

 

2.検索ワード出力の部分を改良します。

MTブログ管理画面の「デザイン>テンプレート>検索結果」テンプレートを開き

「<$mt:SearchString$>」と一致するもの

の部分を

カテゴリ:<span id="search_category"></span><br />
<MTSetVarBlock name="category_string"><$mt:SearchString$></MTSetVarBlock>
<MTIf name="category_string" eq="">
検索ワード:なし<br />
<MTElse>
検索ワード:<$mt:SearchString$><br />
</MTIf>
と一致するもの

に変更します。

 

3.2.と同じく「検索結果」テンプレートのheadタグ内に以下のスクリプトを記述します。

<script type="text/javascript">
function getRequest(){
    if(location.search.length > 1) {
        var get = new Object();
        var ret = location.search.substr(1).split("&");
        for(var i = 0; i < ret.length; i++) {
            var r = ret[i].split("=");
            get[r[0]] = r[1];
        }
        return get;
    }else{
        return false;
    }
}

function searchCategory(){
    var get = getRequest();
    var search_category = decodeURI(get["category"]);
   
    if(search_category == "0"){
        document.getElementById("search_category").innerHTML = "すべて";
    }else{
        document.getElementById("search_category").innerHTML = search_category;
    }
   
    var option = document.getElementById("select_category").getElementsByTagName("option");
    for(i=0;i<option.length;i++){
        if(option[i].value == search_category){
            option[i].selected = true;
              break;
        }
    }
}
</script>

getRequest()関数は「JavaScriptでGETを取得する(S-MEMOサイトさん)」を参考にしました。(というかまんまです。)

 

4.同じく「検索結果」テンプレートのbodyタグにてsearchCategory()関数を呼び出します。

bodyタグに「onload="searchCategory()"」を追加してください。

<body id="<$mt:BlogThemeID$>" class="mt-search-results <$mt:Var name="page_layout"$>" onload="searchCategory()">

 

これで検索結果ページでも、どのカテゴリで絞り込んだかを表示でき、かつ検索フォームのカテゴリ選択プルダウンが選択されたままの状態で表示されるようになります。

こんな感じ↓

CSVループコンバータ!

MTを扱っている人ならば、ブログ記事のエクスポート・インポート機能というものがあることをご存知かと思います。
MT5からはさらにカスタムフィールドの内容も書きだせるようになったということで、ようやくかゆい所に手が届いたたなぁと思っていたら、画像のカスタムフィールドは書き出せないみたいorz
 
まあ今回は必要ないからいいんですが、今回、エクセルデータにリストでまとめられたデータをMTに投稿するという仕事がありまして、300件分以上あるデータをいちいちMTで投稿してられないし(MT5は便利だけどめっちゃ重いし)、とりあえずcsv形式にして、プログラムでMTにインポートできるような形式に変換して、インポート機能を使ってぶち込むのがいいかなぁと思っていたところ、こんな記事を見つけました。
 
 
その中で紹介されていたアプリケーション。
その名も「CSVループコンバータ」。
なんてうってつけなアプリケーションなんだ!
使い勝手も、考えていた通りのことができるし、(あえていうならループによる連番を記述できる変数とかがあるとよかったんですが)好きにテンプレートを作れるし超便利。
やっぱり自分が考えているようなことって、すでに先駆者がいるんですねぇ。
 
本当なら「CSVループコンバータ」のようなプログラムをPHPで組む予定だったんですが、必要なくなったんで終了!
製作者さんありがとう!
 
ダウンロードはこちらから行えます。

MTのエクスポート・インポート時の注意事項

MTでカスタムフィールドをインポートしたのはいいのですが、空の場合なら表示しないというタグの
<mt:If tag="entry_test" >
をつけているのに、なぜか空でも中身を表示してしまう。
 
<mt:If tag="entry_test" >
テスト:<mt:entry_test>
</mt:If>
 
とすると、entry_testの内容が空のはずなのに
テスト:
と表示されてしまいます。
 
なぜだ!
 
さっそくググってみると、こちらに原因と対策方法が書いてありました。
 
どうやらインポート時に余計な半角スペースが入ってしまうようです。
MTの仕様上、しかたないようですが。
というわけでmt:Ifの記述に以下を追加します。
<mt:If tag="entry_test" strip_linefeeds="1" trim="1" >
 
これで半角スペースが入っていても万事解決です!

nandani | 2010年07月18日 | コメント(1) | トラックバック(0) | CMS関連

MTSetVarBlockの注意事項

MTで変数を定義するときには
・MTSetVar
・MTSetVarBlock
の2パターンがあります。
 
簡単な文字列を使用する場合は「MTSetVar」
例) 
<MTSetVar name="hoge" value="文字列">
 
ブロックで使用する場合、またはMT用のタグを使用する場合は「MTSetVarBlock」を使用することになります。
例)MT用のタグの場合
<MTSerVarBlock name="hoge">
<$MTEntryTitle$>
</MTSerVarBlock>
 
取り出すときは
例) 
<MTGetVar name="hoge">
とします。
 
ということで、さっそくエントリーのタイトルを変数に入れて、今度はMTIfで条件分岐してみましょう。
例)
※エントリータイトルが「ほげ」であるとする。
<MTSerVarBlock name="hoge">
<$MTEntryTitle$>
</MTSerVarBlock>
 
<MTIf name="hoge" eq="ほげ">
この記事のタイトルは、「ほげ」です。
</MTIf>
 
さて、これでMTIfの中の文章はちゃんと表示され・・・ねぇ・・・
 
なぜだ!
 
というわけで、Googleの出番です。
さっそく見つかりました。
 
http://www.h-fj.com/blog/archives/2007/09/20-101526.php (The blog of H.Fujimotoさん)
 
どうやらMTSetVarBlockでは、改行コードまで変数の中に含んでしまうようです。まあBlockという意味を考えれば当たり前ですね。
 
というわけで解決方法
<MTSerVarBlock name="hoge"><$MTEntryTitle$></MTSerVarBlock>
 
<MTIf name="hoge" eq="ほげ">
この記事のタイトルは、「ほげ」です。
</MTIf>
 
MTSerVarBlockでは改行しない!(もちろん時と場合によりますが)
今度はちゃんと「この記事のタイトルは、「ほげ」です。」が表示されました。
 
よかったよかった。

nandani | 2010年07月18日 | コメント(0) | トラックバック(0) | CMS関連

Copyright(c) 2010 - 2024 ダリの雑記