• 締切済み

Movable Type エントリーの並び替え

Movable Type 4.23-ja での質問です。 とある規則でエントリーの並び替えをしたいと思い、 http://looselife.net/blog/movabletype/200506022331.php http://blogs.grf-design.com/archives/2005/03/category_sortin_1.html#extended http://sane.jf.land.to/archives/2006/200603162326.php などを参考にしましたが、動作しませんので、アドバイスをお願いします。 テストとして、basename順に表示するように以下のファイルを作成してみました。 **** mt/extlib/MySort.pm *********** package MySort; sub basename_sort ($$) { my ($a, $b) = @_; return $a->basename cmp $b->basename; } ******************** そして、テンプレートで <MTEntries sort_method="MySort::basename_sort"> としてみたのですが、sort_method を指定していないときと同様に 最近の投稿順に表示されてしまいます。 指定方法がまずいのか、ソースがおかしいのか、 原因が分からず関連ドキュメントも見つからずに困っております。 アドバイスお願いします。

みんなの回答

  • elbavom
  • ベストアンサー率100% (67/67)
回答No.1

こんばんは。 テストされているテンプレートは指定方法がまずいです。sort_methodモディファイアはカテゴリ系のテンプレートタグでしか利用できません。Entriesタグで使用できるモディファイアは、参考URLに記載されているものです。 「とある規則」とはbasenameではないように思いましたが、何でしょうか?

参考URL:
http://www.movabletype.jp/documentation/appendices/tags/entries.html
palayo
質問者

お礼

elbavom さん、ご回答ありがとうございます。 Entries タグでは sort_order しかなくて、sort_method は指定できないのですね・・・。 最終的にやりたいのは、指定した日付に近い5件のエントリーを ピックアップすることです。 「エントリーの日付-指定した日付」の絶対値でソートすれば、 いけるかと思って、とりあえずbasenameでソートできるか実験したわけです。 何か方法があればアドバイスいただけるとありがたいです。

