バージョン 2.13.5
にて確認しました。TOP_URL などの定数が使えるバージョンならば他でも大丈夫だと思います。
<meta property="og:url" content="http://www.yahoo.co.jp/">
<link rel="canonical" href="http://www.yahoo.co.jp/">
これを自動で出したい。
LC_Page_Ex.php
修正 [2016/02/25] - strpos で調べる値が空だったら PHP の Warning が出ないようにいたしましたm(_ _)m
呼び出し
LC_Page_Ex.php
修正 [2016/02/24] - init() から process() に変更しましたm(_ _)m
LC_Page_Ex.php
だけだとエラー時に空になっちゃうので、
・LC_Page_Error.php
・LC_Page_Error_DispError_Ex.php
・LC_Page_Error_SystemError_Ex.php
でも呼び出す
出力
site_frame.tpl
最近の SEO 系のブログ記事の傾向を見て、
canonical を出さないようにしているページがあります(ページネーションが発生するページ)。
そこでは、代わりに noindex follow を入れるようにしています。
※ここまで書きましたが、
独自ロジックを EC-CUBE 全体に反映させるにはどこで呼び出したらいいんだろう。
反映箇所が多いと漏れがあると思うし、決済モジュールなどでは、モジュールごとに追記が必要になるので...。
ググっても個々のページ用の情報ばかりなので、よくわかりませんでした。勉強します。
にて確認しました。TOP_URL などの定数が使えるバージョンならば他でも大丈夫だと思います。
<meta property="og:url" content="http://www.yahoo.co.jp/">
<link rel="canonical" href="http://www.yahoo.co.jp/">
これを自動で出したい。
LC_Page_Ex.php
修正 [2016/02/25] - strpos で調べる値が空だったら PHP の Warning が出ないようにいたしましたm(_ _)m
/**
* URLを返却
*
* @param string 分岐したい mode を入力 ( 'canonical' | 'ogp' )
* @return string パラメーターが整理された URL を返却
*/
public function customPublishUrl($mode)
{
$protocol = ( empty($_SERVER['HTTPS']) ? 'http://' : 'https://');
$http_host = $_SERVER['HTTP_HOST'];
$request_uri = $_SERVER['REQUEST_URI'];
$script_name = $_SERVER['SCRIPT_NAME'];
$top_url = TOP_URL;
$dynamic_url = $protocol . $http_host . $request_uri;
$static_url = $protocol . $http_host . $script_name;
// 出力用
$publish_url = $static_url;
$param_all = '';
// URL から 不要なファイル名を調査
if (
strpos( $script_name, 'index.php' ) !== false
|| strpos( $script_name, 'confirm.php' ) !== false
|| strpos( $script_name, 'complete.php' ) !== false
) :
// トップページならば
if ( $static_url === $top_url || $static_url === $top_url . 'index.php' ) :
$publish_replace = '';
$publish_search = '/\/index.php/u';
// それ以外のページ
else :
$publish_replace = '';
$publish_search = '/index.php|confirm.php|complete.php/u';
endif;
// 不要なファイル名を削除する
$publish_url = preg_replace($publish_search, $publish_replace, $publish_url);
endif;
// パラメーター算出用の URL を綺麗にする
$clean_url = $dynamic_url;
$clean_search = '/\"(.*)\"|\'(.*)\'|%22(.*)%22/u';
$clean_replace = '';
$clean_url = preg_replace($clean_search, $clean_replace, $clean_url);
// パラメーターを配列化
$hatena = explode('?', $clean_url);
$and = explode('&', $hatena[1]);
// チェックするパラメーター
switch ( $mode ) :
// $check_pattern
// 'only' -> URL に含まれるパラメーターを配列だけにする
// 'remove' -> 配列のパラメーターは不要なので URL から必ず除外する
case 'canonical' :
$check_pattern = 'only';
$check_array = array('category_id', 'maker_id', 'name', 'product_id');
break;
case 'ogp' :
$check_pattern = 'remove';
$check_array = array('transactionid', 'admin');
break;
endswitch;
// $hatena が空で無ければ
if ( $hatena[1] !== '' ) :
// パラメーター配列の数だけループ
foreach ( $and as $each ) :
$each_split = explode('=', $each);
$param = $each_split[0];
$value = $each_split[1];
$flag = ( $check_pattern === 'only' ) ? false : true;
// $check_array の数だけループ
foreach ( $check_array as $each2 ) :
// strpos で調べる値が空だったら PHP の Warning が出るので事前に $param_all をチェック
if ( $param_all !== '' ) :
// 値の重複を調査( $param_all が $param を含んでいたら フラグを無くす )
if ( strpos( $param_all, $param ) !== false ) :
$flag = false;
endif;
endif;
endforeach;
// 値の重複を調査( $param_all が $param を含んでいたら フラグを無くす )
if ( strpos( $param_all, $param ) !== false ) :
$flag = false;
endif;
// $flag が true なら $param_all に $each を追加
if ( $flag ) :
$param_all .= ( $param_all === '' ) ? '?' . $each : '&' . $each;
endif;
endforeach;
endif;
// もし $param_all の値が ? だけだったら $param_all を空にする
$param_all = ( $param_all === '?' ) ? '' : $param_all;
// ただし $mode が canonical かつ パラメーターに pageno を含んでいたら $publish_url と $param_all を空にする
if ( $mode === 'canonical' && strpos( $clean_url, 'pageno=' ) !== false ) :
$publish_url = '';
$param_all = '';
endif;
return $publish_url . $param_all;
}
呼び出し
LC_Page_Ex.php
修正 [2016/02/24] - init() から process() に変更しましたm(_ _)m
/**
* Page のプロセス.
*
* @return void
*/
public function process()
{
parent::process();
/**
* 下記はシステムエラー時無視されるので、
* ・LC_Page_Error.php
* ・LC_Page_Error_DispError_Ex.php
* ・LC_Page_Error_SystemError_Ex.php
* にて再取得する
*/
// og:url
$this->custom_ogurl = $this->customPublishUrl('ogp');
// カノニカルURL
$this->custom_canonical = $this->customPublishUrl('canonical');
}
LC_Page_Ex.php
だけだとエラー時に空になっちゃうので、
・LC_Page_Error.php
・LC_Page_Error_DispError_Ex.php
・LC_Page_Error_SystemError_Ex.php
でも呼び出す
/**
* Page のアクション.
*
* @return void
*/
function action()
{
parent::action();
/**
* LC_Page_Ex.php にて定義
*/
// og:url
$this->custom_ogurl = LC_PAGE_Ex::customPublishUrl('ogp');
// カノニカルURL
$this->custom_canonical = LC_PAGE_Ex::customPublishUrl('canonical');
}
出力
site_frame.tpl
<!--{if $custom_canonical|strlen <= 1}--><meta name="robots" content="noindex, follow"><!--{/if}-->
<meta property="og:url" content="<!--{$custom_ogurl|h}-->">
<!--{if $custom_canonical|strlen >= 1}--><link rel="canonical" href="<!--{$custom_canonical|h}-->"><!--{/if}--><!--{strip}-->
最近の SEO 系のブログ記事の傾向を見て、
canonical を出さないようにしているページがあります(ページネーションが発生するページ)。
そこでは、代わりに noindex follow を入れるようにしています。
※ここまで書きましたが、
独自ロジックを EC-CUBE 全体に反映させるにはどこで呼び出したらいいんだろう。
反映箇所が多いと漏れがあると思うし、決済モジュールなどでは、モジュールごとに追記が必要になるので...。
ググっても個々のページ用の情報ばかりなので、よくわかりませんでした。勉強します。