[Blogger] QooQのページネーション(ページャー)追加方法

2025/12/05

Blogger HTML/CSS QooQ


以前、ページネーション(ページャー)の追加方法を解説しました。

QooQでもこの方法でページネーションが追加できるのですが、少しだけコードを変更したので改めて解説します。


当ブログで導入している記事一覧ページのページネーションは以下のような表示になります。



QooQのデザインとして違和感なく使えると思います。

色の変更でそのまま使うことも可能なので参考にしてください。


ページネーションjavascript

先ず、javascriptを作成くださった方のブログをご覧ください。


参考ブログ様

Bloggerテンプレート自作カスタム 【Blogger自作ページネーション】


上記ブログのコードを使って、上記ブログ通りにやればページネーションを表示させることができます。

当ブログでは少しだけコードを変更して使わせて頂いているので、以下で解説します。



HTMLの編集手順

左のメインメニューから【テーマ】を選択し、カスタマイズ横の【▼】をクリックして【バックアップ】をしましょう。

それが終わったら、同じ画面の【HTMLを編集】をクリックして編集画面を開きます。



HTMLの編集画面では、Ctrlキー+FキーでSearch: という検索欄を表示させることで検索ができます。

HTMLの編集が終わったらプレビュー画面で確認して、保存をします。



ページネーションを追加するコード

HTML編集画面で</body>を検索します。

その直ぐ上の部分にコードを挿入します。



CSSの部分にコメントアウトで日本語の説明も加えているので、変更を加える時の参考にしてみてください。

背景色のカラーコードを変更すればそのまま使うことも可能です。


<!-- [START] ページネーション -->
<b:if cond='data:view.isMultipleItems and !data:view.isArchive'>
<script>
/*<![CDATA[*/
const maxResults=10; /*投稿記事の一覧の表示数*/
const dispPage=3; /*ページ数表示*/
const queryMaxResults=maxResults*10; /*投稿記事の一覧の表示数*/
const textQuery=getUrlParam('q');
const textLabel=location.pathname.split('/search/label/')[1]||'';
const start=parseInt(getUrlParam('start'))||0;
let sumcnt=parseInt(getUrlParam('sumcnt'))||0;
if(start>sumcnt) sumcnt=start+maxResults;
document.addEventListener('DOMContentLoaded',setIndexPager);
function setIndexPager(){
  if(textQuery){
    setIndexPagerQuery();
    return;
  }
  if(sumcnt>0){
    setHtmlPager();
    return;
  }
  let feedUrl='/feeds/posts/summary';
  if(textLabel) feedUrl+='/-/'+textLabel;
  feedUrl+='?alt=json&max-results=1';
  fetch(feedUrl)
  .then(response=>response.json())
  .then(json=>{
    sumcnt=parseInt(json.feed.openSearch$totalResults.$t)||0;
    setHtmlPager();
    return;
  })
  .catch(error=>console.log(error));
}
function setIndexPagerQuery(){
  if(sumcnt>0&&(sumcnt%queryMaxResults)!=0){
    setHtmlPager();
    return;
  }
  let feedUrl='/feeds/posts/summary?alt=json&q='+textQuery+'&max-results=1&start-index='+(sumcnt+queryMaxResults+1);
  fetch(feedUrl)
  .then(response=>response.json())
  .then(json=>{
    let totalResults=parseInt(json.feed.openSearch$totalResults.$t)||0;
    if(totalResults==1){
      sumcnt+=queryMaxResults;
      setHtmlPager();
      return;
    }
    feedUrl='/feeds/posts/summary?alt=json&q='+textQuery+'&max-results='+(queryMaxResults-maxResults+1)+'&start-index='+(sumcnt+1);
    fetch(feedUrl)
    .then(response=>response.json())
    .then(json=>{
      let totalResults=parseInt(json.feed.openSearch$totalResults.$t)||0;
      sumcnt+=totalResults;
      setHtmlPager();
    })
    .catch(error=>console.log(error));
  })
  .catch(error=>console.log(error));
}
function setHtmlPager(){
  let pagerobj=document.getElementById('blog-pager');
  if(!pagerobj) return;
  let currentPage=start/maxResults+1;
  let totalPage=Math.ceil(sumcnt/maxResults);
  let html='';
  for(let i=1;i<=totalPage;i++){
    if(i==currentPage){
      html+='<span id="pager-current">'+i+'</span>';
    }else if(i==1){
      <!-- html+='<a href="#" class="pager-a" onclick="return pager('+(currentPage-1)+')"><</a>'; -->
      html+='<a href="#" class="pager-a" onclick="return pager('+i+')">'+i+'</a>';
    }else if(i==totalPage){
      html+='<a href="#" class="pager-a" onclick="return pager('+i+')">'+i+'</a>';
      <!-- html+='<a href="#" class="pager-a" onclick="return pager('+(currentPage+1)+')">></a>'; -->
    }else if(Math.abs(i-currentPage)<dispPage){
      html+='<a href="#" class="pager-a" onclick="return pager('+i+')">'+i+'</a>';
    }else if(Math.abs(i-currentPage)==dispPage){
      html+='・・・';
    }
  }
  pagerobj.innerHTML=html;
}
function pager(targetPage){
  if(textQuery){
    location.href='/search?q='+textQuery+'&max-results='+maxResults+'&by-date=true&start='+(targetPage-1)*maxResults+'&sumcnt='+sumcnt;
  }else if(targetPage==1&&textLabel){
    location.href=location.pathname;
  }else if(targetPage==1){
    location.href='/';
  }else{
    let feedUrl='/feeds/posts/summary';
    if(textLabel) feedUrl+='/-/'+textLabel;
    feedUrl+='?alt=json&max-results=1&start-index='+(targetPage-1)*maxResults;
    fetch(feedUrl)
    .then(response=>response.json())
    .then(json=>{
      let pubDate=json.feed.entry[0].published.$t;
      pubDate=encodeURIComponent(pubDate.substring(0,19)+pubDate.substring(23,29));
      let url='/search';
      if(textLabel) url+='/label/'+textLabel;
      location.href=url+'?updated-max='+pubDate+'&max-results='+maxResults+'&start='+(targetPage-1)*maxResults+'&sumcnt='+sumcnt;
    })
    .catch(error=>console.log(error));
  }
  return false;
}
function getUrlParam(key){
  let searchlist=location.search.substring(1).split('&');
  for(let i=0;i<searchlist.length;i++) if(searchlist[i].split('=')[0]==key) return decodeURI(searchlist[i].split('=')[1]);
  return '';
}
/*]]>*/
</script>
</b:if>
<style>
#pager-current,.pager-a{
display:inline-block;
padding:.4em .7em; /*背景余白*/
margin:0 .2em .5em; /*位置調整*/
border-radius: .4em; /*丸角*/
}
#pager-current{
color:inherit; /*現ページ文字色*/
background:rgba(255,255,255,0.1); /*現ページ背景色*/
font-weight: bold; /*現ページ太文字*/
}
.pager-a{
color:inherit; /*別ページ文字色*/
background:#263238; /*別ページ背景色*/
border:0px solid #999; /*別ページ枠線*/
}
</style>
<!--[END] ページネーション-->