関連するQ&A

  • Movable Typeの変数タグの使い方

     お世話になっております。Movable Type4.1から本格的に導入された変数タグの使い方についてわからないことがあり調べてもなかなか出てこないので分かる方がいらしたらおしえてください。 以下のようなテンプレートタグを作っているのですが、このテンプレートでは、サブカテゴリーに属する記事を順に表示してゆくというものです。 カテゴリーごとの階層表示などはできますが、再下層のカテゴリーからそのエントリー記事を表示するとなるとちょっと複雑になるようです。 最初に<MTSubCategories>からサブカテゴリーの名前を取得して配列に格納しています。 次にサブカテゴリーの名前をループで表示させながらそのサブカテゴリーに属する記事を同時に表示しているのですが、どうやら、<MTEntries category="<$MTVar name="__value__"$>"…というくだりがうまくいってないようです。ここでは表示するエントリーをカテゴリーで指定しているのですが、<$MTVar name="__value__"$>という配列の値が展開されていないようです。モディファイアの中ので変数展開のやり方が調べてもなかなか出てきませんでした。 <MTSubCategories> <MTSetVarBlock name="push(subcategories)"><$MTCategoryLabel$></MTSetVarBlock> </MTSubCategories> <MTLoop name="subcategories"> <h2><$MTVar name="__value__"$></h2> <MTEntries category="<$MTVar name="__value__"$>" sort_order="ascend"> //←ここがうまくいっていないです。 <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>::<$MTEntryExcerpt convert_breaks="1"$> <a href="<$MTEntryPermalink$>">>></a><br /> </MTEntries> </MTLoop>  変数展開の部分がうまくいけばなんとかなると思うのですが、わかる方がいらしたらおしえてください。  よろしくお願いします。

  • MovableType4 エントリタイトルを絞り込んでリスト表示する方法

    はじめまして。MT4.2を使用しております。 色々調べたのですがサッパリわかりません● ぜひお力貸してくださいませm(_ _)m 要は「50音別リスト」を作りたいと思ってます。 エントリタイトルをカタカナで入力しているので <MTEntries sort_by="title" sort_order="ascend"> と指定すればアイウエオ順でリスト表示されます。 ここまではOKなのですが、 「ア」「カ」「サ」などの区切りごとに小見出しを入れたいのです。 (<a name="ka" id="ka" />や、小見出し画像など) 今の状態では「ア」から「ン」までが一気にリスト表示されてしまいます。 どのような方法で希望が実現しそうでしょうか? 宜しくお願い致します。

  • サイト内検索CGI 更新新しい順に表示したい(2)

    http://okwave.jp/qa/q9269398.html ↑以前に質問したページです。 解決しないまま4週間たちそうなので(2)のページを作りました。 以前の質問はこんな感じでした↓ ──────────────────────────────────────────────────── CGIのSite_Searchを使っているのですが、公式サイトが閉鎖してしまっています。 Site_Searchの検索結果画面はこんな感じです。 http://nihon5ch.net/contents/ch5/site_search.cgi?mode=and&key=%A4%E2%A4%CE&list=40 これを、Key Search(http://www.kent-web.com/data/ksearch.html)のように、 update(Key Searchでいうところの日付)の新しい順に表示し、 できれば「新しい順/古い順」にソートできるようにしたいのです。 site_search.cgiの中身はこんな感じです。 http://delcy.jp/site_search.cgi ──────────────────────────────────────────────────── こちらのサイトのおかげで、 1回目の検索で、検索結果を新しい順に表示し、 検索結果画面の検索窓のところに、プルダウン「(ページの更新日が)新しい順/古い順」を設置する、という所まではできるようになりました。 今困っているのは、 プルダウンで「古い順」を選んでも、検索結果が古い順にソートされない事です。 ちなみに、print "$in{'sort'}<br>";を組み込んで、「古い順」で検索してみると、 値は「0(=古い順)」が表示されます。 ↓今回やってみたこと ──────────────────────────────────────────────────── ●$sortFlag = $in{'sort'}だけforeach ($top..$end) {の直前に入れたら 「500 Internal Server Error」が出たので以下のようにしました。 ●if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; はforeach ($top..$end) {の直後に入れました ↓今回カスタマイズした部分 ---------------- $sortFlag = $in{'sort'}; if($sortFlag == "") { $sortFlag = 1; } if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; foreach ($top..$end) { ($hfile,$htitle,$hsize,$hupdate,$hinf) = split (/<>/,$hits[$_]); if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; ──────────────────────────────────────────────────── よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • usort のユーザー定義比較関数の説明について

    PHPマニュアルにあるusortの説明がうまく理解できなくて悩んでいます。 そこでは、パラメータとなる比較関数について次のように書かれています。 「比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。」 http://php.net/manual/ja/function.usort.php 「usort() の例」として提示されているのは以下です。 function cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } $a = array(3, 2, 5, 6, 1); usort($a, "cmp"); この例のユーザー定義の比較関数cmpは、前述の説明の通りに書かれているので理解できます。 しかし、ユーザーページの投稿にもありますが、($a > $b) としたり、($a < $b) ? 1 : -1 のように返り 値を変えて降順(逆順)にソートするという使い方を普通に見かけます。 これは、「最初の引数のほうが二番目の引数より大きい場合は正の数を(……)二番目の引数より小さい場合は負の数を返す必要があ」るという説明とは矛盾しています。 「必要」とまで書いているのでかなり強い指示だと思います。英語版でも「must」となっているので翻訳上の問題はなさそうです。 また、「配列のソート」ページによるとソート順は「ユーザー定義」とあり、件の比較関数次第ということになっています。 http://www.php.net/manual/ja/array.sorting.php ということは、逆順であれ自然順であれ可能だとこれは示唆しているのだと思うのですが、やはり説明部分との矛盾が気になります。 ……どう捉えたらよいのでしょうか?

    • ベストアンサー
    • PHP
  • movabletypeでエントリーの表示順番を任意に決めたい

    MovabletypeをCMSとして利用しようとしています。 カテゴリに関しては、プラグインなどを利用し、カテゴリ名の頭に数字を入力して名前順に表示順番を自分で決めています。 エントリーの内容も同様に、自分で決めて一覧表示の時に任意の順番で表示させたいのですが、いい方法はないでしょうか。 一番いいのはカテゴリと同じようにエントリータイトルの頭に数字を入力して、その数字でソートしてくれるようなプラグインがあることですが…… 現状では日付をキーとした昇順と降順しかないようです。 どうしても任意で指定したければ、更新日をいじらなけらばならないのでしょうか? どなたかご教授下さい。

  • Perl if 文内にforeachを入れる場合

    if ($pattern eq 'p2') { foreach $key (sort{ ($re_key{$b} <=> $re_key{$a}) || $b cmp $a } keys %re_key) { } else { foreach $key (sort{ ($b <=> $a) || $b cmp $a } keys %re_key) { } $pattern の選択で検索の種類を切り替えたいのですが、上のように指定するとコンパイルエラーになってしまいます。 foreach 文以降の処理は全く一緒なので、foreach 文の行だけ変更したいのですが、どうすれば良いですか?

  • 連想二次元配列のUNIXTIMEでのソート

    ID(主キー)、unixtime、nameをフィールド名とするとするSQLのデータベースを取得してUNIXTIMEを比較してソートするようなPHPを作りました。   $contents= array(); $temp = mysql_query($query, $link ); while( $contents = mysql_fetch_array($temp, MYSQL_ASSOC)){ } //比較してソート function cmp($a, $b) { print_r($a); if ($a["unixtime"] == $b["unixtime"]) { return 0; } return ((int)$a["unixtime"] < (int)$b["unixtime"]) ? 1 : -1; } usort($contents, "cmp"); しかしこれを実行したところ、 Warning: usort() expects parameter 1 to be array, boolean given in C:\xampp\htdocs\php\outstr.php on line 49 となってしまいます。 usortのエラーのようですが、なぜこうなってしまうのでしょうか。 正常にソートできるような方法を教えてください。

    • ベストアンサー
    • PHP
  • ソートの方法

    某CGIを改造中です。 記事を更新日順でソートしなおしたいです。 多分、ソート部分だと思われる部分の現状は、 ----- foreach (@data) {   ($no,$year1,$month1,$day1,$name~~) = split(/<>/);   @tmp = ();   @tmp = map {(split /<>/)[0]} @data;   @data = @data[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp]; } ----- です。 ただ、見ての通り、日付が「$year1,$month1,$day1」と分かれています。これを結合して(20060309のような形)、それを元にソートしなおしたいのですが、どのようにしたら良いでしょうか? 方法を教えてください。お願いします。

    • ベストアンサー
    • Perl
  • php多次元配列のソート(usort)について

    http://www.php.net/manual/ja/function.usort.php にusortの例として下記がありますが、それについて質問です。 -------------例文------------- <?php function cmp($a, $b) { return strcmp($a["fruit"], $b["fruit"]); } $fruits[0]["fruit"] = "lemons"; $fruits[1]["fruit"] = "apples"; $fruits[2]["fruit"] = "grapes"; usort($fruits, "cmp"); while (list($key, $value) = each($fruits)) { echo "\$fruits[$key]: " . $value["fruit"] . "\n"; } ?> -------------結果------------- $fruits[0]: apples $fruits[1]: grapes $fruits[2]: lemons 上の例は、usortで$fruitsという配列をソートしています。 そのとき、cmpという関数を条件にしている、というのは分かりますが、 なぜcmpを条件にすることでアルファベットの昇順になるのでしょうか? strcmp($a["fruit"], $b["fruit"]);にたとえばlemonsとかapplesが入って strcmpによって比較がされて、結果として1や-1が返されて その結果、たとえばusort($fruits, "-1")や、usort($fruits, "1") となったとします。それがなぜ結果として昇順になるのでしょうか?

    • ベストアンサー
    • PHP
  • キーワードの再検索で

    index.phpからキーワードを書きだし、search.phpで$_GETで受け取り→エンコード→ リクエストURLまでセットし、表示されるまでは問題ないのですが、ソート順を変更した際にリクエストURLに2回、キーワードが入ってしまいます。ブラウザのアドレスバーをみると、エンコードされた値(%e3%81%bf%e3%81%8b%e3%82%93(みかんみかん)と言う感じにが2回入ってしまいます。それを、ソートを変更しても、キーワードを1回だけ入れるには、どのようにしたらいいのでしょうか? [index.php] <p><a href="search.php?keyword=みかん&sort=standard">みかん</a></p> [search.php] <?php $base = 'http://xxx.xxxxxx.co.jp/xxx/xxx'; $keyword =$_GET["keyword"]; $keyword = urlencode($keyword); $sort = $_GET["sort"]; $sort = urlencode($sort); // リクエストURL $url = $base ."&keyword=".$keyword."&sort=".$sort. ; ?> 表示順序 <form action="<?=$_SERVER["PHP_SELF"]?>" method="get"> </select> <input type="hidden" name="keyword" value="<?php print(htmlspecialchars($keyword, ENT_QUOTES)); ?>"> <select name="sort"> <option value="satandard">新着</option> <option value="itemPrice">安い</option> <input type="submit" value="検索"> </select> よろしくお願いいたします。

    • 締切済み
    • PHP