サイトマップページ(人間用)を自動生成する

EC-CUBEには、もともと /sitemap.php にアクセスすると検索エンジン用のサイトマップXMLファイルを出力する機能はありますが、ホームページ閲覧者が見る通常のサイトマップページは用意されていないようなので、作ってみました。

  1. 「デザイン管理」「ページ詳細設定」で新しいページを作成します。
    • 「名称」 サイトマップ
    • 「URL」 sitemap
    • 「共通のヘッダーを使用する」、「共通のフッターを使用する」はお好みでチェックを入ます
    • 最低限の内容は以下の通りです
    <ul>
    <!--{section name=i loop=$arrSitemap}-->
      <li class="sitemap<!--{$arrSitemap[i].level}-->">
        <a href="<!--{$arrSitemap[i].url}-->"><!--{$arrSitemap[i].page_name}--></a>
      </li>
    <!--{/section}-->
    </ul>
  2. 「デザイン管理」「CSS編集」で以下のサイトマップ用のスタイルを追加登録します(商品カテゴリの深さ+2分用意します)
    .sitemap0{ padding-left:1em }
    .sitemap1{ padding-left:2em }
    .sitemap2{ padding-left:3em }
    .sitemap3{ padding-left:4em }
    .sitemap4{ padding-left:5em }
    .sitemap5{ padding-left:6em }
    .sitemap6{ padding-left:7em }
    .sitemap7{ padding-left:8em }
    .sitemap8{ padding-left:9em }
  3. 「コンテンツ管理」「ファイル管理」で user_data/sitemap.php をダウンロードして以下の部分を追加し、上書きアップロードします
            // レイアウトデザインを取得
            $objLayout->sfGetPageLayout($this);
            
            // 画面の表示
            $objView->assignobj($this);
            // レイアウトデザインを取得
            $objLayout->sfGetPageLayout($this);
            
            // サイトマップを取得
            $this->arrSitemap = $this->lfGetSitemap();
    
            // 画面の表示
            $objView->assignobj($this);
    にし、
        /**
         * デストラクタ.
         *
         * @return void
         */
        function destroy() {
            parent::destroy();
        }
    }
        /**
         * デストラクタ.
         *
         * @return void
         */
        function destroy() {
            parent::destroy();
        }
        
        function lfGetSitemap(){
            $conn = new SC_DBConn();
            $arrSitemap[] = array('level' => 0, 'page_name' => 'トップページ', 'url' => SITE_URL);
            $arrSitemap[] = array('level' => 1, 'page_name' => '会社概要', 'url' => SITE_URL . 'abouts/');
            $arrSitemap[] = array('level' => 1, 'page_name' => 'お問い合わせ', 'url' => SITE_URL . 'contact/');
            $arrSitemap[] = array('level' => 1, 'page_name' => '特定商取引に関する記載', 'url' => SITE_URL . 'order/');
            foreach($conn->getAll("SELECT 1 level, page_name, url FROM dtb_pagelayout WHERE edit_flg = 1") as $i) {
                $arrSitemap[] = $i;
            }
            $arrSitemap[] = array('level' => 1, 'page_name' => '商品紹介(' . $conn->getOne("SELECT SUM(product_count) FROM dtb_category_count") . '品目)', 'url' => SITE_URL . 'products/list.php');
            function traverseCategory(&$arrSitemap, $conn, $parent_category_id = 0, $level = 2) {
                foreach($conn->getAll("SELECT category_id, category_name FROM dtb_category WHERE parent_category_id = $parent_category_id ORDER BY rank DESC") as $row) {
                    $count = $conn->getOne("SELECT product_count FROM dtb_category_total_count WHERE category_id = $row[category_id]") - 0;
                    $page_name = $row['category_name'] . '(' . ($count <= 0 ? '現在取り扱いしておりません' : $count . '品目') . ')';
                    $arrSitemap[] = array('level' => $level, 'page_name' => $page_name, 'url' => SITE_URL . "products/list.php?category_id=$row[category_id]");
                    traverseCategory($arrSitemap, $conn, $row['category_id'], $level + 1);
                }
            }
            traverseCategory($arrSitemap, $conn);
            return $arrSitemap;
        }
    }
    にします

これで /user_data/sitemap.php にアクセスするとサイトマップが表示されます。