2017年2月23日木曜日

ページナビゲーションの検討② ~Blogger テンプレートを作るよ! (43)~

こんにちはー!

前回、ページナビゲーションの検討を行いましたが、フィードガジェットをあまり使わずに出来る限り実装したいという気持ちになってきました。

(前回:『ページナビゲーションの検討① ~Blogger テンプレートを作るよ! (42)~』)

フィードを使わない方法でページナビゲーションを実装するとしたら、どれくらいのことができるのか、考えていきたいと思います。

ページナビゲーションの材料(再掲)

改めて、必要な情報を再掲します。
  • 現在のページ番号
    • 1ページあたり何件表示するか
    • 先頭から数えて何番目か
  • 全体のページ数
    • 1ページあたり何件表示するか
    • 全部で何件か
  • 前のページ、次のページ
    • 前のページのURL
    • 次のページのURL
  • 指定ページへのジャンプ
    • 指定したページ番号のURL現在のページ番号
そのうち、フィードを使って実装しようとしていたのは「全検索」と「ラベル検索」ですね。これらについて、もう一度考えてみましょう。

全検索ページ

全検索:先頭から数えて何番目か

全検索の場合、ブログアーカイブガジェットを使うことで先頭から数えて何番目かを計算することができます。

ブログアーカイブガジェットの利用



ブログアーカイブには、全てのアーカイブページへのリンクが存在しています。しかもアーカイブ内の投稿数まで表示してくれる機能まで付いています。ですので、投稿の日時を見れば「今の投稿が含まれるアーカイブまでの件数」を知ることができます。

それと、ブログアーカイブウィジェットでは個々のアーカイブページの投稿のタイトルとリンクをサーバーから取得できるようになっています。これはなんと、閲覧権限のある閲覧者のブラウザからなら、非公開のブログでもデータを取得することができるというすごい特徴があります!

ブログのURLの後に色々とパラメータを追加すると、
アーカイブ内の各投稿のタイトルとURLが返却される

それを利用してアーカイブ内の投稿一覧を取得すれば、「アーカイブ内の何件目か」を知ることができます。

「今の投稿が含まれるアーカイブまでの件数」+「アーカイブ内の何件目か」=「先頭から数えて何番目か」

となります。

使われていない start パラメータの利用

URL の start パラメータは全検索ページでは無意味なパラメータなので、前のページのリンクの start の値を 今の値+表示件数 にするなど、正確な値を入れてあげることで、キーワード検索のようにページ番号を取得するということもできます。

全検索:全部で何件か

ブログアーカイブガジェットのアーカイブの件数を合算すればフィードを使わずとも全件数を取得することができます。

全検索:指定したページ番号のURL

「先頭から数えて何番目か」の情報と同様、ブログアーカイブガジェットを使って工夫すれば「〇〇件目の投稿を含むアーカイブ」を取得するところまでは実装可能です。

その URL を元に javascript の AJAX という機能を使ってサーバーにアクセスし、取得した HTML ファイル(アーカイブページ)を解析し、その投稿の日時を取得することで、新しい URL を作り出すことができます。

全検索:前のページ(前の投稿)

特に何をしなくても同等の機能を持つボタンが存在していますので、そこからリンクを拾うだけです。

全検索:次のページ(新しい投稿)

前のページと同様、最初からボタンが存在しますので、そこからリンクを拾うだけです。

ラベル検索ページ

ラベル検索:先頭から数えて何番目か

ラベル検索では、フィードを使わずにスマートな方法で番号を取得する手段がありません。

使われていない start パラメータの利用

全検索と同じように、URL の start パラメータを使う方法があります。

先頭から検索を繰り返して個数を数える

AJAX でラベル検索ページを内部的に閲覧して何件目にあったかを調べることは、大変ですが技術的には不可能ではありません。updated-min に先頭の投稿の日時を入れ、 max-results を 1000 などの大きな値にして検索をかけ、その結果の件数を取得します。

max-results に上限が設定されている可能性もあるので、1000件以内だった場合ももう一度、今度は updated-max も入れて検索し、それ以降の投稿があるかどうかを確認する必要があります。

ラベル内の投稿数が多い場合は何度も連続して取得せざるを得なくなるため、Blogger のサーバーに負荷をかけ、閲覧者の回線の通信量を増やす結果になりかねないという諸刃の剣であり、検索ページを開くたびにこの方法を使うのは倫理的によろしくない手段です。

ラベル検索:全部で何件か

Blogger にラベルガジェットがあり、設定が「すべてのラベル」になっていれば、どのようなラベルでもラベル名からラベルごとの投稿数を取得することは可能です。ただし、テンプレート側でラベルガジェットをロックしても設定そのものはユーザー任せにせざるをえないので、ユーザーがその設定を変えると動かなくなります。

上述の「先頭から検索を繰り返して個数を数える」の方法を使って全件数の検索をしてしまうという方法もありますが、何件有るかわからない検索を検索ページを開くたびに行うのは、サーバーへの負担を考えると現実的ではないように思います。

ラベル検索:指定したページ番号のURL

良い手段ではありませんが、上述の「先頭から検索を繰り返して個数を数える」と同様の方法で、指定したページ番号の一つ前の投稿を見つけるまで検索を繰り返す方法があります。
ページ番号にジャンプしたいという閲覧者のアクションを起こしたときにだけ実行しますので、ページごとに処理が必要な「先頭から数えて何番目か」と違ってサーバーに負担をかける頻度が少ないため、まだ現実的な手段だと考えられます。

指定したページ番号の一件前にあたる投稿を発見できれば、その日時から指定したページ番号の URL が作れます。

ラベル検索:前のページ(前の投稿)

ボタンからリンク取得し、start のパラメータを追加または改変をします。

ラベル検索:次のページ(新しい投稿)

前のページと同様、ボタンが存在している……と思ったら、どうも挙動が違いました。「新しい投稿」ボタンのリンクは常に検索の1ページ目を指しているようです。

そのままで良ければそのままで、そうでなければ「指定したページ番号のURL」と同等の手段で、目的のページを探し出す必要がありますね。

まとめ

極力フィードを使わずに実装する場合、キーワード検索ページとアーカイブページについては元々フィードを使わないので変化がなく、全検索ページとラベル検索ページだけ内容が異なります。

「現在のページ番号」については、全検索とラベル検索のリンク先URLにある start の値を正確な数値にすることで表示することができそうです。

ただ、こちらで用意した方法以外で検索ページに飛んだ場合に番号がずれる可能性があることと、Blogger に仕様変更が起きるとブログが誤作動を起こす可能性もなくはないので、その点については注意しないといけません。

「全ページ数」は、全検索は可、ラベル検索はガジェットの設定という条件付きで可。ちなみに、キーワード検索は不可です。

「指定したページ番号のURL」については、ラベル検索ページの場合は少し手間がかかりますが、どちらも不可能ではないです。

前のページ、次のページは、 start パラメータだけ書き換える必要があるので少し手間がかかりますね。ただ、「新しい投稿」には機能に不備があるので、この点も一緒に直せればいいなと思います。

フィードが使えるならフィードを使ったほうが機能的にも良いものが作れそうですが、無いなら無いでなんとかなりそうだということがわかりました。

なんだか難しそうですが、とりあえずこの方法で実装してみたいと思います!

0 件のコメント :

コメントを投稿