エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定

      2017/03/12

ECCUBEの商品一覧ページに「rel="next"」「rel="prev"」の設定方法・その1

 
ECCUBEの商品一覧ページに「rel="next"」「rel="prev"」を設定してほしいとの依頼が来ました。
 
その対応方法について書いていきたいと思います。
 

LC_Page_Products_List.phpのプログラムの修正

 
/data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php
の最後の方に下記のスクリプトを追加します。
すでに「action()」関数がある場合は、「parent::action();」行の次あたりに 4行目、5行目を追加します。
 

  function action() {
    parent::action();

    $this->prev_page = $this->objNavi->arrPagenavi[before];
    $this->next_page = $this->objNavi->arrPagenavi[next];
  }

 
 

site_frame.tplのテンプレートの修正

 
続いて、実際に「rel=”next” rel=”prev”」を編集するテンプレートファイル「site_frame.tpl」に下記のスクリプトを追加します。
 
対応するファイルは、以下のファイルです。
/data/Smarty/templates/default/site_frame.tpl
 
編集する場所は headタグ内であればの分かりやすいところで OKです。
 
 

<!--{if $smarty.server.REQUEST_URI|mb_strpos:'products/list.php' !== false }-->
  <!--{if $objNavi->now_page == 1 and $objNavi->max_page == 1 }-->

  <!--{elseif $objNavi->now_page == 1 }-->
    <link rel="next" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$next_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->"/>

  <!--{elseif $objNavi->now_page == $objNavi->max_page}-->
    <link rel="prev" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$prev_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->" />

  <!--{else}-->
    <link rel="prev" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$prev_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->" />
    <link rel="next" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$next_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->" />

  <!--{/if}-->
<!--{/if}-->

 
 
これだけでOKです。
 
 


 

ECCUBEの商品一覧ページに「rel="next"」「rel="prev"」の設定方法・その2

 
その1の方で実装をしていたのですが、実際問題としてもっと簡単な方法があるのではなかろうか、と思って試行錯誤した結果、下記のような感じに行き着きました。
 
修正するファイルは、site_frame.tplのテンプレートのみ。
 

site_frame.tplのテンプレート

 
対応するファイルは、その1と変わらず以下のファイルです。
/data/Smarty/templates/default/site_frame.tpl
 
編集する場所は headタグ内であればの分かりやすいところで OKです。
 

<!--{if $smarty.server.REQUEST_URI|mb_strpos:'products/list.php' !== false }-->
  <!--{if $objNavi->now_page == 1 and $objNavi->max_page == 1 }-->

  <!--{elseif $objNavi->now_page == 1 }-->
    <!--{assign var="next_page" value=2}-->
    <link rel="next" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$next_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->"/>

  <!--{elseif $objNavi->now_page == $objNavi->max_page}-->
    <!--{assign var="prev_page" value=$smarty.request.pageno-1}-->
    <link rel="prev" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$prev_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->" />

  <!--{else}-->
    <!--{assign var="prev_page" value=$smarty.request.pageno-1}-->
    <!--{assign var="next_page" value=$smarty.request.pageno+1}-->
    <link rel="prev" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$prev_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->" />
    <link rel="next" href="<!--{$smarty.const.HTTP_URL|escape}-->products/list.php?transactionid=<!--{$transactionid}-->&mode=<!--{$smarty.request.mode|escape}-->&category_id=<!--{$smarty.request.category_id|escape}-->&maker_id=<!--{$smarty.request.maker_id|escape}-->&name=<!--{$smarty.request.name|escape}-->&orderby=<!--{$smarty.request.orderby|escape}-->&disp_number=<!--{$smarty.request.disp_number|escape}-->&pageno=<!--{$next_page}-->&rnd=<!--{$smarty.request.rnd|escape}-->" />

  <!--{/if}-->
<!--{/if}-->

 
 
その1では、次のページ、前のページのページ数をあらかじめ用意されているクラスのプロパティを使って取得していますが、その2では、前のページ、次のページは、現在のページの「-1」「+1」で計算する方法にしています。
現在のページが分かっているならこれで問題ないんじゃないかと。
 
ちなみに、Smartyのテンプレート上で値を計算したり、文字列を加工する方法については「Smartyのテンプレート内の処理で計算、加工をする方法」で記事を書いていましたが、こんなところで役に立つんですね!
 
 

rel="next"」「rel="prev"」の設定方法解説

 
先に設定方法を記載しましたが、それぞれ対応する内容について解説します。
 

テンプレートファイル「site_frame.tpl」の振り分け処理

 
まず、テンプレートファイル「site_frame.tpl」側ですが、
 
<!--{if $objNavi->now_page == 1 and $objNavi->max_page == 1 }-->
 
この if文で、現在のページ数を確認し、「rel="next"」「rel="prev"」を編集する、しないの振り分けをしています。
 

  • 1ページしかない一覧は何も編集しない
  • 複数ページある 1ページ目は「rel="next"」のみ編集
  • 複数ページある 最後のページは「rel="prev"」のみ編集
  • それ以外は「rel="next"」「rel="prev"」を両方編集

 
という単純な振り分けです。
 
 

「site_frame.tpl」のURLの編集処理

 
<link rel="prev" href="..." />
<link rel="next" href="..." />
のそれぞれに記述する URLの整形についてです。
 
 

