* このモジュールは Sitemapプロトコルに対応した XMLファイルを出力する.
* EC-CUBE インストールディレクトリの htmlディレクトリへ配置することにより動作する.
*
* このモジュールにより, 以下のページのサイトマップが生成される.
* 1. $staticURL で指定したページ
* 2. 管理画面のデザイン管理から生成したページ
* 3. 公開されているすべての商品一覧ページ
* 4. 公開されているすべての商品詳細ページ
* 5. html/mobile 以下の上記ページ
*
* このモジュールを設置後, 各検索エンジンにサイトマップを登録することにより, 検索エンジンの
* インデックス化が促進される.
*
* @see https://www.google.com/webmasters/tools/siteoverview?hl=ja
* @see https://siteexplorer.search.yahoo.com/mysites
*
* @author Kentaro Ohkouchi
* @version $Id$
*
*/
require_once("require.php");
// --------------------------------------------------------------------- 初期設定
// :TODO: filemtime 関数を使えば、静的なページの更新時間も取得するようにできそう
//
// 動的に生成されないページを配列で指定
$staticURL = array(SITE_URL, MOBILE_SITE_URL, SITE_URL . "rss/index.php");
// :TODO: 各ページの changefreq や priority を指定できるようにする
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// }}}
// {{{ View Logic
/**
* Sitemap の を生成する.
*
* @param string $loc ページの URL ※必須
* @param string $lastmod ファイルの最終更新日 YYYY-MM-DD or W3C Datetime 形式
* @param string $changefreq ページの更新頻度
* @param double $priority URL の優先度
* @return Sitemap 形式の
* @see https://www.google.com/webmasters/tools/docs/ja/protocol.html#xmlTagDefinitions
*/
function createSitemap($loc, $lastmod = "", $changefreq = "", $priority = "") {
printf("\t\n");
printf("\t\t%s\n", htmlentities($loc, ENT_QUOTES, "UTF-8"));
if (!empty($lastmod)) {
printf("\t\t%s\n", $lastmod);
}
if (!empty($changefreq)) {
printf("\t\t%s\n", $changefreq);
}
if(!empty($priority)) {
printf("\t\t%01.1f\n", $priority);
}
printf("\t\n");
}
$objQuery = new SC_Query();
//キャッシュしない(念のため)
header("Paragrama: no-cache");
//XMLテキスト
header("Content-type: application/xml; charset=utf-8");
// 必ず UTF-8 として出力
mb_http_output("UTF-8");
ob_start('mb_output_handler');
print("\n");
print("\n");
// ----------------------------------------------------------------------------
// }}}
// {{{ Controller Logic
// 静的なページを処理
foreach($staticURL as $url) {
createSitemap($url, '', 'daily', 1.0);
}
// ページのデータを取得
$objPageData = new LC_PageLayout;
// TOPページを処理
$topPage = getTopPage($objPageData->arrPageList);
createSitemap($topPage[0]['url'], date2W3CDatetime($topPage[0]['update_date']),
'daily', 1.0);
// 編集可能ページを処理
$editablePages = getEditablePage($objPageData->arrPageList);
foreach($editablePages as $editablePage) {
createSitemap($editablePage['url'], date2W3CDatetime($editablePage['update_date']));
}
// 商品一覧ページを処理
$products = getAllProducts();
foreach($products as $product) {
createSitemap($product['url'], '', 'daily');
}
$mobileProducts = getAllProducts(true);
foreach($mobileProducts as $mobileProduct) {
createSitemap($mobileProduct['url'], '', 'daily');
}
// 商品詳細ページを処理
$details = getAllDetail();
foreach($details as $detail) {
createSitemap($detail['url'], date2W3CDatetime($detail['update_date']));
}
$mobileDetails = getAllDetail(true);
foreach($mobileDetails as $mobileDetail) {
createSitemap($mobileDetail['url'], date2W3CDatetime($mobileDetail['update_date']));
}
print("\n");
// ----------------------------------------------------------------------------
// }}}
// {{{ Model Logic
/**
* TOPページの情報を取得
*
* @param array $pageData すべてのページ情報の配列
* @return TOPページの情報
*/
function getTopPage($pageData) {
$arrRet = array();
foreach($pageData as $page) {
if ($page['page_id'] == "1") {
$page['url'] = SITE_URL . $page['url'];
$arrRet[0] = $page;
return $arrRet;
}
}
}
/**
* すべての編集可能ページの情報を取得する.
*
* @param array $pageData すべてのページ情報の配列
* @return 編集可能ページ
*/
function getEditablePage($pageData) {
$arrRet = array();
$i = 0;
foreach($pageData as $page) {
if ($page['page_id'] > 4) {
$arrRet[$i] = $page;
$i++;
}
}
return $arrRet;
}
/**
* date形式の文字列を W3C Datetime 形式に変換して出力する.
*
* @param date $date 変換する日付
*/
function date2W3CDatetime($date) {
$arr = array();
// 正規表現で文字列を抽出
ereg("^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})",
$date, $arr);
// :TODO: time zone も取得するべき...
return sprintf("%04d-%02d-%02dT%02d:%02d:%02d+09:00",
$arr[1], $arr[2], $arr[3], $arr[4], $arr[5], $arr[6]);
}
// ----------------------------------------------------------------------------
// }}}
// {{{ DB Access Objects
/**
* ページデータを扱うクラス.
*/
class LC_PageLayout {
var $arrPageData; // ページデータ格納用
var $arrPageList; // ページデータ格納用
/**
* コンストラクタ.
*/
function LC_PageLayout() {
$this->arrPageList = $this->getPageData();
}
/**
* ブロック情報を取得する.
*
* @param string $where WHERE句
* @param array $arrVal WHERE句の値を格納した配列
* @return ブロック情報
*/
function getPageData($where = '', $arrVal = ''){
$objDBConn = new SC_DbConn; // DB操作オブジェクト
$sql = ""; // データ取得SQL生成用
$arrRet = array(); // データ取得用
// SQL生成(url と update_date 以外は不要?)
$sql .= " SELECT";
$sql .= " page_id"; // ページID
$sql .= " ,page_name"; // 名称
$sql .= " ,url"; // URL
$sql .= " ,php_dir"; // php保存先ディレクトリ
$sql .= " ,tpl_dir"; // tpl保存先ディdレクトリ
$sql .= " ,filename"; // ファイル名称
$sql .= " ,header_chk "; // ヘッダー使用FLG
$sql .= " ,footer_chk "; // フッター使用FLG
$sql .= " ,author"; // authorタグ
$sql .= " ,description"; // descriptionタグ
$sql .= " ,keyword"; // keywordタグ
$sql .= " ,update_url"; // 更新URL
$sql .= " ,create_date"; // データ作成日
$sql .= " ,update_date"; // データ更新日
$sql .= " FROM ";
$sql .= " dtb_pagelayout";
// where句の指定があれば追加
if ($where != '') {
$sql .= " WHERE " . $where;
}
$sql .= " ORDER BY page_id";
$arrRet = $objDBConn->getAll($sql, $arrVal);
$this->arrPageData = $arrRet;
return $arrRet;
}
}
/**
* すべての商品一覧ページを取得する.
*
* @param boolean $isMobile モバイルページを取得する場合 true
* @return 検索エンジンからアクセス可能な商品一覧ページの情報
*/
function getAllProducts($isMobile = false) {
$conn = new SC_DBConn();
$sql = "SELECT category_id FROM dtb_category WHERE del_flg = 0";
$result = $conn->getAll($sql);
$mobile = "";
if ($isMobile) {
$mobile = "mobile/";
}
$arrRet = array();
for ($i = 0; $i < count($result); $i++) {
// :TODO: カテゴリの最終更新日を取得できるようにする
$page = array("url" => SITE_URL . sprintf("%sproducts/list.php?category_id=%d", $mobile, $result[$i]['category_id']));
$arrRet[$i] = $page;
}
return $arrRet;
}
/**
* すべての商品詳細ページを取得する.
*
* @param boolean $isMobile モバイルページを取得する場合 true
* @return 検索エンジンからアクセス可能な商品詳細ページの情報
*/
function getAllDetail($isMobile = false) {
$conn = new SC_DBConn();
$sql = "SELECT product_id, update_date FROM dtb_products WHERE del_flg = 0 AND status = 1";
$result = $conn->getAll($sql);
$mobile = "";
if ($isMobile) {
$mobile = "mobile/";
}
$arrRet = array();
for ($i = 0; $i < count($result); $i++) {
$page = array("url" => SITE_URL. sprintf("%sproducts/detail.php?product_id=%d", $mobile, $result[$i]['product_id']),
"update_date" => $result[$i]['update_date']);
$arrRet[$i] = $page;
}
return $arrRet;
}
?>