EC-CUBEのsitemapから購入情報へのページを消しとく方法

おはこんばんちは。福田です。

お客様から連絡があって、「EC-CUBEの http://example.com/sitemap.php をGoogle webmastertoolsに登録したら、 /shopping/*** みたいなページが入ってて、そこカートの情報が無いと入れないからエラー出てる」って言われました。

ふむ。たしかに出ている。

じゃーちょっと修正しようということで、調査してみました。

まず、最初に、”どこで表示しているのか”調べます。

以下、便宜的に、EC-CUBEの格納されているディレクトリを EC-CUBE-DIR とします。

EC-CUBEは構造上、アクセスすると、まず EC-CUBE-DIR/html/ の処理が実行されます。
今回調査したいのは、sitemap.php なので、EC-CUBE-DIR/html/sitemap.php を見ましょう。


< ?php

// {{{ requires
require_once './require.php';
require_once CLASS_EX_REALDIR . 'page_extends/LC_Page_Sitemap_Ex.php';

// }}}
// {{{ generate page

$objPage = new LC_Page_Sitemap_Ex();
register_shutdown_function(array($objPage, 'destroy'));
$objPage->init();
$objPage->process();

EC-CUBE-DIR/data/class_extends/page_extends/LC_Page_Sitemap_Ex.php にアクセスしてることがわかりました。

LC_Page_Sitemap_Ex.php を確認すると、中身は空っぽ。
ということで 親クラスの EC-CUBE-DIR/data/class/pages/LC_Page_Sitemap.php を見てみると、開発者さんの苦悩が垣間見えました(笑)

今回は、 /shopping/ のディレクトりを排他処理したかっただけなので、 LC_Page_Sitemap_Ex.php をこんな感じにしてみました。


< ?php
/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) 2000-2012 LOCKON CO.,LTD. All Rights Reserved.
 *
 * http://www.lockon.co.jp/
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

// {{{ requires
require_once CLASS_REALDIR . 'pages/LC_Page_Sitemap.php';

/**
 * サイトマップ のページクラス(拡張).
 *
 * LC_Page_Sitemap をカスタマイズする場合はこのクラスを編集する.
 *
 * @package Page
 * @author LOCKON CO.,LTD.
 * @version $Id: LC_Page_Sitemap_Ex.php 21867 2012-05-30 07:37:01Z nakanishi $
 */
class LC_Page_Sitemap_Ex extends LC_Page_Sitemap {

    /**
     * exclusive_keywords
     *
     * @access public
     * @var array
     */
    var $exclusive_keywords = array("shopping/");

    // }}}
    // {{{ functions

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
        parent::process();
    }

    /**
     * デストラクタ.
     *
     * @return void
     */
    function destroy() {
        parent::destroy();
    }

    /**
     * ブロック情報を取得する.
     *
     * SEOとして必要のないページをはじく(/shopping/とか) ** 2014.2.10 y.fukuda
     * 
     * @param string $where WHERE句
     * @param array  $arrVal WHERE句の値を格納した配列
     * @return array $arrPageList ブロック情報
     */
    function getPageData($where = '', $arrVal = '') {
        $objQuery = SC_Query_Ex::getSingletonInstance();     // DB操作オブジェクト
        $sql = '';                      // データ取得SQL生成用
        $arrRet = array();              // データ取得用

        // SQL生成(url と update_date 以外は不要?)
        $sql .= ' SELECT';
        $sql .= ' page_id';             // ページID
        $sql .= ' ,page_name';          // 名称
        $sql .= ' ,url';                // URL
        $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';

        $arrPageList = $objQuery->getAll($sql, $arrVal);

        $exclusive_keywords = $this->exclusive_keywords;
        $judge_exclusive = false;
        if(!empty($exclusive_keywords)) {
            $judge_exclusive = true;
        }

        // URL にプロトコルの記載が無い場合、HTTP_URL を前置する。
        foreach ($arrPageList as $key => $value) {
            $arrPage =& $arrPageList[$key];

            // 排他URL対応
            $is_exclusive = false;
            if($judge_exclusive) {
                foreach($exclusive_keywords as $exclusive_keyword) {
                    if (strpos($arrPage['url'], $exclusive_keyword) !== false) {
                        $is_exclusive = true;
                    }
                }
            }

            if($is_exclusive) {
                unset($arrPageList[$key]);
                continue;
            }

            if (!preg_match('|^https?://|i', $arrPage['url'])) {
                $arrPage['url'] = HTTP_URL . $arrPage['url'];
            }
            $arrPage['url'] = preg_replace('|/' . preg_quote(DIR_INDEX_FILE) . '$|', '/' . DIR_INDEX_PATH, $arrPage['url']);
        }
        unset($arrPage);

        return $arrPageList;
    }
}

うん、たぶん大丈夫(´∀`)