サポート » 使い方全般 » 中古車検索apiを利用した固定ページのページネーション

  • 解決済 kazunoko

    (@kazunoko)


    はじめまして。
    色々とネットで調べたのですが、知識足らずで解決法が見当たらなからず、当フォーラムに投稿させていただきました。

    WordPressの固定ページにカーセンサーの中古車検索apiを利用して中古車を表示させています。
    固定ページのテンプレートに以下のコードを追加。

    <!--post-entry end-->
    <?php the_content(); ?>
    <hr>
    <?php
    //カーセンサーAIP_START
    //ベースURL
    $baseurl = "http://webservice.recruit.co.jp/carsensor/usedcar/v1/";
    
    //リクエストパラメータ
    
    $key = 'aa3f6edc73b877bd'; //APIキー
    $brand = post_custom('brand'); //メーカー
    
    //リクエストパラメータ組み立て
    $url = "$baseurl?key=$key&pref=10&brand=$brand&count=100&order=5";
    
    //xmlパース
    $xml = simplexml_load_file( $url );
    //カーセンサーAIP_END
    ?>
    
    <?php echo $xml->results_available; ?>件ヒットしました。
    
    <?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; ?>

    現在は100件取得し、100件表示させていますが101件以降をページネーションで表示させる方法が見つからず、思いつきませんでした。
    WP-PageNaviやプラグインを使わないページネーションもやってみましたがページネーション自体表示されませんでした。
    浅はかな考えですが、 WP-PageNaviやプラグインを使わないページネーションは固定ページ数または投稿数の合計を取得して行っていると思うのですが、これを中古車検索apiのレスポンスフィールド「results_available(クエリー条件にマッチする、検索結果の全件数)」にしてあげれば少しは解決できるのではと思っています。たぶん…

    どうすれば、ページネーションが可能になるのでしょうか?
    何卒ご教授のほどよろしくお願いいたします。

    ↓カーセンサー 中古車検索apiリファレンス
    https://webservice.recruit.co.jp/carsensor/reference.html#1

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • 考え方だけですが、そのAPIのこととページネーションのやり方とを別々に考えて、あとでひとつにまとめてはどうですか。

    1. まず、表示するページのページ番号が必要です。だから例えば example.jp/usedcars/?paged=1 のようにページ番号を指定できて、それを固定ページのテンプレートで受け取れるようにカスタマイズする必要があります。
    2. ページ番号を受け取れた後は、中古車検索APIの start パラメータを利用できると思います。例えばページ番号が n で、1ページ100 件なら、1+(n-1)×100番目から取得すればいいですよね。

    WordPressの固定ページのURLでページ番号を受け取れるようにするのは、下記の過去トピックが参考になると思います。
    [解決済み] 固定ページでのページネーションの表示について(プラグインなし)

    トピック投稿者 kazunoko

    (@kazunoko)

    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)."'>&laquo; First</a>";
             if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo; 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 &rsaquo;</a>";
             if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Last &raquo;</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 );

    トピック投稿者 kazunoko

    (@kazunoko)

    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)."'>&laquo; First</a>";
             if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo; 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 &rsaquo;</a>";
             if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Last &raquo;</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 );
    } ?>

    トピック投稿者 kazunoko

    (@kazunoko)

    gblsm様

    ご指摘のとおり、コードを修正した所、無事「Last」のページが表示できました。
    私も「$additional_loop」の値をセットしていないのにと思っていましたが、何故か動いたので無視していました。

    また、PHPコード自体はサンプルを繋ぎあわせ、一部変更等をして作っていましたが、まだまだ知識が乏しい事を痛感しました。

    gblsm様、最後までお付き合い頂き有難うございました。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「中古車検索apiを利用した固定ページのページネーション」には新たに返信することはできません。