変更箇所を補足します。

ページ数が多くなるにつれ表示が横長になるのが気になったため、左右の<>をコメントアウトで無効にしています。


↓↓↓


該当箇所は以下の2か所です。


<!-- html+='<a href="#" class="pager-a" onclick="return pager('+(currentPage-1)+')"><</a>'; -->

<!-- html+='<a href="#" class="pager-a" onclick="return pager('+(currentPage+1)+')">></a>'; -->


必要な場合はコメントアウトの部分<!-- -->を削除すれば戻ります。


長さを短くしたい場合、const dispPage=3; /*ページ数表示*/の値を2に下げる方法もあります。


↓↓↓


ただ表示が減ると操作性が悪くなり、TOPページなどではかなりシンプルになります。



好みに合わせて変更してみてください。



検索結果やラベル表示のページネーションを正常に表示する方法

ページネーションは検索結果やラベル表示でも有効です。

ただBloggerの初期設定だと検索結果やラベル表示は20件表示されることから、表示が上手くいかなくなります。


例えば投稿記事の一覧の表示件数が10件で、ページネーションの指定も10件だとします。

検索結果を表示すると1ページ目の表示は1-20件、2ページ目の表示は11-30件、3ページ目の表示は21-40件……というように記事が重複して表示されてしまいます。


以上のことから、下記の件数は揃える必要があります。


  • 投稿記事の一覧の表示件数
  • 検索結果の表示件数
  • ラベル一覧の表示件数
  • ページネーションの指定件数


検索結果とラベルの表示件数の変更は以下の記事で解説しています。


参考記事

QooQの検索結果とラベルの表示件数変更方法


QooQの場合は変更箇所が多くて手間なのですが、これでページネーションが正常に表示されるようになります!



にほんブログ村 ブログブログ ブログサービスへ にほんブログ村 ブログブログ ブログノウハウへ ブログノウハウランキング

このブログを検索

現在の使用テーマ

EmporioからQooQ list版に変更しました。(2025年11月)

お問い合わせ

名前

メール *

メッセージ *




QooQ