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行目を追加します。
1 2 3 4 5 6 |
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です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!--{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です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!--{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
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
GMOペイメントゲートウェイのjava.io.IOExceptionのエラー
ECCUBEの決済でGMOペイメントゲートウェイのモジュールを使ってテスト決済を行った場合の不具合、java.io.IOExceptionと言うエラーの原因と対策方法の解説です。
-
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
フォルダを指定してファイルのパーミッションを変更するプログラム
フォームからフォルダ、パーミッションを指定しパーミッションを変更するサンプルプログラムの解説です。
-
Smartyの修飾子regex_replaceで正規表現の後方参照・PHPではpreg_replace
ECCUBEで使われているSmartyで文字列を正規表現で置換し後方参照で値を利用する装飾子regex_replaceの解説です。細かな条件がありますので注意が必要です。
-
Smartyのテンプレート内の処理で計算、加工をする方法
Smartyのテンプレート上で変数を計算する、加工する方法を解説します。
-
連想配列のキーも値もまとめてhtmlspecialchars()でサニタイズする関数の作成解説
PHPの配列・連想配列のキーと値をまとめてhtmlspecialchars()関数でサニタイズ(無害化、無毒化)を行う関数を作成。連想配列のキーはarray_map()関数でのサニタイズは無理。
-
ECCUBEの注文完了画面注文番号と商品情報を編集するCRITEO(クリテオ)タグを編集
ECCUBEの注文完了画面にクリテオのタグを編集する方法を紹介。標準機能では完了画面に注文IDや購入商品の情報を渡さないため改修が必要です。
-
ECCUBEの問い合わせフォームに任意の値を引数として渡す方法
ECCUBEのお問い合わせフォームに値を固有の情報を送りそれに基づいて処理をする方法を解説。ボタンの設置、受け取り側のテンプレート、プログラムのサンプルソースを提供。
-
複数銘柄を指定して株価チャートを一覧するツール公開
入力銘柄の5日間、3か月間、6か月間、1年間、2年間の株価チャートを一覧表示しますのでチャートで売買判断をするのに最適です。