デフォルトのものや、Vaster2も含めてPaginationが無いということで、いろいろと記事があったので、それを真似してみた。
また、ラベルのページだとうまくいかないので、HTMLを治すべしというコメントも見つけた。
試行錯誤でやっているので、間違えているかもしれないが、今わかっている範囲でメモ。
なお、一般公開していないと/feeds/posts/summary へのアクセスができないため、paginationが表示されない。
テンプレートの<b:skin> ~ <b:/skin>の中に入れる。(カスタマイズの上級者向けの中のCSSの追加から追加するとエラーになる)
<Group description="ページナビ" selector="#blog-pager"> <Variable name="pager.color" description="文字の色" type="color" default="#666666" value="#666666"/> <Variable name="pager.background" description="背景の色" type="color" default="#ffffff" value="#ffffff"/> <Variable name="pager.border" description="周囲の線" type="color" default="#dedede" value="#dedede"/> <Variable name="pager.color.hover" description="文字の色(カーソル時)" type="color" default="#ffffff" value="#ffffff"/> <Variable name="pager.background.hover" description="背景の色(カーソル時)" type="color" default="#008ec2" value="#008ec2"/> </Group>
カスタマイズの上級者向けの中のCSSの追加から追加してもよいし、テンプレートの<b:skin> ~ <b:/skin>の中に入れてもよい。
#blog-pager {overflow: visible} .showpageOf {display:none} span.showpagePoint { display: inline-block; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; padding: .6em .8em; margin: 0 .2em; border: 1px solid $(pager.border); /* ページナビの現在ページの枠線の色 */ border-radius: 0.25em; background-color: $(pager.background); /* ページナビの色を変えるにはここを変える */ border-color: $(pager.border); /* ページナビの色を変えるにはここを変える */ color: $(pager.color); /* ページナビの現在ページの文字の色 */ pointer-events: none; } span.showpageNum, span.showpage { margin: 0 .2em; } .showpageNum a, .showpage a, div.blog-pager a.blog-pager-newer-link, div.blog-pager a.blog-pager-older-link, div.blog-pager a.home-link { display: inline-block; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; padding: .6em .8em; border: 1px solid $(pager.border); /* ページナビの現在ページ以外の枠線の色 */ border-radius: 0.25em; color: $(pager.color); /* ページナビの現在ページ以外の文字の色 */ text-decoration: none; } #blog-pager a:hover{ text-decoration:none; color:$(pager.color.hover); background:$(pager.background.hover); }
レイアウトのページでHTML/Javascriptで入れる。もしくは、テンプレートの</body>の前に入れる。
https://medium.com/mr-blogger-tricks/how-to-add-next-previous-numbered-pagination-in-blogger-7f37a453fe79 にあったものをベースに変更を加えた
<b:if cond='data:blog.pageType != "item"'> <b:if cond='data:blog.pageType != "static_page"'> <div id="blog-pager-script-load-point"></div> <script type='text/javascript'> /*<![CDATA[*/ var post_per_page = 5; // 1画面に表示する投稿の数 var button_per_page = 2; // 表示するページ数(各ページへのボタンの数) var upPageWord = '« Previous Page'; var downPageWord = 'Next Page »'; var root_dir = "/"; /*]]>*/ </script> <script type='text/javascript'> /*<![CDATA[*/ var page_num_tmp; var pagetype; var current_page; var labelname; pageblogger(); function looppage(amount_of_posts) { // 引数は投稿の総件数 var html = ''; // 現在のページの左側に何ページ分のボタンを表示するか num_left_pages = parseInt(button_per_page / 2); if (num_left_pages == button_per_page - num_left_pages) { button_per_page = num_left_pages * 2 + 1 } // 一番左端のボタンに表示するページ番号を決定する most_left_page = current_page - num_left_pages; if (most_left_page < 1) most_left_page = 1; // 全投稿数に対して何ページ必要かを決定する num_required_pages = parseInt(amount_of_posts / post_per_page) + 1; if (num_required_pages - 1 == amount_of_posts / post_per_page) num_required_pages = num_required_pages - 1; // 右端のページ番号を決定 most_right_pagenum = most_left_page + button_per_page - 1; if (most_right_pagenum > num_required_pages) most_right_pagenum = num_required_pages; // HTMLの作成 html += "<span class='showpageOf'>Page " + current_page + ' of ' + num_required_pages + "</span>"; // 1ページ前のページ番号 var prev_page = parseInt(current_page) - 1; if (current_page > 1) { if (current_page == 2) { if (pagetype == "page") { html += '<span class="showpage"><a href="' + root_dir + '">' + upPageWord + '</a></span>' } else { html += '<span class="showpageNum"><a href="/search/label/' + labelname + '?&max-results=' + post_per_page + '">' + upPageWord + '</a></span>' } } else { if (pagetype == "page") { html += '<span class="showpageNum"><a href="#" onclick="redirectpage(' + prev_page + ');return false">' + upPageWord + '</a></span>' } else { html += '<span class="showpageNum"><a href="#" onclick="redirectlabel(' + prev_page + ');return false">' + upPageWord + '</a></span>' } } } if (most_left_page > 1) { if (pagetype == "page") { html += '<span class="showpageNum"><a href="' + root_dir + '">1</a></span>' } else { html += '<span class="showpageNum"><a href="/search/label/' + labelname + '?&max-results=' + post_per_page + '">1</a></span>' } } if (most_left_page > 2) { html += ' ... ' } for (var jj = most_left_page; jj <= most_right_pagenum; jj++) { if (current_page == jj) { html += '<span class="showpagePoint">' + jj + '</span>' } else if (jj == 1) { if (pagetype == "page") { html += '<span class="showpageNum"><a href="' + root_dir + '">1</a></span>' } else { html += '<span class="showpageNum"><a href="/search/label/' + labelname + '?&max-results=' + post_per_page + '">1</a></span>' } } else { if (pagetype == "page") { html += '<span class="showpageNum"><a href="#" onclick="redirectpage(' + jj + ');return false">' + jj + '</a></span>' } else { html += '<span class="showpageNum"><a href="#" onclick="redirectlabel(' + jj + ');return false">' + jj + '</a></span>' } } } if (most_right_pagenum < num_required_pages - 1) { html += '...' } if (most_right_pagenum < num_required_pages) { if (pagetype == "page") { html += '<span class="showpageNum"><a href="#" onclick="redirectpage(' + num_required_pages + ');return false">' + num_required_pages + '</a></span>' } else { html += '<span class="showpageNum"><a href="#" onclick="redirectlabel(' + num_required_pages + ');return false">' + num_required_pages + '</a></span>' } } // 1ページ後のページ番号 var next_page = parseInt(current_page) + 1; if (current_page < num_required_pages) { if (pagetype == "page") { html += '<span class="showpageNum"><a href="#" onclick="redirectpage(' + next_page + ');return false">' + downPageWord + '</a></span>' } else { html += '<span class="showpageNum"><a href="#" onclick="redirectlabel(' + next_page + ');return false">' + downPageWord + '</a></span>' } } // pagerを見つけ出して、そこにHTMLを書き出す var pageArea = document.getElementsByName("pageArea"); var blogPager = document.getElementById("blog-pager"); for (var p = 0; p < pageArea.length; p++) { pageArea[p].innerHTML = html } if (pageArea && pageArea.length > 0) { html = '' } if (blogPager) { blogPager.innerHTML = html } } // function looppage(amount_of_posts) ここまで function counttotaldata(root) { // 引数の中には、投稿のサマリがJSON形式で入っている。 var feed = root.feed; // 引数で与えられたJSONデータの中から、(root).feed.openSearch$totalRults.$tの // データ(投稿の総数)を読み出し、10進数で整数に変換 var totaldata = parseInt(feed.openSearch$totalResults.$t, 10); // 投稿の総数を引数にしてlooppage関数(このjavascriptの中で定義している)を呼び出す。 looppage(totaldata) } function pageblogger() { var thisUrlHost = location.host; var thisUrlPath = location.pathname; // URLのパラメータの最初の?は不要 var thisUrlParam = location.search.substring(1); var thisUrlParams = []; thisUrlParam.split('&').forEach(function(value){ thisUrlParams[value.split('=')[0]] = value.split('=')[1]; }); var thisUrlHash = location.hash; if (thisUrlPath.indexOf("/search/label/") != -1) { // ラベルのページの場合 // /serch/label/以降のラベル名を取得 labelname = thisUrlPath.substring(thisUrlPath.indexOf("/search/label/") + 14) } if ( thisUrlPath.substring(thisUrlPath.length - 5) !== ".html") { //URL Pathが.htmlがで終端していない場合 if (!("q" in thisUrlParams) ) { //URLのパラメータに"q"(ブログ内検索の検索文字列)がない場合 if (thisUrlPath.indexOf("/search/label/") == -1) { //ラベルのページではない場合 if (thisUrlPath.indexOf("/search") == -1) { //検索ページだけど、q(=検索文字列)がついていない場合 if (!("max-results" in thisUrlParams)) { // max-resultsがついていないと、デフォルトの閾値の25件(だと思う)で表示され、 // 1ページ目に投稿がたくさん表示されるので、閾値を指定してリロードする。 location.href = "//" + thisUrlHost + thisUrlPath + "?max-results=" + post_per_page + (location.search.length > 0 ? "&" + location.search.substring(1) : ""); } } pagetype = "page" if (thisUrlHash.indexOf("#PageNo=") != -1) { //#PageNo=がある場合、そこからURLの最後までを取り出す current_page = parseInt( thisUrlHash.substring(thisUrlHash.indexOf("#PageNo=") + 8, thisUrlHash.length) , 10); if (isNaN(current_page)) current_page = 1; } else { //#PageNo=がない場合、1を指定 current_page = 1 } // root_dirはURLの直下(="/") // 投稿のサマリをJSON形式で取り出すAPIを呼び出すように、ScriptタグをHTMLに書き出す // 取り出したJSONデータは、counttotaldata関数の引数となるように指定しており、 // 下記が呼び出された際に、counttotaldata関数(このjavascriptの中で定義している)が呼び出される。 //document.write("<script src=\"" + root_dir + "feeds/posts/summary?max-results=1&alt=json-in-script&callback=counttotaldata\"><\/script>") var call_post_summary = document.createElement("script"); call_post_summary.async = true; call_post_summary.src = root_dir + "feeds/posts/summary?max-results=1&alt=json-in-script&callback=counttotaldata"; document.getElementById("blog-pager-script-load-point").appendChild(call_post_summary); } else { //ラベルのページの場合 pagetype = "label"; if (thisUrlParams["max-results"]) { // max-resultsが指定されている場合 post_per_page = thisUrlParams["max-results"]; } else { // max-resultsがついていないと、デフォルトの閾値の25件(だと思う)で表示され、 // 1ページ目に投稿がたくさん表示される。、2ページ以降はpost_per_pageで指定した値になるので、 // ダブリが出てしまう。 location.href = "//" + thisUrlHost + thisUrlPath + "?max-results=" + post_per_page + (location.search.length > 0 ? "&" + location.search.substring(1) : ""); } if (thisUrlHash.indexOf("#PageNo=") != -1) { //#PageNo=がある場合、そこからURLの最後までを取り出す current_page = parseInt( thisUrlHash.substring(thisUrlHash.indexOf("#PageNo=") + 8, thisUrlHash.length) , 10); if (isNaN(current_page)) current_page = 1; } else { //#PageNo=がない場合、1を指定 current_page = 1 } // ラベルのサマリをJSON形式で取り出すAPIを呼び出すように、ScriptタグをHTMLに書き出す // 取り出したJSONデータは、counttotaldata関数の引数となるように指定しており、 // 下記が呼び出された際に、counttotaldata関数(このjavascriptの中で定義している)が呼び出される。 //document.write('<script src="' + root_dir + 'feeds/posts/summary/-/' + labelname + '?alt=json-in-script&callback=counttotaldata&max-results=1" ><\/script>') var call_post_summary = document.createElement("script"); call_post_summary.async = true; call_post_summary.src = root_dir + 'feeds/posts/summary/-/' + labelname + '?alt=json-in-script&callback=counttotaldata&max-results=1'; document.getElementById("blog-pager-script-load-point").appendChild(call_post_summary); } } else { //URLのパラメータに"q"(ブログ内検索の検索文字列)がある場合 pagetype = "search"; var search_first_item; var search_by_date; var search_redirect_required = false; if (thisUrlParams["max-results"]) { // max-resultsが指定されている場合 post_per_page = thisUrlParams["max-results"]; } else { search_redirect_required = true; } if (thisUrlParams["start"]) { // startは検索結果に表示されている一番上の結果が、何番目の結果かを示す。カウントは0からスタートする(配列のインデックス番号と同じ)。 search_first_item = thisUrlParams["start"]; } else { search_redirect_required = true; search_first_item = 0; } if (thisUrlParams["by-date"]) { // by-dateがtrueの場合は日付順、falseの場合は関連順に結果を表示 search_by_date = thisUrlParams["by-date"]; } else { search_redirect_required = true; search_by_date = 0; } if ( search_redirect_required ) { // 必要なパラメータが付いていない場合は付けさせるために再読込させる // (特にmax-resultsがついていないと、デフォルトの閾値の25件(だと思う)で表示され、 // 1ページ目に投稿がたくさん表示される。、2ページ以降はpost_per_pageで指定した値になるので、 // ダブリが出てしまう。) location.href = "//" + thisUrlHost + thisUrlPath + "?q=" + thisUrlParams["q"] + "&max-results=" + post_per_page + "&start=" + search_first_item + "&by-date=" + search_by_date; } } } } function redirectpage(page_num) { // function looppage()関数で生成されるHTMLから呼び出される jsonstart = (page_num - 1) * post_per_page; page_num_tmp = page_num; var nBody = document.getElementsByTagName('head')[0]; var newInclude = document.createElement('script'); newInclude.type = 'text/javascript'; // 投稿のサマリをJSON形式で取り出すAPIを呼び出すように、ScriptタグをHTMLに書き出す // 取り出したJSONデータは、finddatapost関数の引数となるように指定しており、 // 下記が呼び出された際に、finddatapost関数(このjavascriptの中で定義している)が呼び出される。 newInclude.setAttribute("src", root_dir + "feeds/posts/summary?start-index=" + jsonstart + "&max-results=1&alt=json-in-script&callback=finddatepost"); nBody.appendChild(newInclude) } function redirectlabel(page_num) { // function looppage()関数で生成されるHTMLから呼び出される jsonstart = (page_num - 1) * post_per_page; page_num_tmp = page_num; var nBody = document.getElementsByTagName('head')[0]; var newInclude = document.createElement('script'); newInclude.type = 'text/javascript'; // ラベルのサマリをJSON形式で取り出すAPIを呼び出すように、ScriptタグをHTMLに書き出す // 取り出したJSONデータは、finddatapost関数の引数となるように指定しており、 // 下記が呼び出された際に、finddatapost関数(このjavascriptの中で定義している)が呼び出される。 newInclude.setAttribute("src", root_dir + "feeds/posts/summary/-/" + labelname + "?start-index=" + jsonstart + "&max-results=1&alt=json-in-script&callback=finddatepost"); nBody.appendChild(newInclude) } function finddatepost(root) { post = root.feed.entry[0]; var timestamp1 = post.published.$t.substring(0, 19) + post.published.$t.substring(23, 29); var timestamp = encodeURIComponent(timestamp1); var address = "" if (pagetype == "page") { var address = "/search?updated-max=" + timestamp + "&max-results=" + post_per_page + "#PageNo=" + page_num_tmp } else { var address = "/search/label/" + labelname + "?updated-max=" + timestamp + "&max-results=" + post_per_page + "#PageNo=" + page_num_tmp } location.href = address } /*]]>*/ </script> </b:if> </b:if>
ラベルページでは、テンプレートに以下のような手を加えるように書かれていることが多いが、上記では、多分やらなくても大丈夫。
テンプレートを検索して
<a expr:href='data:label.url'><data:label.name/></a>
という感じの行を探す
「expr:href='data:label.url'」を探す
これを
<a expr:href='data:label.url + "?max-results=5"'><data:label.name/></a> という感じに置き換える
「 + "?max-results=5"」を付け足すのがポイント
0 件のコメント:
コメントを投稿