考え方だけですが、そのAPIのこととページネーションのやり方とを別々に考えて、あとでひとつにまとめてはどうですか。
- まず、表示するページのページ番号が必要です。だから例えば example.jp/usedcars/?paged=1 のようにページ番号を指定できて、それを固定ページのテンプレートで受け取れるようにカスタマイズする必要があります。
- ページ番号を受け取れた後は、中古車検索APIの start パラメータを利用できると思います。例えばページ番号が n で、1ページ100 件なら、1+(n-1)×100番目から取得すればいいですよね。
WordPressの固定ページのURLでページ番号を受け取れるようにするのは、下記の過去トピックが参考になると思います。
[解決済み] 固定ページでのページネーションの表示について(プラグインなし)
gblsm様
返信有難うございます。
早速試した所、無事成功しました。
ご指摘頂きましたとおり、以下のコードで実現出来ました。
function.phpに以下を追加
//ページネーションを追加
function pagination($pages = '', $range = 4)
{
$showitems = ($range * 2)+1;
global $paged;
if(empty($paged)) $paged = 1;
if($pages == '')
{
global $xml;
$pages = ($xml->results_available / $xml->results_returned) ;
if(!$pages)
{
$pages = 1;
}
}
if(1 != $pages)
{
echo "<div class=\"pagination clearfix\"><span>Page ".$paged." of ".$pages."</span>";
if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>« First</a>";
if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>‹ Previous</a>";
for ($i=1; $i <= $pages; $i++)
{
if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
{
echo ($paged == $i)? "<span class=\"current\">".$i."</span>":"<a href='".get_pagenum_link($i)."' class=\"inactive\">".$i."</a>";
}
}
if ($paged < $pages && $showitems < $pages) echo "<a href=\"".get_pagenum_link($paged + 1)."\">Next ›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Last »</a>";
echo "</div>\n";
}
}
固定ページテンプレート.phpに以下を追加
$count = 30; //表示件数
$start = 1+($paged-1)*$count; //開始位置
//リクエストパラメータ組み立て
$url = "$baseurl?key=$key&pref=22&brand=$brand&count=$count&start=$start&order=5";
ループ後にページネーション追加
<?php if (function_exists("pagination")) {
pagination($additional_loop->results_available);
} ?>
コードの書き方が雑かもしれませんが、何とか出来て良かったです。
また、上記コードでおかしな点がありましたらご教授いただけると有難いです。
ページネーションは表示できているんですよね。それなら問題ないと思いますが、念のため確認として例えば「Last」をクリックしたときに正しい最終ページが表示されていますか?
定義されたfunctions.php関数を呼び出すときのパラメータ $additional_loop->results_available が最終ページ番号(総ページ数)に一致していればよいのですが。
最初のコードでは
$xml = simplexml_load_file( $url );
としているので $xml->results_available が取得できた合計数ですよね。1ページが n 件のとき、合計数を n で割って小数点以下を切り上げるとページ数になりますから、それを pagination 関数のパラメータに入れるのがふつうだと思います。例えば
$numpages = ($xml->results_available + $count - 1) / $count;
pagination( $numpages );
gblsm様
返信有難うございます。
「Last」をクリックすると場合によっては表示されますが、表示される件数が「$xml->results_available」と合っていない状態です。
また、「合計件数中○件~○件表示」という形も追加しましたが、「Last」のページだけ合わないか、合計件数が多いと「0件~1件」という表示になってしまいます。
ご教授頂きました以下のコードはどの位置に記述すれば良いのでしょうか?
$numpages = ($xml->results_available + $count - 1) / $count;
pagination( $numpages );
現状のコードは以下のとおりです。
function.php
function pagination($pages = '', $range = 2)
{
$showitems = ($range * 2)+1;
global $paged;
if(empty($paged)) $paged = 1;
if($pages == '')
{
global $xml;
$pages = floor($xml->results_available / $xml->results_returned) ;
if(!$pages)
{
$pages = 1;
}
}
if(1 != $pages)
{
echo "<div class=\"pagination clearfix\"><span>Page ".$paged." of ".$pages."</span>";
if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>« First</a>";
if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>‹ Previous</a>";
for ($i=1; $i <= $pages; $i++)
{
if (1 != $pages &&( !($i >= $paged+$rangey+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
{
echo ($paged == $i)? "<span class=\"current\">".$i."</span>":"<a href='".get_pagenum_link($i)."' class=\"inactive\">".$i."</a>";
}
}
if ($paged < $pages && $showitems < $pages) echo "<a href=\"".get_pagenum_link($paged + 1)."\">Next ›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Last »</a>";
echo "</div>\n";
}
}
固定ページテンプレート.php
<?php
//カーセンサーAPI_START
//ベースURL
$baseurl = "http://webservice.recruit.co.jp/carsensor/usedcar/v1/";
//リクエストパラメータ
$key = '1234567890'; //APIキー
$brand = post_custom('brand'); //メーカー
$count = 15;
$start = 1+($paged-1)*$count;
//リクエストパラメータ組み立て
$url = "$baseurl?key=$key&pref=22&brand=$brand&count=$count&start=$start&order=5";
//xmlパース
$xml = simplexml_load_file( $url );
//カーセンサーAPI_END
?>
//ページネーション表示
<?php if (function_exists("pagination")) {
pagination($additional_loop->results_available);
} ?>
<p><?php echo $xml->results_available; ?>件中 <?php echo $xml->results_start; ?>〜<?php echo ($xml->results_start+($count-1)); ?>件表示しています</p>
<?php if( $xml->results_returned != 0 ): ?>
<?php foreach ( $xml->usedcar as $i ): ?>
<div class="craftsman_search_car">
<div class="row spaces">
<div class="col-sm-4">
<a href="<?php echo $i->urls->pc; ?>" target="_blank"><img src="<?php echo $i->photo->main->l; ?>" alt="<?php echo $i->brand->name; ?> <?php echo $i->model; ?> / <?php echo $i->grade; ?>" title="<?php echo $i->photo->main->caption; ?>" class="img-thumbnail"></a><p><small>【画像提供:カーセンサーnet 】</small></p>
</div> <!-- col-sm-4 end -->
<div class="col-sm-8">
<div class="row">
<div class="col-xs-12">
<h3 id="car_name"><a href="<?php echo $i->urls->pc; ?>" target="_blank"><?php echo $i->brand->name; ?> <?php echo $i->model; ?> / <?php echo $i->grade; ?></a></h3>
</div> <!-- col-xs-12 end -->
<div class="col-xs-4">
本体価格
</div>
<div class="col-xs-8">
<b class="price "><?php echo number_format( (int)$i->price ); ?>円</b>
</div>
<div class="col-xs-4">
初度登録年
</div>
<div class="col-xs-8">
<?php echo $i->year; ?>年
</div>
<div class="col-xs-4">
走行距離
</div>
<div class="col-xs-8">
<?php echo $i->odd; ?>
</div>
<div class="col-xs-4">
整備・保証
</div>
<div class="col-xs-8">
<?php echo $i->maintenance; ?> / <?php echo $i->warranty; ?>
</div>
<div class="col-xs-4">
コメント
</div>
<div class="col-xs-8">
<?php echo $i->desc; ?>
</div>
</div> <!-- row end -->
</div> <!-- col-sm-8 end -->
</div> <!-- row end -->
</div> <!-- craftsman_search end -->
<?php endforeach; ?>
<?php else: ?>
<p>ないよ</p>
<?php endif; ?>
<?php endwhile; ?>
<div class="row">
<div class="col-sm-9">
<?php echo $xml->results_available; ?>件中 <?php echo $xml->results_start; ?>〜<?php echo ($xml->results_start+14); ?>件表示中
</div>
<div class="col-sm-3">
<a href="http://webservice.recruit.co.jp/"><img src="http://webservice.recruit.co.jp/banner/car-s.gif" alt="カーセンサーnet Webサービス" width="135" height="17" border="0" title="カーセンサーnet Webサービス"></a>
</div>
</div>
//ページネーション表示
<?php if (function_exists("pagination")) {
pagination($additional_loop->results_available);
} ?>
何卒ご教授のほどよろしくお願いいたします。
これはkazunokoさんが書いたコードなのですよね?
まず固定ページテンプレートの中で
$start = 1+($paged-1)*$count;
を
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$start = 1 + ( $paged - 1 ) * $count;
にしましょう。そうしないと $paged に何も指定されていないとき、ページネーションがおかしくなります。
次に pagination 関数を呼び出す、下記の部分:
//ページネーション表示
<?php if (function_exists("pagination")) {
pagination($additional_loop->results_available);
} ?>
が間違っています。kazunoko さんのコードの中で、変数 $additional_loop に値が何もセットされていないので、ページネーションがおかしくなります。次のようにするのが正しいはずです。
//ページネーション表示
<?php if ( function_exists( 'pagination' ) ) {
$numpages = ($xml->results_available + $count - 1) / $count;
pagination( $numpages );
} ?>
gblsm様
ご指摘のとおり、コードを修正した所、無事「Last」のページが表示できました。
私も「$additional_loop」の値をセットしていないのにと思っていましたが、何故か動いたので無視していました。
また、PHPコード自体はサンプルを繋ぎあわせ、一部変更等をして作っていましたが、まだまだ知識が乏しい事を痛感しました。
gblsm様、最後までお付き合い頂き有難うございました。