ここのところずっとBloggerのテンプレートを作成している。テンプレートの仕様がわかりにくさMAXすぎて、ものすごい時間が溶けてゆく。
そんな中、偶然ヤバいBloggerの仕様らしきものを見つけてしまった。仕様というより、これはもうバグかも知れない。普段の生活では「ヤバい」という単語を使わないようにして暮らしているのだが、これはPVにも影響するし本当にヤバいやつ。
ページャーについて
少し前置きすることになるのだけれど、はじめはページャーについて書かせてください。
ページャーとは、次の投稿に進んだり戻ったりするあれのことだ。デフォルトだと、「新しい投稿」、「ホーム」、「前の投稿」と表示されるが、表記はテンプレートによって違っているかと思う。例えば矢印とか、何らかのボタンになっていたりするかも知れない。
Bloggerのテンプレートには「nextprev」という名前でページャーが内蔵されている。nextprevは3つのテンプレート変数で機能が構成されている。
data:newerPageUrl
data:olderPageUrl
data:blog.homepageUrl
newerPageUrlは、現在開いているページよりも投稿日時が新しいページへのURLを格納している。olderPageUrlは、その逆。
記事ページを開いているときは新しい記事へのリンクになり、リストページを開いているときは新しいリストへのリンクになる。開いているページタイプによって、よしなに機能してくれる。
blog.homepageUrlは、ブログトップページのURL。
ページャーの動作がおかしいことに気がついた
まずは動画を。このブログには全部で26の投稿があり、順番にナンバリングしてある。リストアイテムには各種変数の値が表示される。「メインページに掲載する投稿数の上限」は5に設定してある。
トップページから1ページ戻ったとき、いきなり21番が飛んでいる。そのあとは順調に1番まで戻ることができた。そして今度は1番から26番まで進もうとするが、20番から先に進むことができない。
なんだこれは。
10時間悩んだその先に…
テンプレートのコーディングに問題があるのかとめちゃくちゃ悩んだ。1000回ぐらい検索したと思う。なんでGoogleのサービスなのにググって問題が解決しないのか。怒りに打ち震えた。
でも実はこれ、テンプレートが原因ではないのだ。ズバリ、原因は記事の投稿日時である。
ちょっと見づらいかも知れないが、さっきの動画の「timestampISO8601」という行に着目していただきたい。timestampISO8601は、記事の投稿日時をISO 8601という規格で表現した文字列である。
よく見ると、22~26番の値が同じ(21も同じ)なのだ。いやいや、手動で順番に投稿したのにそれはおかしい。秒の数値が00で揃っていることも変だ。
もうなにこれ。
Bloggerの仕様
同じ投稿日時になってしまったのは2つの要因が重なったから。
①Bloggerの投稿日時は秒が切り捨てられて00になる。②00~59秒の間に複数の投稿をした。
これに加え、Bloggerのリスト表示は、同じ投稿日時のアイテムが複数含まれるケースを想定していない、もしくはあえて対応していないものと思われる。
ちょっとややこしい話
たぶん実際の挙動としてはこういうことになっている。
olderPageUrlは、現在開かれているリストのアイテム中、一番古い投稿日時よりも古い投稿日時を指定しようとする。例えば00:01が一番古いなら00:01&max-results=5となり、投稿日時00:00以前の記事から5つ分がリストに表示される。「未満」的な。さっきの画像の21番は、22番と同じ投稿日時だったから飛ばされたわけだ。
一方、newerPageUrlは処理が全然違う。現在開かれているリストのアイテム中、一番新しいアイテムからmax-resultsの値+1つ分リストを辿り、そのアイテムの投稿日時&max-results=5&reverse-paginate=trueと指定してくる。こちらも未満的に機能するため、同じ投稿日時のアイテムが固まっていると先に進めない。
チェックしましょう
今回のように、手動で1分間に複数の投稿をすることは普通ないだろう。でもスケジュール機能を使って、同じ時間に複数の投稿をすることはあり得るのでは。また、下書きに戻す→再投稿でも投稿日時は上書きされてしまうので気をつけたい。
ある記事がリストに表示されなかったり、ユーザーがリストを進めなくなるというのは、せっかく書いた記事が読んでもらえないことにつながる。特にラベルからリストページに飛ぶユーザーが多いブログでは致命的だと思う。
ちょっと面倒だが、とりあえずチェックした方がいいだろう。確認するには、記事の編集画面に表示される「公開日」を見ればいい。
0 件のコメント:
コメントを投稿