Bloggerのラベル検索で総件数以上に前の投稿へ戻れる

問題現象

Bloggerのラベル検索結果でラベル総数を超えても前の投稿を表示しようとする。

前提

  • ラベル:WSHLibrary
  • ラベル総数:12件(記事作成時点)
  • 1ページ表示数:10件

  1. ラベル検索ページを表示する
  2. 1次検索結果を表示する
    • 6件分が表示される
      • 補足:Bloggerでは、指定件数よりも表示件数が少なくなることがる
  3. 前の投稿をクリックする
  4. 2次検索結果を表示する
    • 4件分が表示される
  5. 前の投稿をクリックする
  6. 3次検索結果を表示する
    • 2件分が表示される
    • 12件すべての検索結果が表示されたことになる
    • 前の投稿をクリックできる状態にある ← これが問題
      • data:olderPageUrlがある
  7. 前の投稿をクリックする
  8. 4次検索結果を表示する
    • 「「WSHLibrary」のラベルが付いた投稿はありません。」を表示する
    • 0件分が表示される
    • 次の投稿も前の投稿もクリックできない
      • data:newerPageUrlとdata:olderPageUrlがない

対応方法

ラベル総数まで検索結果を表示した場合、前の投稿のリンクを表示しないようにする。

具体的には、ラベル総数をフィードから取得する。
検索結果数をクエリパラメータのstartとページ上の検索結果数から取得する。
後は、JavaScriptから上記データを取得してラベル総数まで検索結果を表示した場合、前の投稿へのリンクを無効化する。

ソースコード例

...

<span id='blog-pager-older-link'>
  <a expr:href='params(data:olderPageUrl, {max-results: "10"})' expr:id='data:widget.instanceId + &quot;_blog-pager-older-link&quot;'>
    前の投稿
  </a>
</span>

...

<b:if cond='data:view.search.label'>
  <script>
//<![CDATA[
function onFeed(root) {
  var feed = root.feed;
  var total = parseInt(feed.openSearch$totalResults.$t, 10);

  var params = new URLSearchParams(window.location.search);
  var start = params.get('start');
  start = start? start-0: 0;

  if (start + onFeed.numPosts >= total) {
    var older = document.getElementById('blog-pager-older-link');
    older.innerHTML = older.querySelector('a').innerHTML;
  }
}

(function() {
  var ad = document.createElement('script');
  ad.type = 'text/javascript';
  ad.async = true;
  ad.src = onFeed.homePage+'feeds/posts/summary/-/'+onFeed.label+'?alt=json-in-script&callback=onFeed&max-results=1';
  var sc = document.getElementsByTagName('script')[0];
  sc.parentNode.insertBefore(ad, sc);
})();
//]]>
onFeed.label = '<data:view.search.label/>';
onFeed.homePage = '<data:blog.homepageUrl.canonical/>';
onFeed.numPosts = '<data:posts.size/>'-0;
  </script>
</b:if>

...

コメント: 0

コメントを書く