2017年2月8日水曜日

ページ番号を表示したい! ~Blogger テンプレートを作るよ! (41)~

こんにちはー!

Blogger では、前のページ、次のページへと行くためのリンクはありますが、現在何番目のページを開いているのか、という機能は標準のテンプレートには含まれていません。コンテンツ量を知る目安になりますから、できれば欲しいですよね。

なんだか難しそうなので今まで後回しにしてきましたが、そろそろ考えていこうと思います。

(前回:『ラベルごとの最新記事取得(後編) ~Blogger テンプレートを作るよ! (40)~』)




まずは Blogger 側の仕組みを知る

Blogger の製作者だって、その機能が必要だと思えば最初からそういう機能を導入してくれていた……かもしれません!

しかし、なぜ Blogger は標準テンプレートで総ページ数やページ番号を付けておいてくれなかったのでしょう。そこにはきっと理由があるはずです。

という事で、まずは標準テンプレートでやってるページ分割の仕組みについて考えてみましょう!

指定日時検索でページ処理

ざっくりいうと、Blogger の大部分はそもそも投稿を「○○件目から○○件目までを表示」というようなページ処理をしていません。大部分と言ったのは、キーワード検索を行ったときだけは例外的にそのような仕組みでページ処理しているからです。

ページ処理というと、 startIndex=100 とやると100件目から取得できるみたいなそういう仕組みを想像しますが、Blogger では updated-max=2017-02-01T12:00:00+09:00 というように日時で検索します。

わかりやすく表示件数を10件とすると、トップページにある「前の投稿」というリンクの挙動は、純粋に「11件目~20件目を表示する」のではなく、「いま表示している10件目の更新日時より前の投稿を検索し、検索結果を10件表示する」という動作になっています。

ページを切り替えるたびに検索条件の更新日時を変えて検索し直しているだけなので、 Blogger は今全体から見て何件目~何件目を表示しているのかは知らないし、知る方法も用意されていない、でもページ表示できるという状態になっています。

ページ処理の方法としてはなかなか理に適っているのですが、ページ数をわかりにくくさせている原因であることは確かです。

「新しい投稿」の面白い動き

「前の投稿」の仕組みはわかりましたが、「新しい投稿」をクリックしたときの動作はどうなっているかというと、こちらも「この日時より前に更新された投稿」という仕組みを使っています。

1ページ目、つまりトップページには「新しい投稿」がなく、2ページ目の「新しい投稿」にはトップページが設定されていて、3ページ目以降の「新しい投稿」には「今の1件目の投稿から11件先の投稿の更新日時より前の10件」のような感じになっています。

なんだか言葉にするとややこしいですね。というかどうやって11件先の投稿の更新日時を取得しているのか、それは Blogger テンプレートや javascript でも使える機能なのか、とても気になります。

ちなみに、updated-min というパラメータもあります。こちらを使えば「この日時より後に更新された投稿」で検索することができますが、検索結果は新しい順に並んでしまうので最後の10件だけ取得したい、ということができません。

謎のパラメータ 「start」

ちなみにですが、「前の投稿」を2回以上押したとき、 URL に start というパラメータが追加されています。このパラメータは「前の投稿」をクリックするたびに加算されていきます。

「お、こいつは使えるぞ!」

そう思った方もいらっしゃることかと存じます。

ところが、このパラメータはキーワード検索限定で、それ以外では効果がないどころか挙動もおかしいため、少なくともこのままでは使用できません。

例えば、ブログを10件表示の設定にして、トップページから「前の投稿」を5回押すと40になりますが、その後「新しい投稿」を押すとパラメータが消えてしまい、それから再び「前の投稿」を押すと10になってしまいます。

理想を言えば、「新しい投稿」を押すとパラメータが減り、その後「前の投稿」を押すと元の数字に戻るというのならページ番号の計算に使用できたので多少楽なのですが、残念です。

キーワード検索の「updated-max」

さて、先ほどからチラチラ話に出てくるキーワード検索ですが、これはナビゲーションバーの検索ボックスを使ったサイト内検索のことで、この検索結果も Blogger のブログ内に表示されます。

こちらはほかの検索とどう違うのかというと、 updated-max などの日付指定が効かなくなって、代わりに start パラメータが効くようになり、動作も正常になっています。

そのため、ページ番号を知りたければ start と max-results から計算すればすぐに判定ができます。割り算して端数切り捨て + 1 でたぶんページ数になります。パラメータがない場合は 1 ページ目です。

どうしてこちらは更新日時検索じゃないのかというと、キーワード検索のときは標準が「関連度順」という並びになっていますので、単純に更新日時で並べることができないのが主な理由でしょう。

ただし、キーワード検索にも大きな問題があります。それは、検索の件数を知る方法がないということです。ヒットした件数が分からなければ、総ページ数を計算することが出来ません。

あえてやるならば、例えば1ページ20件なら max-results=1&start=20 で内部的にブログ検索して、結果のHTMLを javascript で解釈し、ヒットありならば21件以上あるのは確定なので次は20増やし……のように刻んでアクセスを繰り返して総ページ数を判定する方法も不可能ではないと思います。

件数が多くなることを考えると、刻み幅を倍々に増やしてヒット無しになったら細かく刻んでいくようにすれば検索回数は多少改善できるんですが、それにしてもあまり良い手段とは思えません。

まとめ

Blogger の大部分、投稿の一覧を表示するときは「この日時より前の投稿」の検索を繰り返してページを再現しているということをまず頭に叩き込んでおく必要があります。

そのため、Blogger テンプレートでは以下のような環境で動作するものを考えなくてはなりません。

  • 「現在は何件目である」という情報がない
  • 「何件目はこの投稿である」という情報がない
  • ページ番号でジャンプすることができない


ですが、基本的にブログは最新の投稿を読むものですので、ページ番号でジャンプなどは利用する機会があまりないかもしれません。

それを踏まえると、そういったあまり使われない機能の実装を見送り、 updated-max パラメータ一つでページ切り替えも「何月何日以前の最新の投稿」という検索も両方できるようにしたというのは合理的な選択だと思います。

ま、無料だからしょうがない! そこはテンプレート製作者の腕の見せ所でしょう。

ということで、凝り固まった頭をほぐし、せっかくの特徴である「順番ではなく更新日時を使う」というシステムをうまく活用したテンプレートを作ってみたいものです。

がんばって考えるぞ~!

0 件のコメント :

コメントを投稿