<!--{$smarty.const.HTTP_URL|escape}-->

 
「HTTP_URL」で ECCUBEのサイトの URLを編集します。
「HTTP_URL」の部分を「SITE_URL」とするように記載されているサイトもありましたが、現在のバージョンでは値が取得できないようです。
 
 

<!--{$smarty.request.mode|escape}-->

 
この記述方法で REQUEST(POST、GET)された値を取得して、それを編集します。
複数の REQUESTされる値をそれぞれ取得するため長くなっていますが、受け取った値をそのまま編集しているだけです。
「|escape」で、入力値のサニタイズをしています
 
また、サイトによって、一覧表示ページをカスタマイズしていて、ソート条件等 URLの項目が追加されている場合は、適宜追加をしてみてください。
 
 

<!--{$transactionid}-->

 
ページの遷移情報を引き継ぐために「transactionid」という値を送るのですが、この値は「$transactionid」として取得できるため、このように記述しています。
 
ただ、先の REQUESTで受け取るように記述しても何の問題もありません。
 
 

<!--{$prev_page}--> <!--{$next_page}-->

 
前のページ、次のページのページ番号を編集する箇所です。
 
本来的には、下記の様に記述すれば「次のページ」「前のページ」の情報は取得できるはずなのですが、値が取得できないため、「LC_Page_Products_List.php」のプログラムの修正する箇所でその値を取得しています。
 
<!--{$objNavi->arrPagenavi[prev]}-->
<!--{$objNavi->arrPagenavi[next]}-->
 
上記の記述方法で値が取得できる場合は、「LC_Page_Products_List.php」のプログラムの修正は必要ありません。
 
 

「LC_Page_Products_List.php」のプログラムの追加処理

 
「LC_Page_Products_List.php」のプログラムでは、下記の 2行を追加しています。(「action()」関数全体も追加していますが。)
 
$this->prev_page = $this->objNavi->arrPagenavi[before];
$this->next_page = $this->objNavi->arrPagenavi[next];
 
これは、ひとつ前の項目に書きましたが、本来はテンプレート側で取得できるはずの「前のページ」「次のページ」のページ数が上手く取得できないため、「action()」の関数の中で取得して、テンプレートに渡す処理にしました。
 
テンプレート側で取得できれば、この「LC_Page_Products_List.php」のプログラムの修正は必要ありません。
 
 

rel="next"」「rel="prev"」について

 
今回解説した「rel="next"」「rel="prev"」についても軽く触れておきます。
 
Googleはページの重複や、複数ページに渡って関連ある記事がある場合は、その旨明記するように求めています。
 
 
その中で、ECCUBEの商品一覧ページなど、一つの条件で検索した商品一覧ページが複数ページにまたがって存在する場合にそれらが一連のページであることを Googleに伝える必要がありますが、その仕組みが「rel="next"」「rel="prev"」なのです。
 
Googleウェブマスター向け公式ブログより
http://googlewebmastercentral-ja.blogspot.jp/2011/12/relnext-relprev.html
 
 
そのため、ECCUBEの商品一覧ページにはデフォルトのテンプレートにも組み込んだ方がいいんじゃないか、と思うくらいの内容だと思っています。
 
 
■参考サイト
 
最後に、この記事を書くにあたって下記のサイトを参考にさせていただきました。
 http://www.ec-custom.jp/ec-cube
 http://colo-ri.jp/develop/2013/08/ec-cube-use-pagination.html

 - PHP・Smarty・ECCUBE

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

フォルダを指定してファイルのパーミッションを変更するプログラム

フォームからフォルダ、パーミッションを指定しパーミッションを変更するサンプルプログラムの解説です。

ファイル変更だけ!ECCUBEの本番から開発環境をコピーする手順を解説

ECCUBEを本番から開発環境をコピーする際の手順を解説。PGMメンテに必要な開発環境を構築する手順を解説。ECCUBEの仕組みは簡単なので作業は5分ほど。

XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()

XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。

PHPで APIにアクセスする際などに使用する cURLのサンプルプログラム
PHPで APIにアクセスする際などに使用する cURLのサンプルプログラム

PHPのcURLを使用して各種APIにアクセスするサンプルプログラムを作成し、その処理を解説。カオナビAPIのみならず、他の多くのAPIにアクセスする際にも使用できる。

ob_start、ob_get_contents関数でPHPの標準出力をバッファリング・変数に代入

標準出力をバッファリングし変数に代入することができるob_start()関数の解説。include()の処理をバッファリングすることで自由な場所に処理を記述することが可能。

PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う

PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。

ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説

ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!

パーミッション(属性)一括変更ツール・WordPress最適化済

WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。

カオナビAPI Ver.2.0のtokenを取得する PHP+cURLのサンプルプログラム
カオナビAPI Ver.2.0のtokenを取得する PHP+cURLのサンプルプログラム

PHPのcURLを使用してカオナビAPIのアクセスに必要なtoken、シートの情報を取得するサンプルプログラムを作成。cURLの処理は関数化しているため他のAPIでも流用できる。

PHPで正規表現の検証には preg_match_allが便利

PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。


Warning: Trying to access array offset on null in /home/ss-giken/s-giken.net/public_html/blog/wp-content/plugins/amazonjs/amazonjs.php on line 637