マイクロ office ★excel2016 価格 http://www.msofisu.com

microsoft オフィス ★office365 価格 個人

EC-CUBE システム設定のパラメーター設定へ項目を追加 Eccube2.12.6

(EC-CUBE)システム設定のパラメーター設定へ項目を追加

(EC-CUBE)システム設定のパラメーター設定へ項目を追加

管理画面(管理画面>システム設定>パラーメーター設定)へパラメータを追加する方法を記載する。

前提EC-CUBE v2.12.6

①データベースへ項目を追加する。 対象DB:mtb_constants

・id:重複しないパラメータIDを設定する。 ※format(半角英数) ・name:パラメーター値 ※format(文字列/数値) ・rank: 項目の並び順 ※format(数値) ・remarks:補足説明 ※format(文字列)

項目追加は、以下SQL分をphpMyAdmin 等のデータベース管理ソフトで実行すると容易である。

insert into mtb_constants values('CUSTOM_SHOP_NAME2', 'PICKNICK CAFE', 2000, 'ショップ名称2(英文字)');

②パラメータのキャッシュを更新する。 管理画面(管理画面>システム設定>パラメーター管理)で、「この内容で登録する」ボタンを押下する。 キャッシュが更新され、追加したパラメーターが使用可能となります。

※補足:追加パラメータを扱うには。 テンプレートで以下コードを入力する。

<!–{$smarty.const.CUSTOM_SHOP_NAME2}–>

 

ECCUBE mtb_constants initパラメータ設定の項目を追加する方法

 

更新対応をする必要があるファイル、テーブルは 3箇所

システム設定のパラメータ設定については、

/data/mtb_constants_init.php

/data/cache/mtb_constants.php

Databaseの mtb_constants

3か所で情報が管理されています。

管理画面の「システム設定」-「パラメータ設定」の画面に遷移した際に表示される情報は、DBの「mtb_constants」の項目と値です。

保存すると、もちろん DBの「mtb_constants」に値が保存されますが、加えて、「/data/cache/mtb_constants.php」にも情報が保存されます。

そして、実際の ECCUBEが動作する際に利用されているのは、「/data/cache/mtb_constants.php」のファイルです。

情報の管理更新にはデータベースを使っていますが、実際にサイトのページ表示などにはファイルに保存された情報を使っています。 これは、画面表示の度にデータベースにアクセスしていたのでは、データベースに負荷がかかりすぎて表示スピードが犠牲になるため、その対応策として実装されている仕組みです。

また、「/data/mtb_constants_init.php」は、これらの更新の作業において全く利用されていません。 ですが、このファイルは、データベースや「/data/cache/mtb_constants.php」のファイルが壊れた際にバックアップ用途として利用されるファイルになっていますので、定期的にメンテナンスをしておく必要があります。

mtb_constants」に項目を追加する場合の具体的な手順

mtb_constants」に項目を追加する場合の説明を行います。

値を修正するだけであれば、管理画面から値を修正すれば問題ありませんが、項目を増やしたい場合は、管理画面からの操作では対応できませんので、アナログ的な対応が必要になります。

例えば、 項目名「SAMPLE_ADDRESS_A」 値「市区町村名 (例:千代田区神田神保町)A」 の項目を、一番上の項目として設定する場合の対応手順を見ていきましょう。

まず、テーブル「mtb_constants」に値を追加します。 INSERT INTO eccube_db.mtb_constants ( id , name , rank , remarks ) VALUES ( ‘SAMPLE_ADDRESS_A’, ‘市区町村名 (例:千代田区神田神保町)A’, ‘0’, ‘フロント表示関連’ );

これで管理画面の「パラメータ設定」画面に、新規追加した項目と値が表示されるようになります。

「rank」の値は、表示の順番になっていますので、並べたい順番の番号を指定します。 すでにある数値を指定した場合は、すでに指定してある項目の次に編集されます。

この状態で、管理画面の情報を更新すると、「/data/cache/mtb_constants.php」ファイルが更新され、システム全体に反映されるようになります。

また、その更新した情報で問題がない場合は、「/data/cache/mtb_constants.php」の中身を「/data/mtb_constants_init.php」にコピペします。 その際、元の「/data/mtb_constants_init.php」はバックアップを取っておく方がいいでしょう。

これで、設定が終了します。

管理画面での会員検索カスタマイズ(2.13) eccube 会社名 検索条件設定 追加

[EC-CUBE]管理画面での会員検索カスタマイズ(2.13) eccube  会社名  検索条件設定 追加

[EC-CUBE]管理画面での会員検索カスタマイズ(2.13)eccube  会社名  検索条件設定 追加

A)検索条件設定で検索条件を非表示にする(職業での検索を非表示にする場合)

1.data/class/helper/SC_Helper_Customer.phpの565行目以降、会員検索パラメーター(管理画面用)内の

$objFormParam->addParam('職業', 'search_job', INT_LEN, 'n', array('MAX_LENGTH_CHECK'));

コメントアウトする

2.data/class/SC_CustomerList.php

if (!isset($this->arrSql['search_job'])) $this->arrSql['search_job'] = '';

から始まる職業による検索部分をコメントアウトする。

非表示にする項目によっては、この後のエラーチェック部分も非表示にする。

3.data/Smarty/templates/admin/adminparts/form_customer_search.php内が実際に表示される部分なので

<!--{if false}-->  <!--{/if}-->

コメントアウトする。

B)検索条件設定に検索条件を追加する(会社名での検索を追加する場合)

1.data/class/helper/SC_Helper_Customer.phpの565行目以降、会員検索パラメーター(管理画面用)内に

$objFormParam->addParam('会社名', 'search_company_name', STEXT_LEN, 'aKV', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));

を追加する。

2.data/class/SC_CustomerList.php内に

if (!isset($this->arrSql['search_company_name'])) $this->arrSql['search_company_name'] = '';
if (strlen($this->arrSql['search_company_name']) > 0) {
    $this->setWhere('company_name LIKE ?');
    $searchCompany = $this->addSearchStr($this->arrSql['search_company_name']);
    $this->arrVal[] = preg_replace('/[  ]+/u','',$searchCompany);
}

を追加する。最後のreplaceは正直いらないと思うけれども、部分一致用に名前での検索を参考にしたのでこうなった。

3.data/Smarty/templates/admin/adminparts/form_customer_search.php

<tr>
    <th>会社名</th>
    <td colspan="3">
        <!--{assign var=key value="search_company_name"}-->
        <!--{if $arrErr[$key]}--><span class="attention"><!--{$arrErr[$key]}--></span><!--{/if}-->
        <input type="text" name="<!--{$key}-->" maxlength="<!--{$arrForm[$key].length}-->" value="<!--{$arrForm[$key].value|h}-->" size="30" class="box30" <!--{if $arrErr[$key]}--><!--{sfSetErrorStyle}--><!--{/if}--> />
    </td>
</tr>

追加。

 2.13 商品詳細ページのCSV 項目追加(MySQL)

[EC-CUBE] 2.13 商品詳細ページの項目追加(MySQL

[EC-CUBE] 2.13 商品詳細ページの項目追加(MySQL

商品ページに項目を増やすプラグインが既にあるのですが、他にどうしても利用したいプラグインとコンフリクトしてしまいました。また、CSVで出力・登録もできないと先々問題になりそうなので、データベースをいじってカスタマイズするのは初めてでしたが、まだ製作中のサイトという事もあり自分でやってみることにしました。素人なので、各部の名前(テーブル・カラム・レコード)の呼び方が間違っているかもしれません。

今回、商品詳細ページに追加した項目

目标 要完成 CSV 追加 2个项目

1 注意書き(管理画面で入力したテキストを表示) :注意提示,在管理页面 输入文本文档 2 プレゼント包装 可(管理画面でチェックボックスにチェックすると「プレゼント包装 可」と表示) 选择项,要不要选择礼物包装。

データベースの「dtb_products」に「comment7」「pre_flg」という名前のカラム追加 (数据库修改 追加 2个表 点 structure 底部 field(s) 追加上)

  1. phpMyAdminにログイン
  2. データベース名を選択
  3. dtb_productsの行の「構造」をクリック
  4. 構造画面に移動したら画面を下までスクロール
  5. 「指定のカラムの後に」をチェックして、任意のカラムを選択(今回はcomment6の後に追加)
  6. 左の「×個のフィールドを追加する」に、任意の数を入力(今回は2)
  7. 「実行する」をクリック

空のフィールドが2行表示されるので、項目・種別・ヌルの項目を設定

追加したい項目名「comment7」を入力 種別を選択で(TEXT)を選択。 ヌル(NULL)の項目を「null」を選択して設定 下の「保存する」をクリック 2行目「pre_flg」もすべて1行目と同じでOKでした。(種別も(TEXT)でOKでした。)

 

カスタマイズファイル 修改一下文件

/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php /data/class/SC_Product.php /data/Smarty/templates/admin/products/product.tpl /data/Smarty/templates/admin/products/confirm.tpl /data/Smarty/templates/default/products/detail.tpl

/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php

(1)358行目辺り「//項目追加 カスタマイズ」のコメント文以降が追加コード

for ($cnt = 1; $cnt <= PRODUCTSUB_MAX; $cnt++) {
    $objFormParam->addParam('詳細-サブタイトル' . $cnt, 'sub_title' . $cnt, STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
    $objFormParam->addParam('詳細-サブコメント' . $cnt, 'sub_comment' . $cnt, LLTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
    $objFormParam->addParam('save_sub_image' . $cnt, 'save_sub_image' . $cnt, '', '', array());
    $objFormParam->addParam('save_sub_large_image' . $cnt, 'save_sub_large_image' . $cnt, '', '', array());
    $objFormParam->addParam('temp_sub_image' . $cnt, 'temp_sub_image' . $cnt, '', '', array());
    $objFormParam->addParam('temp_sub_large_image' . $cnt, 'temp_sub_large_image' . $cnt, '', '', array());
   //項目追加 カスタマイズ
    $objFormParam->addParam('注意書き', 'comment7', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
    $objFormParam->addParam('プレゼント包装の可否', 'pre_flg', STEXT_LEN, 'n', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
}

プレゼント包装の可否の部分は、他の行を複製して利用ているので、この書き方は多分間違っています。 「kva」の部分を「n」に変更(必要かどうかは不明)。「array」の部分は空でOKかもしれませんが、とりあえずこのままでも大丈夫でした。

【文字列の変換】 K : 「半角(ハンカク)片仮名」を「全角片仮名」に変換 C : 「全角ひら仮名」を「全角かた仮名」に変換 V : 濁点付きの文字を一文字に変換。”K”,”H”と共に使用します n : 「全角」数字を「半角(ハンカク)」に変換

(2)1000行目付近「// 配列の添字を定義」の部分に追加

「//項目追加 カスタマイズ」のコメント文の下が追加している部分

 

// 配列の添字を定義
$checkArray = array('name', 'status',
                    'main_list_comment', 'main_comment',
                    'deliv_fee', 'comment1', 'comment2', 'comment3',
                    'comment4', 'comment5', 'comment6',
         //項目追加 カスタマイズ
                    'comment7', 'pre_flg',
                    'sale_limit', 'deliv_date_id', 'maker_id', 'note');
$arrList = SC_Utils_Ex::arrayDefineIndexes($arrList, $checkArray);

(3)1010行目付近「// INSERTする値を作成する。」の部分に追加

「//項目追加 カスタマイズ」のコメント文以降が追加コード

 // INSERTする値を作成する。
    $sqlval['name'] = $arrList['name'];
    $sqlval['status'] = $arrList['status'];
    $sqlval['main_list_comment'] = $arrList['main_list_comment'];
    $sqlval['main_comment'] = $arrList['main_comment'];
    $sqlval['comment1'] = $arrList['comment1'];
    $sqlval['comment2'] = $arrList['comment2'];
    $sqlval['comment3'] = $arrList['comment3'];
    $sqlval['comment4'] = $arrList['comment4'];
    $sqlval['comment5'] = $arrList['comment5'];
    $sqlval['comment6'] = $arrList['comment6'];
//項目追加 カスタマイズ
    $sqlval['comment7'] = $arrList['comment7'];
    $sqlval['pre_flg'] = $arrList['pre_flg'];

 

/data/class/SC_Product.php

625行目辺り「商品詳細の SQL を取得する」に追加

,dtb_products.comment7 ,dtb_products.pre_flg

/data/Smarty/templates/admin/products/product.tpl

商品登録ページに入力欄を追加します。 どこでも良いと思いますが、詳細コメントの下に追加しました。

<tr> <th>注意書き<span class=“attention”> </span></th> <td> <span class=“attention”><!–{$arrErr.comment7}–></span> <input type=“text” name=“comment7” value=“<!–{$arrForm.comment7|h}–>” maxlength=“<!–{$smarty.const.STEXT_LEN}–>” style=“<!–{if $arrErr.comment7 != ”“}–>background-color: <!–{$smarty.const.ERR_COLOR}–>;<!–{/if}–>” size=“60” class=“box60” /> <span class=“attention”> (上限<!–{$smarty.const.STEXT_LEN}–>文字)</span> </td> </tr>

<tr> <th>プレゼント包装の可否<span class=“attention”> </span></th> <td> <span class=“attention”><!–{$arrErr.pre_flg}–></span> <label><input type=“checkbox” name=“pre_flg” value=“1” <!–{if $arrForm.pre_flg == 1}–>checked=“checked”<!–{/if}–> />プレゼント包装 可</label> </td> </tr>

/data/Smarty/templates/admin/products/confirm.tpl

確認ページにも追加します

<tr> <th>注意書き</th> <td><!–{$arrForm.comment7|h}–></td> </tr>

<tr> <th>プレゼント包装の可否</th> <td> <!–{if strlen($arrForm.pre_flg) >= 1}–><!–{$arrForm.pre_flg|h}–><!–{/if}–> </td> </tr>

/data/Smarty/templates/default/products/detail.tpl

最後に、商品詳細ページに表示させるためのコードを書いて完了です (デザイン管理 → ページ詳細設定 → 商品詳細ページ)

<!–★注意書き★–> <!–{$arrProduct.comment7|h}–>

<!–★代引きの可否★–> <!–{if $arrProduct.pre_flg == 1}–>プレゼント包装 可<!–{/if}–>

CSS省略

データベースを確認したところ、ちゃんと登録されている。

商品登録CSV(出力・登録)するためにデータベースに追加する

dtb_csvにレコードを2つ追加

phpMyAdminへのログイン データベース名を選択 dtb_csvの行の「挿入」をクリック 下記のように値を入れて「実行」する

下記は、「comment7」を登録した例です。

    1. no:(登録データの最大値を捜して+1した数字)157登録されていたので「158」と入力
    2. csv_id:1
    3. col:comment7
    4. disp_name:注意書き
    5. rank:(商品登録CSVデータの表示順)管理ページで確認すると「71」項目あるので「72」から登録
    6. update_date:カレンダーから今日の日付を選択

「LC_Page_Admin_productd_UploadCSV.php」の修正

参考ページには「LC_Page_Admin_productd_UploadCSV.php」にも追加が必要とありますが、2.13.1では、カスタマイズ不要でした。

ホームページ作成支援 無料ホームページ・サーバー

ホームページ作成支援 無料ホームページ・サーバー

無料で簡単に作れるおすすめホームページ・レンタルサーバー情報を厳選してご紹介しています。無料サーバーの詳細情報、登録の流れ、実際に登録したサンプルサイトも多数掲載しています。

ホームページ・サーバーとは

サーバー(server)とは、サービス(service)を提供する者という意味です。ホームページを公開するスペースのことをサーバー(ホームページサーバー)といい、スペースを借りるのでレンタルサーバーとも呼びます。

無料で利用できるレンタルサーバーには高機能でサポートもしっかりしているところが多いため、利用者は多いです。

▼ サーバーの説明の見方 ※ 容量 : HTMLファイルや画像ファイルなどの最大保存容量。 ※ URL : 使うことができるURLの形式 ※ 広告 : 表示される広告 ※ プログラム言語 : CGIPHP、SSIなどの使用可否 ※ 商用利用 : 商用で使えるか、アフィリエイトが使えるかどうか ※ アフィリエイトアフィリエイト利用が可能かどうか ※ 有効期間 : サーバーの利用可能期間。基本的に無期限

FC2WEB(FC2ホームページ)

FC2WEBオススメ度:★★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK ナシ 1GB OK OK OK × × アリ
URL
http://〇〇〇.web.fc2.com
  • 容量1Gで、希望のサブドメインを設定可能。
  • 広告なし!フッターに『Powered by FC2』が小さく表示されるのみ。
  • アクセス解析、メールフォーム、カウンターなど、無料のCGI多数。
  • 初めて無料ホームページを利用するなら、まずはコレで間違いなし!
  • URLの〇〇〇は好きな文字を設定できます!

▼ 公式サイト  FC2WEB無料ホームページ

Wix

Wix オススメ度:★★★★☆

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK ナシ 500MB - - OK - - アリ
URL
http://◇◇◇.wix.com/△△△

▼ 公式サイト Wix(ウィックス)

Webnode

Webnode オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK ナシ 100MB - OK OK × × アリ
URL
http://〇〇〇.webnode.jp

▼ 公式サイト Webnode

Jimdo

Jimdo オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK ナシ 500MB - × OK × × アリ
URL
http://〇〇〇.jimdo.com

▼ 公式サイト Jimdo

SITEMIX

SITEMIX オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK 横バナー 下テキスト 1.5GB OK OK OK OK × アリ
URL
http://〇〇〇.sitemix.jp

▼ 公式サイト  無料ホームページSITEMIX

TOK2 FREE HOMEPAGE

TOK2 FREE HOMEPAGE オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK 上横下バナー 無制限 OK × × OK × アリ
URL
http://△.tok2.com/〇〇〇/

▼ 公式サイト TOK2 FREE HOMEPAGE

Xdomain

Xdomain オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK 広告なし 1GB OK OK OK × × アリ
URL
http://〇〇〇.html.xdomain.jp/

▼ 公式サイトXdomain

忍者ホームページ

忍者ホームページ オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK 下テキスト 500MB OK OK OK × × アリ
URL
http://〇〇〇.△△△.jp 他

▼ 公式サイト 忍者ホームページ

WEBCROW

WEBCROW オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK 広告なし 1GB OK OK OK アリ
URL
http://〇〇〇.webcrow.jp/

▼ 公式サイト WEBCROW

Yahoo!ジオシティーズ

Yahoo!ジオシティーズ オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
不可 上下or 横バナー 50MB OK × × × × アリ
URL
http://△△△.geocities.jp/〇〇〇/

▼ 公式サイト Yahoo!ジオシティーズ

XREA.COM

XREA.COM オススメ度:★★★★

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK 上バナー 1GB OK OK OK OK OK アリ
URL
http://〇〇〇.△△△.xrea.com/

▼ 公式サイト XREA.COM

AMS簡単無料ホームページ

ams

オススメ度:★★★☆

商用 広告 表示 容量 FTP 独自 ドメイン サブ ドメイン CGI DB サン プル
OK 下テキスト 横バナー 100MB - - OK - - アリ
URL
http://〇〇〇.amsstudio.jp/

▼ 公式サイト AMS簡単無料ホームページ

  • 世界中で4,500万ユーザーを誇る人気の無料ホームページスペースです。
  • CMS機能にて編集はドラッグ&ドロップ、オンライン公開もクリック一つ!
  • 数百のデザインテンプレートから好きなものを選べます!
  • 初心者でもデザイン性に優れたサイトを簡単に作成できます。
  • URLの◇◇◇は登録したアカウント名が設定されます。
  • URLの△△△は登録したホームページ名が設定されます。
  • 個人、ビジネス、ネットショップとも無料で運営でき、広告なしです。
  • 3ステップで登録、ドラッグ&ドロップでサイト作成できるので、初心者にもピッタリ。
  • 一つの登録アカウントで、複数のウェブサイトを管理できます。
  • 独自ドメインを移管してのサイト運営も可能です。
  • CMS系の無料ホームページです。
  • 無料でショップ機能(5商品まで)を利用でき、PayPalに対応しています。
  • フォトギャラリーは「Flickr」とも連携でき、機能も豊富です。
  • ドイツの会社ですが、日本では㈱KDDIウェブコミュニケーションズが運営しています。
  • 非公式ですがJimdoでつくる簡単ホームページ!でわかりやすく説明しています。
  • 大容量1.5Gで独自ドメインも対応可能です。
  • 一つのアカウントで複数サイトを持つことができます。
  • WordPressベースのブログや、PHP/CGIも利用可能です。
  • 画像や動画の利用にうれしい容量無制限!
  • PHPPerlなど独自のCGI設置が可能!
  • TOK2CMS(コンテンツ・マネージメント・システム)を利用して、簡単にHP編集が可能。
  • URLの△は任意の数値が入ります。
  • 独自ドメインも利用できて、広告表示なしの無料ホームページです。
  • HTMLサーバなら、静的コンテンツ専用サーバのため、サーバ動作が重くなりにくい。
  • ドメイン取得サービスを利用すると、ディスク容量が10GBになるなど特典あり!
  • 広告を載せる代わりに、PHPMySQLWordPressの利用が可能になります。
  • URLの△△△は340種類のドメインから選択可能!
  • 独自ドメインも可!
  • 1つのIDで最大10個のホームページを作成できます!
  • アップロードはFTPSによりセキュアな通信が可能!
  • 独自ドメインも利用できて、広告表示なしの無料ホームページです。
  • 広告を載せる代わりに、容量を2GBに拡張 or PHPMySQLの利用ができます。 ※PHPMySQL利用は上部に、2GB拡張は下部に広告が表示されます。
  • 「クイックページ」「ジオクリエイター」を利用し、テンプレートから簡単にHP作成、編集が可能です。
  • バナー広告は「たて型」「よこ型」を選択できます。
  • 商用利用は、Yahoo!ショッピングバリューコマースなど一部利用可能。
  • URLの△△△は数種のドメインから選択できます。
  • 無料ホームページでは他にない高機能。中~上級者向けです。
  • CGI/SSI(PerlRubyPython・C・PHP3/4/5)が利用可能。FTPSにも対応。
  • 独自ドメイン、マルチドメインにも対応しています。
  • URLの△△△はサーバー名が設定されます。
  • CMS機能にて専門知識がなくても直感的な操作で、10分で完成します。
  • テンプレートが業種別に用意されているため、ビジネスの利用にも最適。
  • サポート体制も万全で、ページ作りのポイント等をメールでアドバイスしてくれます。

 

robots.txtの書き方と効果的な活用法

robots.txtの書き方と効果的な活用法

robots.txtの書き方と効果的な活用法

SEOは既に「良質なコンテンツ」のみが検索上位を独占するようになりつつある。

そして、良質なコンテンツばかりになってくるとサイト内部がどれだけ最適化されているかが結果を分けるようになってくる。

robots.txtはその内部の最適化の施策一つで、適切に設定するとSEO効果を大きく改善することができる。

当記事では、robots.txtを正しく設定することでSEO効果が改善する具体的なメカニズムと、robots.txtの効果的な設定方法を詳しくご紹介する。robots.txtが初めてという方でも、疑問が全て解決すると思うので、是非参考にして欲しい。

robots.txtは「ロボッツ・テキスト」、または「ロボット・テキスト」と読みます。 robotではなく、robotsです。

robots.txtサーチエンジンのクローラ(スパイダー)の、ファイルとディレクトリへのアクセスを制御するために使われます。

「secretsというディレクトリにあるファイルにはすべてアクセスさせたくない」とか、「himitsu.htmlというファイルだけはアクセスさせたくない」という使い方ができます。

「アクセスさせたくない」というのは、「インデックスさせたくない」すなわち「検索結果に表示させたくない」ということです。

「なぜ、検索結果に表示させたくないの?」と疑問に思うかもしれません。

さまざまなケースがあります。

たとえば、URLを自分が教えた限られた人にだけ見せたい場合です。 もしURLを知っている人が、どこかにそのURLを貼り付けたとしたら、クローラがたどってインデックスしてしまいます。

実際に、僕が以前に無料レポートスタンドに登録した無料レポートの入手URLがインデックスされていて、検索結果に表示されてます。 メールアドレスを収集するのが目的なのに、誰でも自由にダウンロードできてしまっては意味がないです。(??;

他の例として、有料リンクを掲載する場合があります。

Googleは有料リンクを全面的に禁止しているわけではありません。 PageRankを売ったりする無差別なリンク販売を禁止しているのです。

robots.txtでブロックしたページ経由でリダイレクトしてリンクさせれば、まったく問題ありません。

以下は、Googleのウェブマスター向けヘルプ センターからの引用です。

すべての有料リンクが Googleガイドラインに違反するわけではありません。リンクの売買も、検索結果の操作でなく宣伝を目的として行われる限り、ウェブ上での通常の経済活動となります。広告として購入したリンクでは、そのことを明示する必要があります。この処理は次のような方法で行うことができます。
  • rel=”nofollow” 属性を <a> タグに追加する
  • robots.txt ファイルによって検索エンジンからブロックされる中間ページにリンクをリダイレクトする

アフィリエイトリンクを隠すために短縮URLを使うアフィリエイターがいます。 短縮URLを記述したファイルを、検索エンジンにインデックスさせたくないときにも、robots.txtは使えます。

さて、前置きが長くなりました。

robots.txtの書き方を説明します。

簡単です。

robots.txtは、エディタ(Windowsに付属のメモ帳)で作成するシンプルなテキストファイルです。

記述する項目は、次の3つです。

  1. アクセスを制御するクローラのタイプ
  2. アクセスを許可するのか拒否するのか
  3. アクセスを制御するディレクトリ・ファイル

下は、robots.txtのサンプルです。

User-Agent: * Disallow: /

最初の「User-Agent」は、クローラの指定です。 「*(アスタリスクワイルドカード)」は、すべてのクローラを表します。

Googleのクローラは「googlebot」、Yahoo!のクローラは「Slurp」、MSN Live Searchのクローラは「msnbot」で指定できます。

「Disallow」は、「アクセス拒否」を表します。 アクセスを許可するときは、「Allow」ですが、Disallowの記述がなければアクセスするので、わざわざAllowを指定する必要はありません。

Disallow(Allow)の後に続くのは、アクセスを制御するディレクトリまたはファイルです。

例の「/(スラッシュ)」は「ルートディレクトリ」を表します。

「ルートディレクトリ」とは、いちばん上の階層のフォルダです。 ディレクトリを指定すると、その中にあるすべてのファイルと、サブディレクトリがあるときはサブディレクトリの中のすべてのファイルがアクセス制御対象になります。

「/secrets/」とすると、ルートディレクトリの中にある「secrets」というディレクトリの中のファイルをアクセス制御できます。

「/onlyyou/himitsu.html」とすると、ルートディレクトリの中にある「onlyyou」というサブディレクトリの中の「himitsu.html」というファイルへのアクセスを制御できます。

以上を踏まえて、サンプルのrobots.txtを解釈してみましょう。

User-Agent: * Disallow: /

「すべてのクローラ(User-Agent: *)は、ルートディレクトリ配下の全てのファイル(/)に、アクセスしてはいけません(Disallow)」という意味になります。

つまり、インデックスの完全拒否ですね。

別のサンプルです。

User-Agent: * Disallow: /secrets/

すべてのクローラは、「secrets」フォルダのすべてのファイルにアクセスしてはいけません、という命令になります。

「secrets」フォルダはURLで表すと、「http://www.eccube.org/secrets/」になります。

http://www.eccube.org/secrets/noaccess/」にアクセスさせたくなければ、

User-Agent: * Disallow: /secrets/noaccess/

になります。

ルートディレクトリの直下にある「secrets」フォルダの中の「ihateyahoo.html」ファイルを、Yahoo!の検索結果にだけ表示させたくなければ、次のようになります。

User-Agent: Slurp Disallow: /secrets/ihateyahoo.html

目的の記述をテキストエディタで書いたら、「robots.txt」という名前で保存します。

作成したrobots.txtファイルを、ルートディレクトリ(ドメインのいちばん上の階層のフォルダ、URLの「/」で表記される)にアップロードします。 ※ルートディレクトリにファイルをアップロードできない無料ブログでは、robots.txtは利用できません。

クローラは、アクセスしたときにいちばん最初にそのドメインrobots.txtを探して、見つかれば記述内容に従うように設計されています。

ただ、robots.txtに従わない行儀の悪いロボットも存在しますのでご注意を。 msnbotなんかは、たまに無視します。(??メ

アクセス制御の手段としては、nofollow属性や、METAタグの「noindex」属性も利用できます。

しかし、nofollow属性の付いたリンクは、リンク先ページクローラがたどってインデックスすることが確認されています。

インデックスを拒否するMETAタグの記述は、次のようになります。

<meta name=”robots” content=”noindex” />

※HTML4の場合は、最後の「/」は不要。nofollowと共に使われることが多い。

「robots」はすべてのクローラを表します。 Yahoo!だけに拒否したかったら、「slurp」を指定します。

ただMETAタグでの指定も、たまに無視されます。 MSN Live Seachはもちろんのこと(笑)、たまにGoogleでさえも。

ネットには、robots.txtを簡単に作成できるツールが無料で公開されているので探してみてもいいでしょう。

Googleウェブマスターツールには、robots.txtファイルを作成できる機能が追加されています。

でも、そんなツールに頼らなくても、robots.txtは簡単に作成できます。

アクセス拒否(インデックス拒否)したいデータがないのならば、robots.txtはまったく必要ありませんが、長いことサイトを運営していると、いつかきっと必要になる日が来るはずです。

2.クロール最適化の定義とその効果

クロール最適化とは、以下のように定義することができる。

クロール最適化とは サイト内の重要なページに対するクロール頻度を増やすことによって、比較的短期間でSEOを大きく改善するための施策

これを徹底して行うと、検索流入数を驚くほど向上させることができる。

なぜクロール最適化を行うことでSEOを大きく改善することが出来るのかを理解するには、まずはクローラーSEOの関係を知っておく必要がある。

2−1.クローラーの巡回頻度や効率はSEOにとって超重要!

クロールの巡回頻度と検索流入数には強い相関関係がある。

これから証拠となるデータをお見せする。これを見るとクロール最適化を行っていると少ないクロール頻度でも大きな結果を得られることも分かるので是非ご確認頂きたい。

参考サイトの選定条件 1. 同一のクロール最適化を行っており、かつ直近のクライアント様サイトを対象とする 2. 定期的に良質なコンテンツを更新しているサイトを対象とする 3. 自動生成された重複コンテンツの量が格段に多くなるためECサイトは対象外とする
注:クロールの計測に関して ※本来クローラーの巡回数を正確に計測するにはサーバーのモニタリングが必要だが、ツールの導入コストがかかったり、過度に専門的になってしまうのでここでは誰でも使うことができるウェブマスターツールで計測している。 ※実際のアクセス数は、対策するキーワードの需要によって大きく変わる。

2−1−1.クロール頻度が60回/日の場合のデータ

平均のクロール頻度が60回/日を越えるタイミングでロングテールキーワードからの検索流入数が急激に増える。言い換えると、この水準まで達しなければロングテールキーワードでも上位に表示されない。

検索流入数の劇的な伸び※上が検索流入数の図 / 下がクロール頻度の図

この段階で、このように検索流入の明らかな伸びがあれば、後は良質なコンテンツを継続して更新するだけでクローラーの巡回頻度が上がり、さらにSEO効果が上昇していく。

2−1−2.クロール頻度が100回/日の場合のデータ

クロール頻度が100回/日を越えてくるとSEOで月間10万アクセスほどの規模になることが分かる。

クロール頻度平均100以上

ここまでになれば検索数が、10000未満程度のミドルキーワードでも上位表示されるようになる。

2−1−3.クロール頻度が150回/日の場合のデータ

クロール頻度が150〜200回/日程度の規模になってくるとSEOで月間30万アクセスほどの規模になる。

クロール平均150から200

この段階になると、数多くのビッグキーワードでも上位表示されるようになっている。

いかがだろうか?SEOにとってクローラーが非常に大きな役割を担っていることはご理解頂けただろう。

他にも、実際に「クロールの巡回頻度が8000回/日あったのが1週間で800回/日以下に落ちてしまい、ほとんどのキーワードで検索に引っかからなくなってしまった」というご相談を受けたり、”SEARCH MARKETING EXPO” 講師のMitul Candhiも「14日間クロールされていないページは検索流入数が減りクロールの頻度が多いページほど検索流入数が増える」と断言したりしている。

繰り返しになるが、SEOにおいてクローラーが非常に重要だということをしっかりと認識して欲しい。

2−2.robots.txt設定の前に抑えておくべきクローラーの特徴

それでは、SEOを攻略する上で絶対に知っておくべきクローラーの特徴をご紹介する。

2−2−1.クローラーは被リンクを経由して訪れる

ページに対するクローラー流入経路は2つだけだ。

・被リンクや内部リンクを経由して訪れる ・XMLサイトマップを経由して訪れる

このうちでSEO効果に対して比率が高いのは前者のリンクを経由して訪れるものだ。つまり、同じドメイン内でも質の高い被リンクを多く獲得しているページほどクローラーが頻繁に回ってくるようになる。

また、クローラーは内部リンクからドメイン内の別のページの情報もチェックするようになっている。そのため、上位表示をさせたい重要なページに対して内部リンクを貼ると、そのページの検索順位を改善することができる。

さらに、そうした内部リンク施策で成果を最大化するためにはクロールバジェットを知っておく必要がある。

2−2−2.ドメイン毎にクロールバジェット(予算)がある

クローラーがサイトに回ってきた時に、どれぐらい深くサイトを回ってくれるかは、ドメインのクロールバジェットによって決められる。

クロールバジェット:クローラーが一回訪れた時に訪問するページ数

以下の図を見て欲しい。

これは、クロールバジェットが3ページだった場合の各ページに対するクロール状況を示したものだ。

クロールバジェット

ご覧のように、何も考えずにサイトを構築していたらクローラーが回らないページが多数出てきてしまう。これが例えばサイトが成長してクロールバジェットが4ページになると、以下のようにクローラーが回らないページの下図は大幅に少なくなる。

クローラーバジェット4ページ

それではクロールバジェットはどのように決められるのだろうか?

GoogleMutt Cutts氏は以下のように言っている。

多くのリンクを獲得しているページはクロールされるのも早い。ページランクが低いページはクローラーもそれほど頻繁に回ってこない。言い換えると、クロールバジェットは(ドメインやページの)オーソリティによって決まる。 参照:”Matt Cutts Interviewed by Eric Enge

そして、オーソリティを上げるためには、良質なコンテンツを頻繁に更新することを何ヶ月も何年も続ける必要があるため非常に時間がかかる。(本来はどの企業もやるべきことだが、、、)

そこで、必要になるのがクロール最適化だ。

注:オーソリティはMOZのOpen Site Explorerで調べることができる。

2−2−3.クロール最適化におけるrobots.txtの役割

robots.txtは不要なページに対するクローラーのアクセスをブロックすることができる。

つまりSEO上クロールが不要なページにはクローラーが回らないようになるのでクロールバジェットが無駄に消費されないようになる。結果、クローラーを回す必要のあるページに、より多くのクローラーが回るようになるためサイト全体のSEOが改善される。

これがrobots.txtの役割だ。

3.robots.txtの設定方法

それでは、ここからようやく本題のrobots.txtの設定方法をご紹介する。

robots.txtの設定を間違えてしまうと、逆効果になってしまうので、それを防ぐためにも、ここまでの解説をしっかりと頭に入れた上で行おう。

3−1.robots.txtで指定するべきページとは?

Googleは以下のように、robots.txtを使ってクローラーを排除するべきページを具体的に指定している。

robots.txtを使用して、検索結果ページや、検索エンジンからアクセスしたユーザーにとってあまり価値のない他の自動生成ページをクロールしないように生業します。 ・広告が検索エンジンの掲載順位に影響を与えないように、適切な対処をします。たとえばGoogleAdSense広告やDoubleClickのリンクは、robots.txtファイルでクロールをブロックします。 参照:『ウェブマスター向けガイドライン

これを簡単に言い換えると、robots.txtでクロールをブロックするべきページは以下の2つということになる。

  • 検索エンジンのユーザーにとって価値のないページ
  • 広告リンク先のページ

一つずつご説明する。

3−1−1.robots.txtでブロックすべき自動生成ページとは?

自動生成ページとは、プログラムによって生成されたコンテンツのことだ。

Googleでは具体的に以下のように定義されている。

・自動化されたツールで翻訳されたテキストが人間によるチェックや管理を経ず公開されたもの ・マルコフ連鎖などの自動化されたプロセスを通じて生成されたテキスト ・自動化された類義語生成や難読化の手法を使用して生成されたテキスト ・Atom/RSS フィードや検索結果からの無断複製によって生成されたテキスト ・複数のウェブページからのコンテンツに十分な付加価値を加えることなくそれらをつなぎ合わせたり組み合わせたりしたもの 参照:『自動的に生成されたコンテンツ

しかし、これだと中々分かりづらいだろうから、誰にでも分かるように解説しよう。

大切なことは、自動生成ページという言葉に惑わされずに、「ユーザーにとって価値のないページに対するクロールはrobots.txtでブロックする」と理解することだ。そして、現状、自動生成ページのほとんどがユーザーにとって価値のないページだから、「自動生成ページ=ブロック」という風潮になっているだけだ。

それでは、ユーザーにとって価値のないページとはどのようなページだろうか?簡単に言うと、それは『良質なサイトを作るためのアドバイス』の28の項目を“満たさない“もののことだ。

繰り返しになるが、ユーザーにとって価値のないページに対するクロールは全てブロックしよう。また、あなたのサイトの自動生成ページがユーザーにとって価値があるかないかを自分では判断しかねる場合もブロックしておく方が無難だ。

注:自動生成ページと重複コンテンツについて 両者を同一と考えている方が多いが、それぞれ別物であり対策方法も違う。例えば、Googleは重複コンテンツに対するクローラーの巡回をrobots.txtで禁止することはおすすめしないと言い切っている。(参照:『重複するコンテンツ』)簡単に言うと、自動生成ページはrobots.txtでクロールをブロックし、重複コンテンツはrobots meta tagでインデックス最適化を行うことが必要だ。インデックス最適化に関しては別記事を準備しているので楽しみにしていて欲しい。

3−1−2.広告リンク先ページのrobots.txtを確認しよう

前述の、「広告が検索エンジンの掲載順位に影響を与えないようにするための適切な対処」がこれに該当する。これは広告ASPを運用している会社やプレスリリースの配信会社が行うべきものであり、ほとんどのサイト運営者にとっては必要のないことなのだが念のために解説しておく。

Googleは単なる広告を良質なコンテンツとは考えておらず、広告にクロウラーが回り検索順位に影響を与えることを歓迎していない。

そのため、広告ページに対するリンクは、そのページ対する直リンクではなく以下のようになっていなければならない。※さらにサイトから広告ページに対するリンクには、「rel=”nofollow”」がついている必要がある。

広告に対するrobots.txt

Google Adsense 広告 や Double Click が発行するリンクはこのように自動的に、robots.txtでクロールをブロックしているリダイレクトページが挟まれるものになっている。

しかし、もしこのような仕組みになっていない広告ASPを使うと、最悪の場合、あなたのサイトも、広告ページもペナルティを受ける可能性がある。

残念ながら、このように適切な対処ができていない広告配信会社やプレスリリース配信会社は少なくないのが現状だ。もし、あなたがアフィリエイト広告の掲載、もしくは出稿を考えているなら事前に必ず確認しておこう。

3−2.robots.txtの書き方のルール

クローラーをブロックするべきページが分かったら早速robots.txtを作って行こう。書き方にはいくつかルールがあるのでしっかり抑えておこう。複雑に感じるかもしれないが、慣れてしまえばあっという間に設定できるようになるので安心して欲しい。

3−2−1.robots.txtの作成方法

robots.txtはテキストファイルで作成する。そして、ファイル名は「robots.txt」にしなければならない。

3−2−2.robots.txtの設置場所のルール

作成したrobots.txtは、FTPソフトを使って”http://example.com/robots.txt”のようにルートドメインにアップする。例えば、”http://example.com/blog/robots.txt”のように、ルートドメイン以外の場所に設置しても効果はないので注意しよう。

以下の図は、robots.txtの設置場所に関しての違いを示したものなので参考にして欲しい。

※通常はルートドメインにアップしておけば問題ない

robots.txt設置場所

3−2−3.robots.txtの書き方のルール

robots.txtの基本の形は以下の通りだ。

User-Agent:* Disallow:Sitemap:http://example.com/sitemap.xml

※Sitemapの前は一行空ける

それぞれの要素を一つずつ説明する。(※参考までにGoogleのrobots.txtも見ておこう。)

User-Agent:

これは、どのクローラーの動きを制御するかを指定するものだ。「」は全てのクローラーに指示することを表す。例えば、「User-Agent:Googlebot-image」と記入すると、画像用クローラーのみに指示することができる。Googleクローラーの種類に関しては、『Googleクローラ』を参照しよう。基本は「」で大丈夫だ。

Disallow:

これは、クローラーのアクセスを制御するファイルを指定するものだ。書き方にはいくつかのルールがあるのでご紹介する。

Disallow 行ではブロックするページを指定します。特定の URL またはパターンを入力できます。エントリはスラッシュ(/)で始める必要があります。
  • サイト全体をブロックするには、スラッシュを使用します。
    Disallow: /
  • 特定のディレクトリとその中身をすべてブロックするにはディレクトリ名の後にスラッシュを入力します。
    Disallow: /junk-directory/
  • 特定のページをブロックするには、そのページを指定します。
    Disallow: /private_file.html
  • Google 画像検索から特定の画像を削除するには、次の記述を追加します:
    User-agent: Googlebot-Image Disallow: /images/dogs.jpg
  • Google 画像検索からサイトのすべての画像を削除するには、次のように記述します:
    User-agent: Googlebot-Image Disallow: /
  • 特定の種類のファイル(例: .gif ファイル)をブロックするには、次のように記述します:
    User-agent: Googlebot Disallow: /*.gif$
  • 疑問符(?)を含むすべての URL へのアクセスをブロックするには、次のように記述します(具体的には、ドメイン名の後に文字列と疑問符が続き、その後に文字列が続く URL):
    User-agent: Googlebot Disallow: /*?
  • URL の末尾に一致させるには、$ を使用します。たとえば、.xls で終わるすべての URL をブロックするには、次のように記述します:
    User-agent: Googlebot Disallow: /*.xls$
参照:『robots.txtファイルを使用してページをブロックまたは削除する

Allow:

基本的には使わないが、もしクロールを制御しているディレクトリ下の特定のページだけはクローラーが回るようにしたい場合に使う。例えば、「http://example.com/sample」はブロックするが「http://example.com/sample/important.html」はクロールを許可したいという場合だ。

その場合は以下のように記述すれば良い。(AllowはDisallowよりも優先される。)

Disallow:/sample/ Allow:/sample/important.html

Sitemap:

robots.txtにSitemap:を明記することはGoogleがサポートしている。記述しておくとSitemapを積極的に読むようになってくれるので必ず記載しておこう。

3−2−4.サーバーに設置する前に確認しよう

robots.txtをサーバーに上げる前には、対象となるページだけが制御されるかどうかを必ず確認しよう。Googleのウェブマスターツールでrobots.txtのテストツールが提供されている。ウェブマスターツールにアクセスして、[クロール]の[ブロックされたURL]をクリックしよう。

すると、下図のような画面になる。

robots.txtのテスト

指示通りに入力して、テストを押すと入力したページがブロックされているかどうか、ブロックされるべきでないページがブロックされていないかどうかを確認することができる。

robots.txt確認結果

確認後に問題ないようだったらアップロードしよう。

4.robots.txtに関してよくある6つの疑問

ここでは、robots.txtに関してよく耳にする6つの疑問に対して回答を用意させて頂いた。ぜひ参考にして欲しい。

4−1.robots.txtは絶対に必要か

サイト内の全てのページにクローラーを巡回させたい場合はrobots.txtはなくても良い。しかし、Matt Cuttsはその場合でも、robots.txtがあった方が1%程度は有利だと答えている。もし不安なら「3−2−3.robots.txtの書き方のルール」の基本のファイルをアップしておこう。

4−2.第三者がrobots.txtを見るのを防ぐことは可能か

robots.txtファイルはルートドメインに設置するため見ようと思えば誰でも見ることができてしまう。もし、ユーザーに決して知られてはいけないディレクトリやファイルがあるなら、それはrobots.txt内に書くべきではない。絶対に見られてはいけないページは、サーバー側からパスワードを設定するなどして対処しよう。

4−3.robots.txtの記述にミスがあった場合はどうなるか

クローラーはある程度の融通が効くので、小さなミス程度では大きな悪影響は起きにくい。しかし、Disallowで指定するディレクトリのスペルなどに間違いがあれば、当然、効果は現れないので気付いたらすぐに修正するようにしよう。

4−4.robots.txtで指定したページは検索結果から消えるか

クロールをブロックすると検索順位は下がる傾向にある。しかし例えば、質の高い被リンクが多くついているようなページをrobots.txtでクロールブロックしても、そのページはほとんどの場合検索結果から消えることはない。もし、確実に検索結果から消したい場合は「noindex robots meta tag」タグを使おう。また、noindex robots meta tag と robots.txtは重複させてはいけないということも抑えておこう。

4−5.robots.txtを設定してから効果が現れるまでの期間は

robots.txtを編集したら、すぐに効果が現れるのではなく、まずGoogleがキャッシュをクリアするタイミングを待たなければいけない。それには通常丸1日かかる。また、Googleのクロールとインデックスの仕組みは複雑なので、効果が現れるまでの期間を明言することはできない。

4−6.robots.txtとrobots meta tagの違いは

robots.txtはクロール最適化のために行うものだ。一方、robots meta tagは一つ一つのページのインデックスを最適化するために行うものだ。例えば、重複コンテンツ問題の解決はインデックス最適化で行うものだ。インデックス最適化に関しては近いうちに別記事を準備しているので、少々お待ち頂きたい。クロールやインデックスの解説に関しては、『Googleの検索順位決定の仕組み』を確認しよう。

5.まとめ

弊社は、このバズ部や、ほとんどのクライアント様サイトを見ている中で、SEOはこの数ヶ月で非常に大きく変わったことを実感している。どう変わったかと言うと、本当に検索ユーザーの役に立つコンテンツのみが検索上位に表示されるようになりつつあるということだ。

今後、SEOはますますコンテンツの質の高め合いになっていくことだろう。

そして、もし、コンテンツの質が同程度と判断された場合は、しっかりと内部対策(クロール最適化とインデックス最適化)されているかどうかという小さな差が検索順位を左右するようになるだろう。

その中でも、robots.txtSEO内部対策のほんの一つに過ぎないが覚えておくと必ずプラスになる。

 

EC-CUBEの商品登録CSVにおける画像項目の外部パス指定を可能に

EC-CUBEの商品登録CSVにおける画像項目の外部パス指定を可能に

EC-CUBEの商品登録CSVにおける画像項目の外部パス指定を可能に

手順

IMAGE_SAVE_URLPATH 1.パラメータ設定 → IMAGE_SAVE_URL  → IMAGE_SAVE_URL

URL_DIR . "upload_save_image/“  →  "http://******.jp/ファイル名/”

2.EC-CUBEの商品登録CSVにおける画像項目の外部パス指定を可能に

下記画像すべて下記内容で訂正  →  "EXIST_CHECK",“FILE_EXISTS”, 削除

/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php

上記の229行目付近、ここで必須項目(存在の有無)を確認する “EXIST_CHECK”,“FILE_EXISTS"を削除する。

$this->objFormParam->addParam(“メイン画像”, "main_image", LTEXT_LEN, "KVa", array(“EXIST_CHECK”,“FILE_EXISTS”,“SPTAB_CHECK”,“MAX_LENGTH_CHECK”)); ↓↓↓↓↓↓↓↓↓↓ $this->objFormParam->addParam(“メイン画像”, "main_image", LTEXT_LEN, "KVa", array(“SPTAB_CHECK”,“MAX_LENGTH_CHECK”));

/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php

上記の229行目付近、ここで必須項目(存在の有無)を確認する"EXIST_CHECK" “FILE_EXISTS"を削除する。

$this->objFormParam->addParam(“メイン画像”, “main_image”, LTEXT_LEN, “KVa”, array(“EXIST_CHECK”,“FILE_EXISTS”,“SPTAB_CHECK”,“MAX_LENGTH_CHECK”));

$this->objFormParam->addParam(“メイン画像”, “main_image”, LTEXT_LEN, “KVa”, array(“SPTAB_CHECK”,“MAX_LENGTH_CHECK”));

3.CSVファイルでサイズ入力追加(ラストタグの " はいりません。) ****.jpg" width=“360" height="270

以下すべてオリジナルサイズ指定可能

1.一覧-メイン画像        例 横 360px 縦 270px 2.詳細-メイン画像        例 横 480px 縦 360px 3.詳細-メイン拡大画像     例 横 600px 縦 450px

詳細-サブ画像はパラメーターでも指定可 但しCSVでサイズ指定がない場合は正方形でどちらかが無視される様です。

4.詳細-サブ画像(1) 5.詳細-サブ拡大画像(1) 6.詳細-サブ画像(2) 7.詳細-サブ拡大画像(2) 8.詳細-サブ画像(3) 9.詳細-サブ拡大画像(3) 10.詳細-サブ画像(4) 11.詳細-サブ拡大画像(4) 12.詳細-サブ画像(5) 13.詳細-サブ拡大画像(5)

商品一覧ページ画像 商品詳細画像 商品詳細サブ画像 拡大画像 は表示できます。

resize_image.php?image= IMAGE_SAVE_URL で完成いたしました。

商品一覧・商品詳細・拡大画像・オススメの商品・商品マスタ・カゴの中・オススメ管理すべてOKです。

 

EC-CUBEで会員登録を承認制に改造する方法【2.13系】

EC-CUBEで会員登録を承認制に改造する方法【2.13系】

対会社(B2B)用に審査後に承認して始めて会員にする

B2Bの取引では運営者が会員登録をした会社と取引をするかどうかの審査をする必要があると思います

通常EC-CUBEでは即日会員になれますが、それを運営者側で承認して初めて会員になれるように改造します。

 

1.EC-CUBEのパラメータを変更する

「CUSTOMER_CONFIRM_MAIL」を操作して仮会員登録機能をONにする

EC-CUBEには元々仮会員登録機能が備わっているのでそれを利用する

「ENTRY_LIMIT_HOUR」を操作してテストをしやすくする

EC-CUBEには会員削除後1時間は新規登録できないという機能がある

それをONにしているとテスト作業が困難になってしまうので、製作中はOFFにしておく

 

1.「管理画面>>システム設定>>パラメーター設定」に遷移

  1. 「Ctrl+F」を押してブラウザの検索機能を起動した後「CUSTOMER_CONFIRM_MAIL」を検索

3. 「CUSTOMER_CONFIRM_MAIL」のパラメータを「false」から「true」に変更

  1. 続けて「CUSTOMER_CONFIRM_MAIL」を検索

5. 「ENTRY_LIMIT_HOUR」パラメータを「1」から「0」に変更

  1. ページ一番下の「この内容で登録する」をクリックして設定を保存

2.メールテンプレートを変更

以下を修正

「data/Smarty/templates/[デザインテンプレ名:普通はdefault]/mail_templates/customer_mail.tpl

お客様が本登録を出来ないように、アクティベート用のURLを削除

 
 ※本メールは自動配信メールです。
 等幅フォント(MSゴシック12ポイント、Osaka-等幅など)で
 最適にご覧になれます。
 
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
 ※本メールは、
 <!--{$CONF.shop_name}-->より会員登録を希望された方に
 お送りしています。
 もしお心当たりが無い場合はこのままこのメールを破棄していただ
 ければ会員登録はなされません。
 またその旨 <!--{* 問い合わせ受付メール *}--><!--{$CONF.email02}--> まで
 ご連絡いただければ幸いです。
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
 
<!--{$name01}--> <!--{$name02}--> 様
 
<!--{$CONF.shop_name}-->でございます。
 
この度は会員登録依頼をいただきまして、有り難うございます。
 
現在は仮登録の状態です。
   ~~~~~~
弊社による審査が完了いたしましたら改めてご登録内容ご確認
メールをお送り致します。
 

以下を新規アップロード

転送時に属性などの設定を忘れずに(webサーバにapacheを使っている場合)

属性は:666、所有者:apache、グループ:apache

審査部に、アクティベート用のURLを送信

「data/Smarty/templates/[デザインテンプレ名:普通はdefault]/mail_templates/customer_mail2.tpl

 
 
 ※本メールは自動配信メールです。
 等幅フォント(MSゴシック12ポイント、Osaka-等幅など)で
 最適にご覧になれます。
 
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
 ※本メールは、
 <!--{$CONF.shop_name}-->より会員登録を希望された方に
 お送りしています。
 もしお心当たりが無い場合はこのままこのメールを破棄していただ
 ければ会員登録はなされません。
 またその旨 <!--{* 問い合わせ受付メール *}--><!--{$CONF.email02}--> まで
 ご連絡いただければ幸いです。
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
 
<!--{$CONF.shop_name}--> 審査部へ
 
<!--{$company_name}-->(<!--{$company_name}-->)
<!--{$shop_name}-->(<!--{$shop_name}-->)
<!--{$name01}--> <!--{$name02}--> 様
 
上記会社から会員登録申し込みがありました。
 
審査をして問題ないようであれば以下のURLをクリックして
現在仮登録状態のお客様をアクティベートして下さい。
 
以下をクリックするとお客様の本登録が完了します
必ず審査が完了してから押してください
~~~~~~~~~~~~~~~~~~
 
<!--{$smarty.const.HTTPS_URL}-->regist/<!--{$smarty.const.DIR_INDEX_PATH}-->?mode=regist&id=<!--{$uniqid}--><!--{$etc_value}-->
 

3.メール送信メソッドを変更

メール送信メソッドに追加

「data/class/pages/entry/LC_Page_Entry.php

266行名付近に以下を追加

 
    //アクティベート用メール追加
    $objMailText    = new SC_SiteView_Ex();
        $objMailText->setPage($this);
        $objMailText->assign('CONF', $CONF);
        $objMailText->assign('name01', $arrForm['name01']);
        $objMailText->assign('name02', $arrForm['name02']);
        $objMailText->assign('shop_name', $arrForm['shop_name']);
        $objMailText->assign('shop_kana', $arrForm['shop_kana']);
        $objMailText->assign('company_name', $arrForm['company_name']);
        $objMailText->assign('company_kana', $arrForm['company_kana']);
        $objMailText->assign('uniqid', $uniqid);
        $objMailText->assignobj($this);
 
        $objHelperMail  = new SC_Helper_Mail_Ex();
        $objHelperMail->setPage($this);
 
 
        $subject        = $objHelperMail->sfMakeSubject('【'.$arrForm['company_name'].'】アクティベーションコード');
        $toCustomerMail = $objMailText->fetch('mail_templates/customer_mail2.tpl');
 
 
        $objMail = new SC_SendMail_Ex();
        $objMail->setItem(
            ''                    // 宛先
            , $subject              // サブジェクト
            , $toCustomerMail       // 本文
            , $CONF['email03']      // 配送元アドレス
            , $CONF['shop_name']    // 配送元 名前
            , $CONF['email03']      // reply_to
            , $CONF['email04']      // return_path
            , $CONF['email04']      // Errors_to
            , $CONF['email01']      // Bcc
        );
        // 宛先の設定
        $objMail->setTo($CONF['email01'],
                        $CONF['shop_name'] .' 審査部宛');
 
        $objMail->sendMail();

4.会員登録

会員登録をして確認。

会員登録と同時に、お客様には仮登録のメールが配信され、運営者にはアクティベーションコードのメールが送信されれば成功です。

5.パラメータを元に戻す

1で変更した「ENTRY_LIMIT_HOUR」を「0」から「1」に戻す

 

EC-CUBE内を税抜価格表示にする Eccube 2.13.1

EC-CUBE内を税抜価格表示にする Eccube 2.13.1

EC-CUBEで「税抜」価格を表示したいカスタマイズ消費税変更に伴い、商品一覧に税別価格を表示させたいと考えております。 商品一覧で税別価格を表示する方法

EC-CUBEで税抜き価格にするには、

商品一覧ページ、商品詳細ページ、現在のカゴの中、商品購入/ご入力内容のご確認の4つのページを変更。 商品一覧ページ、商品詳細ページは、

<!--★販売価格★-->
<div class="price">
¥
<!--{strip}-->
<!--{if $arrProduct.price02_min_inctax == $arrProduct.price02_max_inctax}-->
<!--{$arrProduct.price02_min_inctax|number_format}-->
<!--{else}-->
<!--{$arrProduct.price02_min_inctax|number_format}-->~<!--{$arrProduct.price02_max_inctax|number_format}-->
<!--{/if}-->
<!--{/strip}--> 
円(税込)

上記の_inctaxをすべて削除します。

次に現在のカゴの中です、

<td><!--{* 商品名 *}--><strong><!--{$item.productsClass.name|h}--></strong>
    <!--{if $item.productsClass.classcategory_name1 != ""}-->
<div><!--{$item.productsClass.class_name1|h}-->:<!--{$item.productsClass.classcategory_name1|h}--></div>
    <!--{/if}-->
    <!--{if $item.productsClass.classcategory_name2 != ""}-->
<div><!--{$item.productsClass.class_name2|h}-->:<!--{$item.productsClass.classcategory_name2|h}--></div>
    <!--{/if}-->
</td>
<td class="alignR">
    <!--{$item.price|number_format|h}-->円
</td>
<td class="alignC"><!--{$item.quantity|h}-->
    <ul id="quantity_level">
<li><a href="?" onclick="eccube.fnFormModeSubmit('form<!--{$key|h}-->','up','cart_no','<!--{$item.cart_no|h}-->'); return false"><img src="<!--{$TPL_URLPATH|h}-->img/button/btn_plus.jpg" width="16" height="16" alt="+" /></a></li>
<!--{if $item.quantity > 1}-->
    <li><a href="?" onclick="eccube.fnFormModeSubmit('form<!--{$key|h}-->','down','cart_no','<!--{$item.cart_no|h}-->'); return false"><img src="<!--{$TPL_URLPATH|h}-->img/button/btn_minus.jpg" width="16" height="16" alt="-" /></a></li>
<!--{/if}-->
    </ul>
</td>
<td class="alignR"><!--{$item.price*$item.quantity|number_format|h}-->円</td>
    </tr>
<!--{/foreach}-->
<tr>
    <th colspan="5" class="alignR">小計</th>
    <td class="alignR"><!--{$tpl_total_inctax[$key]-$tpl_total_tax[$key]|number_format|h}-->円</td>
</tr>
<tr>
    <th colspan="5" class="alignR">消費税</th>
    <td class="alignR"><!--{$tpl_total_tax[$key]|number_format|h}-->円</td>
</tr>
<tr>
    <th colspan="5" class="alignR">合計</th>
    <td class="alignR"><span class="price"><!--{$arrData[$key].total-$arrData[$key].deliv_fee|number_format|h}-->円</span></td>
</tr>

---------------------------------------------------------------------------
<td><!--{* 商品名 *}--><strong><!--{$item.productsClass.name|h}--></strong>を目印に、
---------------------------------------------------------------------------
<tr>
    <th colspan="5" class="alignR">合計</th>
    <td class="alignR"><span class="price"><!--{$arrData[$key].total-$arrData[$key].deliv_fee|number_format|h}-->円</span></td>
</tr>
ここまでを上記のようにします。

具体的には、
1つ目の円の行の$item.price_inctaxの、_inctaxを削除
2つ目の円の行の$item.total_inctax部分を$item.price*$item.quantityに変更
3つ目の円の行の$tpl_total_inctax[$key]の後ろに-$tpl_total_tax[$key]を追加
<!--{/foreach}-->の下の行から
<tr>
    <th colspan="5" class="alignR">合計</th>
の上の行までの
<tr>
    <th colspan="5" class="alignR">小計</th>
    <td class="alignR"><!--{$tpl_total_inctax[$key]-$tpl_total_tax[$key]|number_format|h}-->円</td>
</tr>
をコピーして
<tr>
    <th colspan="5" class="alignR">合計</th>
の前に貼り付け。

$tpl_total_inctax[$key]-を削除
小計を消費税などに変更

商品購入/ご入力内容のご確認は、現在のカゴの中とほぼ同じですが、
tpl_total_tax[$key]の代わりに、$tpl_total_tax[$cartKey]を利用。


サーバーの、インストールフォルダ/data/classの中にあるSC_Product.php内を変更します。
// 価格
// TODO: ここでprice01,price02を税込みにしてよいのか? _inctax を付けるべき?要検証
$arrClassCats2['price01']
    = strlen($arrProductsClass['price01'])
    ? number_format(SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProductsClass['price01'], $productId, $arrProductsClass['product_class_id']))
    : '';

$arrClassCats2['price02']
    = strlen($arrProductsClass['price02'])
    ? number_format(SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProductsClass['price02'], $productId, $arrProductsClass['product_class_id']))
    : '';
これをコメントアウトして、すぐ下に
$arrClassCats2['price01']
      = strlen($arrProductsClass['price01'])
       ? number_format($arrProductsClass['price01'])
      : '';

        $arrClassCats2['price02']
      = strlen($arrProductsClass['price02'])
      ? number_format($arrProductsClass['price02'])
      : '';
上記を追加します。

EC-CUBEで税別表示をするときの注意点

消費税8%への税率変更が目前です。そして2015年10月には10%へと変更になります。

現在、小売では税込の総額での金額表示が義務付けられているのですが、税率の変更時にはこの総額表示にはいろいろ問題があります。 例えば、リアル店舗の値札であれば、3/31の閉店後に、に5%で計算した値札から8%で計算した値札に付け替えなければならなくなってしまいます。物理的に不可能なケースもあると考えられます。 そこで経過措置として、2013年10月1日から2017年3月31日までの間、税込価格を表示(総額表示)しなくてもよいということになっています。

ECサイトについては、値札の張り替えなどないわけでして、税率のフィールドを変更するだけでよいので、この経過措置がなくてもそれほど問題はないと思います。 とはいえ、3/31の夜に買い物する場合、税込み価格しか表示されていないと、それが5%で計算されているのか8%で計算されえいるのか分かりにくく、画面で表示されている価格より3%高い買い物になっていたりはしないだろうかと不安になったりすることはあるかもしれません。 税抜価格を表示したほうが、混乱が少ないのではないかと考えるサイトオーナーもいらっしゃるようです。 また購入者から見ると今回価格が上がるわけですが、EC業者としては全く値上げをしていないわけですので、値上げをしたと錯覚されるのを恐れて税抜表示にしたいと考えるオーナーも多いようです。9,900円が10,182円になると金額以上に見た目の印象がかなり変わります。

では、税抜表示で表示するにあたって注意するべき点はあるでしょうか。

まず、その表示方法です。これまでは何も表記がなければ税込価格だったわけですから、その価格が税抜であることが分かり易く表示されていなければなりません。 例えば、金額の後ろに(税抜き)とか(税別価格)と表記しなければなりません。ECサイトであれば、税込価格を表示することは簡単なので、できれば税込価格も併記するのが望ましいでしょう。

次に注意したい点は、その表示箇所です。金額表示は商品一覧や商品詳細の画面だけではありません。カートでも表示されますし、購入履歴等でも表示されます。WEBだけでなく、受注メールの文面などにも表示されます。また静的ページとして作成されているランディングページでも対応が必要です。そのため、まずどの画面で使われているのかをピックアップし、対応するかどうかを検討する必要があります。一貫性のない表示はECサイトの信用に悪影響です。

以下、あるサイトの例にとって表示箇所をピックアップしてみました。

◆商品一覧・商品詳細 shosai ブロックのカゴ表示や関連商品やお勧め商品なども、商品の金額を掲載している場合は検討の対象になります。

◆カートおよび購入フロー kago 最も重要なのはカートおよび購入フローです。最終的に購入者が確認する画面は、誤解が起きないように十分検討しておく必要があります。

◆受注メール mail WEBではないので忘れられがちなメール文面の変更。メールも購入者が取引について確認するために重要な情報です。

◆お気に入りなど okini 忘れられそうなお気に入りなど。できれば表示方法が一貫していた方が良いですが、お気に入りはカートなどと比べると重要性が低いです。 購入履歴の詳細は、旧税率で購入されている履歴もありますので、どのような対応にするのか検討の余地があります。

◆ランディングページなど land ランディングページはコンテンツ管理などで静的に作成しているサイトが多いと思います。こちらは、文字通り手動で変更していく必要があります。3/31に一斉に変更するのは困難ですから、税別価格で表示しておくなどの対応は必要になりそうです。

税抜表示にするかどうか検討する際には、表示方法をどうするかと言う点と、上記のような、おそらく10か所以上はある金額表示箇所すべてについて確認するという点に注意しましょう。

 

Eccube会員登録を対会社(B2B)用にカスタマイズする方法 Eccube 2.13系

会員登録を対会社(B2B)用にカスタマイズする方法

ECCUBE 会員登録時の登録項目を減らす。EC-CUBEのデフォルト設定では、会員登録時の入力項目がとても多い。 で、個人的に一番気になるのが「性別」の選択欄。

EC-CUBEで会員登録画面を改造する方法【2.13系】

会員登録を対会社(B2B)用にカスタマイズする方法

EC-CUBEは対カスタマー向けのソフトですので会員登録には「誕生日」などの個人用の項目があるので、EC-CUBEB2B用の卸サイト化するには個人用の項目を削除した後に、業者用の項目を増やしてやる必要があります

ec00005

増やしたい項目と減らしたい項目

増やしたい項目は以下のとおり

  1. 店舗名
  2. 店舗名フリガナ
  3. 会社名フリガナ
  4. 代表者名
  5. 代表者名(フリガナ)
  6. 担当者名
  7. 担当者名(フリガナ)
  8. ホームページURL

削除したい項目は以下のとおり

  1. お名前
  2. お名前(フリガナ)
  3. 性別
  4. 職業
  5. 生年月日

1.データベースに項目を追加

「お名前」「お名前(フリガナ)」と「代表者名」「代表者名(フリガナ)」は同じなので元のDBをそのまま利用しましょう。

 

SQL文にて以下を追加、ポスグレでもMySQLでもいけるはず

 
ALTER TABLE dtb_customer ADD shop_name text; -- 店舗名
ALTER TABLE dtb_customer ADD shop_kana text; -- 店舗名フリガナ
ALTER TABLE dtb_customer ADD company_kana text; -- 会社名フリガナ
ALTER TABLE dtb_customer ADD name03 text; -- 担当者名01
ALTER TABLE dtb_customer ADD name04 text; -- 担当者名02
ALTER TABLE dtb_customer ADD kana03 text; -- 担当者名(フリガナ)01
ALTER TABLE dtb_customer ADD kana04 text; -- 担当者名(フリガナ)02
ALTER TABLE dtb_customer ADD homepage text; -- ホームページURL

2.会員登録画面の編集

ファイルの編集

「data/Smarty/templates/[デザインテンプレ名:普通はdefault]/frontparts/form_personal_input.tpl

私が編集しているのはデザインテンプレなのでHTMLソースは少し異なると思いますが、

以下の要領で増やしたい項目を追加していきます

 
 <dl class="tr">
    <dt>店舗名</dt>
    <dd>
        <!--{assign var=key1 value="`$prefix`shop_name"}-->
        <!--{$arrForm[$key1].value|h}-->
    </dd>
</dl>

 

逆に減らしたい項目は以下のとおりコメントアウトしておきましょう

EC-CUBEコメントアウトは独特なので注意

 
<!--{if false}-->
~ここから非表示~
<dl class="tr">
    <dt>性別<span class="attention">※</span></dt>
    <dd>
        <!--{assign var=key1 value="`$prefix`sex"}-->
        <!--{foreach name=sex_loop from=$arrSex item=item key=key_sex}-->
        <!--{if !$smarty.foreach.sex_loop.first}-->&nbsp;&nbsp;<!--{/if}-->
        <input<!--{if $arrErr[$key1]}--> class="error"<!--{/if}--> type="radio" id="<!--{$key1}--><!--{$key_sex}-->" name="<!--{$key1}-->" value="<!--{$key_sex}-->"<!--{if $arrForm[$key1].value eq $key_sex}--> checked="checked"<!--{/if}--> />
        <label for="<!--{$key1}--><!--{$key_sex}-->"><!--{$item|h}--></label>
        <!--{/foreach}-->
        <!--{if $arrErr[$key1]}-->
            <div class="attention"><!--{$arrErr[$key1]}--></div>
        <!--{/if}-->
    </dd>
</dl>
~ここまで非表示~
<!--{/if}-->

3.会員登録システムの編集

EC-CUBEの2.13系からファイルの場所が変わりました

以下のSC_Helper_Customer.phpを編集します

「/data/class/helper/SC_Helper_Customer.php

386行目付近の「function sfCustomerCommonParam」に以下のパラメータを追加します

 
$objFormParam->addParam('店舗名', $prefix . 'shop_name', STEXT_LEN, 'aKV', array('EXIST_CHECK','NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('店舗名フリガナ', $prefix . 'shop_kana', STEXT_LEN, 'aKV', array('EXIST_CHECK','NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK', 'KANA_CHECK'));
$objFormParam->addParam('会社名フリガナ', $prefix . 'company_kana', STEXT_LEN, 'aKV', array('EXIST_CHECK','NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK', 'KANA_CHECK'));
$objFormParam->addParam('担当者()', $prefix . 'name03', STEXT_LEN, 'aKV', array('NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('担当者()', $prefix . 'name04', STEXT_LEN, 'aKV', array('NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('担当者名(フリガナ・姓)', $prefix . 'kana03', STEXT_LEN, 'aKV', array('NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK', 'KANA_CHECK'));
$objFormParam->addParam('担当者名(フリガナ・名)', $prefix . 'kana04', STEXT_LEN, 'aKV', array('NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK', 'KANA_CHECK'));
$objFormParam->addParam('ホームページURL', $prefix . 'homepage', STEXT_LEN, 'aKV', array('NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));

パラメータのそれぞれの意味は以下の通り

パラメータ 意味
EXIST_CHECK 必須項目にする、空欄の場合はエラー
NO_SPTAB スペース、タブの判定、スペース、タブ、改行は含めた場合はエラー
SPTAB_CHECK スペース、タブの判定、スペース、タブ、改行のみの入力はエラー
MAX_LENGTH_CHECK 最大文字数制限の判定、○字を超えた入力でエラー
KANA_CHECK カタカナ以外を入力したらエラー

そのすぐ下、会員登録共通「function sfCustomerRegisterParam」のいらない項目をコメントアウトします

 
//$objFormParam->addParam('性別', $prefix . 'sex', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
//$objFormParam->addParam('職業', $prefix . 'job', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
// XXX: year,month,dayはprefix付けないのが今のところ共通
//$objFormParam->addParam('年', 'year', 4, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'), '', false);
//$objFormParam->addParam('月', 'month', 2, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'), '', false);
//$objFormParam->addParam('日', 'day', 2, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'), '', false);

ここでひとまず動くかテスト

ここまで編集すると、データベースへの登録までは出来るようになります

テストしてみましょう

ここまででちゃんと動けば後は各種ファイルを調整していくだけです

会員登録時確認画面

「data/Smarty/templates/[デザインテンプレ名:普通はdefault]/frontparts/form_personal_confirm.tpl

マイページ編集画面

2.13系からここは自動で変換されます

マスタ管理画面

「/data/Smarty/templates/default/admin/customer/edit.tpl

「/data/Smarty/templates/default/admin/customer/edit_confirm.tpl

購入画面

「/data/Smarty/templates/[デザインテンプレ名:普通はdefault]/shopping/confirm.tpl

いらない項目を非表示

<!–{if false}–> ~ここから非表示~ <tr> <th>性別<span class=“attention”>※</span></th> <td> <!–{assign var=key1 value=“$prefixsex”}–> <!–{foreach name=sex_loop from=$arrSex item=item key=key_sex}–> <!–{if !$smarty.foreach.sex_loop.first}–>&nbsp;&nbsp;<!–{/if}–> <input<!–{if $arrErr[$key1]}–> class=“error”<!–{/if}–> type=“radio” id=“<!–{$key1}–><!–{$key_sex}–>” name=“<!–{$key1}–>” value=“<!–{$key_sex}–>”<!–{if $arrForm[$key1].value eq $key_sex}–> checked=“checked”<!–{/if}–> /> <label for=“<!–{$key1}–><!–{$key_sex}–>”><!–{$item|h}–></label> <!–{/foreach}–> <!–{if $arrErr[$key1]}–> <div class=“attention”><!–{$arrErr[$key1]}–></div> <!–{/if}–> </td> </tr> ~ここまで非表示~ <!–{/if}–>

<!--{if false}-->
~ここから非表示~
                        <dl class="tr">
                            <dt>性別</dt>
                            <dd><!--{$arrSex[$arrForm.order_sex]|h}--></dd>
                        </dl>
                        <dl class="tr">
                            <dt>職業</dt>
                            <dd><!--{$arrJob[$arrForm.order_job]|default:'(未登録)'|h}--></dd>
                        </dl>
                        <dl class="tr">
                            <dt>生年月日</dt>
                            <dd>
                                <!--{$arrForm.order_birth|regex_replace:"/ .+/":""|regex_replace:"/-/":"/"|default:'(未登録)'|h}-->
                            </dd>
                        </dl>
 
~ここまで非表示~
<!--{/if}-->
 

<!–{if false}–> <tr> <th scope=“row”>性別</th> <td><!–{$arrSex[$arrForm.order_sex]|h}–></td> </tr> <tr> <th scope=“row”>職業</th> <td><!–{$arrJob[$arrForm.order_job]|default:‘(未登録)’|h}–></td> </tr> <tr> <th scope=“row”>生年月日</th> <td> <!–{$arrForm.order_birth|regex_replace:“/ .+/”:“”|regex_replace:“/-/”:“/”|default:‘(未登録)’|h}–> </td> </tr>

<!–{/if}–>

メール送信

「/data/Smarty/templates/default/mail_templates/order_mail.tpl

 

次に、

B2Bの取引では会員に相応しいかどうかの審査をする必要があると思います

通常EC-CUBEでは会員登録と同時に会員になれますが、それを許可して始めて会員になれるように改造します。

 

EC-CUBEで会員登録を承認制に改造する方法【2.13系】

 

Eccube 2.13系 帳票のカスタマイズについて [EC-CUBE 2.12.2] 帳票出力でお届け先情報も出力したい

Eccube 2.13系 帳票のカスタマイズについて [EC-CUBE 2.12.2] 帳票出力でお届け先情報も出力したい

コミュニティにこんな質問がありましたので、できるかなと思い、やってみました。 お買上げ明細書(納品書)にお届け先を明記するには?

eccube 帳票 電話番号を表示 2.13

$text = “電話番号 : ”.$this->arrDisp[‘order_tel01’].“- ”.$this->arrDisp[‘order_tel02’].“- ”.$this->arrDisp[‘order_tel03’]; $this->lfText(27,63,$text, 10); //お届け先TEL

1.data/class/SC_Fpdf.php の 155行目付近に以下を書き加えました。

// 配送先情報
$text = '〒 '.$this->arrDisp['shipping_zip01'].' - '.$this->arrDisp['shipping_zip02'];
$this->lfText(23, 243, $text, 10); //配送先郵便番号
$text = $this->arrPref[$this->arrDisp['shipping_pref']] . $this->arrDisp['shipping_addr01'];
$this->lfText(27, 247, $text, 10); //配送先都道府県+住所1
$this->lfText(27, 251, $this->arrDisp['shipping_addr02'], 10); //配送先住所2
$text = $this->arrDisp['shipping_name01'].' '.$this->arrDisp['shipping_name02'].' 様';
$this->lfText(27, 259, $text, 11); //配送先氏名

IfText メソッドの第一引数がX方向の位置、第二引数がY方向の位置になりますので、 適当に数値を変えて、希望する場所に配置してください。

 

2.data/class/SC_Fpdf.php の 300行目付近にある、lfGetOrderData メソッドを以下のように修正しました。

// 受注データの取得
function lfGetOrderData($order_id) {
    if (SC_Utils_Ex::sfIsInt($order_id)) {
        // DBから受注情報を読み込む
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $where = 'o.order_id = ?';
        $arrRet = $objQuery->select('*', 'dtb_order as o LEFT JOIN dtb_shipping as s ON o.order_id = s.order_id', $where, array($order_id));
        $this->arrDisp = $arrRet[0];
        list($point) = SC_Helper_Customer_Ex::sfGetCustomerPoint($order_id, $arrRet[0]['use_point'], $arrRet[0]['add_point']);
        $this->arrDisp['point'] = $point;

        // 受注詳細データの取得
        $arrRet = $this->lfGetOrderDetail($order_id);
        $arrRet = SC_Utils_Ex::sfSwapArray($arrRet);
        $this->arrDisp = array_merge($this->arrDisp, $arrRet);

        // その他支払い情報を表示
        if ($this->arrDisp['memo02'] != '') {
            $this->arrDisp['payment_info'] = unserialize($this->arrDisp['memo02']);
        }
        $this->arrDisp['payment_type'] = 'お支払い';
    }
}

本来、受注データの取得ということで、dtb_order テーブルしか参照していないのですが、 LEFT JOIN で dtb_shipping も参照し、受注データに関連する配送情報も合わせて取得するようにしました。 こうすれば、$this->arrDisp に配送情報も格納されますので、1番の作業とあわせて、配送先情報が出力可能になります。

 

一番下の備考欄に、配送先情報が出力されるはずですので、帳票PDFを生成して確認してみてください。 あとは出力位置を地道に変えてあげれば良いと思います。

2.13系で、帳票(納品書)

お買い上げ明細 [ご注文日] [注文番号] の下に、お支払方法を表記したいのですが data/class/SC_Fpdf に追記することはわかるのですが どのように追記すればよいのか、教えて下さい。

data/class/SC_Fpdf

  // お届け先情報  $this->SetFont('SJIS', '', 10);  $this->lfText(25, 125, SC_Utils_Ex::sfDispDBDate($this->arrDisp['create_date']), 10); //ご注文日  $this->lfText(25, 135, $this->arrDisp['order_id'], 10); //注文番号

の下に

  $this->lfText(25, 145, $this->arrDisp['payment_method'], 10); //決済方法

を追加します。 後は、 data\Smarty\templates\admin\pdf\nouhinsyo1.pdf を修正します。

Re: 2.13系 帳票のカスタマイズについて

ありがとうございました。

無事、変更することが出来ました。

 

 

livedoorブログのPing設定方法 2015年Ping送信先一覧【最新版】

livedoorブログのPing設定方法 2015年Ping送信先一覧【最新版】

livedoorの管理画面に行ったら、「ブログ設定」をクリックします。*1

livedoorブログのPing設定方法 

次に「投稿設定」2で、Ping設定をします。3

livedoorブログのPing設定方法

livedoorブログのPing設定方法 

設定を反映するには、「設定する」をクリックします。

これ以降記事を投稿するたびに自動的にPing送信されます。

回は、2015年版Ping送信先【最新版】の紹介。 Ping送信先とは何か。解説も踏まえての記事になります。

■初めにPing送信先とは? 簡単に説明するなら自分の更新をお知らせする掲示板の役割をしてくれるようなものです。 貼る掲示板が多いほど自分へのアクセスがきやすくなります。 つまり、これを設定することによりアクセスアップへつながります。

■注意点送信先の重複に注意。 ・こまめな頻度で送信しない。 以上の注意点を守るようにしてください。

送信先一覧

http://api.my.yahoo.co.jp/RPC2 http://blogsearch.google.co.jp/ping/RPC2 http://rpc.reader.livedoor.com/ping http://blog.goo.ne.jp/XMLRPC http://ping.fc2.com/ http://ping.feedburner.com/ http://ping.rss.drecom.jp/ http://www.bloglines.com/ping http://wpdocs.sourceforge.jp/Update_Services http://rpc.pingomatic.com/ http://ping.blogranking.net/ http://ranking.kuruten.jp/ping http://www.blogstyle.jp/ http://www.blogpeople.net/ping/ http://serenebach.net/rep.cgi http://xping.pubsub.com/ping/ http://blogsearch.google.com/ping/RPC2 http://ping.freeblogranking.com/xmlrpc/ http://rpc.weblogs.com/RPC2 http://ping.blo.gs/ http://services.newsgator.com/ngws/xmlrpcping.aspx http://ping.dendou.jp/ http://blog.with2.net/ping.php/ http://blogsearch.google.co.jp/ping/RPC2 http://blogsearch.google.com/ping/RPC2 http://hamham.info/blog/xmlrpc/ http://ping.bloggers.jp/rpc/ http://ping.blogranking.net/ http://ping.cocolog-nifty.com/xmlrpc http://ping.exblog.jp/xmlrpc http://ping.fc2.com/ http://ping.feedburner.com http://ping.freeblogranking.com/xmlrpc/ http://ping.rootblog.com/rpc.php http://ping.rss.drecom.jp/ http://ping.sitecms.net http://pingoo.jp/ping/ http://ranking.kuruten.jp/ping http://rpc.blogrolling.com/pinger/ http://rpc.pingomatic.com/ http://rpc.weblogs.com/RPC2 http://serenebach.net/rep.cgi http://taichistereo.net/xmlrpc/ http://www.bloglines.com/ping http://www.i-learn.jp/ping/

 

送信先設定の仕方 それぞれのブログサービスによって違いますが、大抵編集画面にping送信先とあります。 ライブドアブログの場合は [ブログ設定]→[投稿設定]→[ping送信先]にて設定できます。

 

 

SEOの基本中の基本!「titleタグ」「meta description」「h1タグ」の書き方まとめ

SEOの基本中の基本!「titleタグ」「meta description」「h1タグ」の書き方まとめ

タイトルタグ(title)のSEOに最適な文字数や記入方法

タイトルタグ(title)の記入方法だけでSEOに非常に効果があります。

HTMLソースで表すと<title>と</title>に挟まれてる文字部分を示します。

2012年9月現在、タイトルタグ(title)は、カタカナ・漢字・ローマ字・英語など関係なく検索エンジンに認識され太文字になってる場合があります。(一部の単語のみ)

それだけ検索エンジンが上位に表示させる重要な要素として判断しているのでしょう。

タイトルタグ(title)の文字数

タイトルタグが検索エンジンの検索結果に表示されるのは最大32文字です。

タイトルの文字数が32文字以上になると「…」と表示されていまいます。

なるだけ32文字に近い文字数で、32文字以内にするのがSEOに最適なタイトルの記入方法です。

タイトルタグ(title)にキーワードを入れる

検索エンジンで上位表示したい単語をタイトルに入れると上位表示に有利になります。

上位表示したい単語を入れる場合はタイトルの最初に入れます。

例:「タイトル」で上位表示したい場合「タイトルタグ(title)のSEOに最適な文字数や記入方法」

タイトルタグの最初に上位表示したい単語を記入しています。

又、しつこく何度も同じ単語を記入するのは危険です。2~3回以内にするべきです。

それと、同じ単語が隣接しない事(「タイトルはタイトル」など)も重要です。

タイトルタグ(title)は魅力的に

検索結果にせっかく上位表示しても、タイトルをクリックしてサイト内に訪問してもらわなくては意味がありません。

タイトルの最初に記入する単語は検索窓で入力されるであろう単語を記載。続けて、それを見た人がサイト内に訪問したくなるであろう魅力的な文章にしましょう。

タイトルタグ(title)の最適な記入方法 総合まとめ

  • タイトルの文字数は32文字以内で、なるべく32文字に近い文字数
  • 上位表示したい単語(検索窓で検索される単語)を最初に入れる。(最大2~3回)
  • 検索結果に表示された時に、訪問したくなる魅力的な文章にする。

「title」「meta description」「h1」というあたりのHTMLタグは、SEOでは非常に重要な役割を果たします。

特に「titleに対策キーワードが入っていなければ、SEOはほとんどできない」といっても過言ではないほど、検索エンジンの評価において主要HTMLタグにキーワードが含まれていることは重要です。

SEOに取り組んでいる人であれば「そんなの普通にやってるよ!」と言われるかもしれませんが、それを100点満点のレベルで実装ができているサイトは実は少数というのが現状です。

そこで今回は「title」「meta description」「h1」という3つの主要HTMLタグについて、基礎部分から普段なかなか気がつくことができないポイントまで、総ざらいをしてみたいと思います。

titleタグ、meta description、h1タグの役割と特徴

まずは基礎ということで、それぞれのタグのポイントから見ていきましょう。

なお、titleタグとmeta descriptionは検索結果に表示されますが、その表示文字数には制限があります。見せたい(読ませたい)部分については、その文字数内におさめるようにしましょう。

titleタグ

titleタグは「ページの主題」です。以下のように、検索結果やブラウザのタイトルバーに表示されます。

description検索結果 title

▼特徴

  • 検索エンジン最重要視する要素。ここにキーワードが入っていないとほぼ絶望的
  • 検索結果には最大全角34文字程度が表示され、残りは省略される(GoogleのWeb表示では30文字程度)
  • 検索されたキーワードは検索結果上で太字になる

※検索結果表示は検索エンジンが自動的に調整することもあります

meta description

meta descriptionは検索エンジン向けの「ページの概要説明文」になります。以下のように検索結果に表示されます。

description検索結果 description

▼特徴

  • 検索結果には最大全角120文字程度が表示される(スマホは50文字程度。ただしデバイスなどにより異なる)
  • 検索キーワードは太字になる
  • 順位向上そのものには大きく影響はしない

※検索結果表示は検索エンジンが自動的に調整することもあります

※meta descriptionは各ページで重複するくらいなら設定しないほうがいいでしょう

h1

h1は「大見出し」となります。HTML5以前の記述ルールでは、1ページに設定できるh1タグは1つのみでした。

▼特徴

  • 検索順位に比較的強く影響する。

共通して言えること

3つの主要HTMLタグについて共通していることは、以下の2つになります。

  • 検索にヒットさせたいキーワードを必ず含めること
  • 各ページ、異なる文言を入れること

HTMLタグのチューニングにおいて気をつけるべきポイント

「対策キーワードを入れる」というのは基本中の基本ですが、そのうえで注意すべきポイントがいくつかありますので紹介していきます。

どのページにどのキーワードを入れるかを設計する

単純に「対策キーワードを入れる」といっても、そもそもページごとの対策キーワードがはっきりしていなければ、上手くキーワードを拾っていくことができません。

どのページでどのキーワードを拾うのか? ということをサイト設計時にきちんと把握し、それを主要HTMLタグにも反映させることが重要です。

これを「キーワードマッピング」という場合もあります。

Applivマップ

たとえばヴォラーレの運営する「Appliv」というアプリ検索のサイトでは、アプリの種類ごとにカテゴリが分けられています。

それぞれのカテゴリページで異なる対策キーワードを含むことによって集客をおこなっているのですが、上図のように「無料」というキーワードが含まれるURLとそうでないURLとを別個に設定しています。

通常の「RPG アプリ」のページのtitleタグなどには「無料」は入れず、無料のRPGアプリを集めたページには「無料」をしっかり入れることで、差別化を図ります。

▼参考例:

  • titleタグ:RPG おすすめアプリランキング | iPhone/iPadアプリ – Appliv
  • titleタグ:無料 RPG おすすめアプリランキング | iPhone/iPadアプリ – Appliv

そのページはどんなキーワードを拾い得るのかを考える

たとえば、ノートPCやスピーカーなどを取り扱っている電化製品のECサイトを運用している場合、キーワード対策としては「ノートPC 通販」や「スピーカー 通販」あたりをまずは思い浮かべるのではないでしょうか。

しかし、商品の個別のページでどういったキーワードを拾い得るのか、となるとすぐには思いつかない場合もあります。

キーワードマッピング

上記の例であれば、まずは一般的な「ノートPC 通販」などのキーワードをタグに含めようと考えると思います。

しかし、末端の商品詳細ページでは「dynabook TB85/NG PTB85NG-HHA」というような型番も、流入キーワードとなり得る可能性があります。このように、個別のページごとにキーワードを考えないと、それを見逃してしまうこともあるのです。

HTMLタグ設定の際には、そのページで拾えるキーワードは何があるのかということをページごとに考えていきましょう。

同時に検索されるキーワードもできる限り入れる

よく見かける失敗は対策キーワードを入れてはいるが、不十分というケースです。 画像・動画のアプリを紹介しているページを例に見てみましょう。

Before

titleタグ 画像・動画 アプリ | iPhone/iPadアプリ -Appliv
description 画像・動画アプリのページ。iPhoneアプリ/iPadアプリならAppliv。
h1タグ 画像・動画のiPhoneアプリiPadアプリ

これだけでは、なんだか寂しい感じがしますね。足りないものを加えて改善してみましょう。

After

こちらが改善後の設定です。

titleタグ 画像・動画 おすすめアプリランキング | iPhone/iPadアプリ -Appliv
description 2746個の「画像・動画」iPhone/iPadアプリをおすすめ順にランキング。最新のアプリが見つかる話題順や人気のアプリが探せる定番順などランキングも充実。アプリの使い方や利用シーンなど独自のレビューを見てあなたにピッタリの「画像・動画」アプリを探してみましょう!
h1タグ 画像・動画 iPhoneアプリiPadアプリのおすすめランキング

いろいろ増えましたね!

目につくのは「おすすめ」「ランキング」「話題」「人気」「定番」といったキーワードが入っていることです。

これらは本来知りたい情報である「画像や動画のアプリ」に関する情報とあわせ、検索時に一緒に使われそうなキーワードの追加となります。

つまり同じ情報を探す場合でも異なるキーワードが複合的に検索されるケースがあるため、これらも各HTMLタグの中にしっかりと入れていく必要があるということです。

検索結果の見栄えを考慮し、CTR(クリック率)を上げる

先ほどのdescriptionは改善後に「2746個」という数字や、「探してみましょう!」という呼びかけの言葉が追加されていました。これは検索結果の見栄えを考慮したためです。

ユーザは検索結果で「どのサイトが一番役に立ちそうか」ということを瞬時に判断し、リンクをクリックします。そのため、検索結果上でどのような見栄えになっているか(=どのような印象を与えるか)というのは、実は非常に重要です。

数字を入れる、興味をひく表現をする、検索されるキーワードを含んで太字で表示されるようにする、などの工夫をするようにしましょう。

また、Googleウェブマスターツールの「検索クエリ」という項目では、検索結果上でのクリック率のデータが得られます。これを利用すれば、クリック率向上のPDCAを回していくことも可能です。(詳しくはまた別の機会で)

HTMLタグチューニングでよくある質問

最後にHTMLタグチューニング関連でよく質問される項目についてまとめてみました。ご参照ください。

meta keywordsって入れなくていいの?

meta keywordsはGoogle検索エンジンでサポートされていません。

Yahoo!JAPANはGoogle検索エンジンを使用しているため、日本の検索の9割以上はGoogle検索エンジンのランク付けに従っています。

他の検索エンジンでmeta keywordsを使用するものも存在しますが、苦労して設定しなくてもほぼ問題はないでしょう。

EC-CUBEの管理画面へBasic認証をかける .htaccessでベーシック認証

EC-CUBEの管理画面へBasic認証をかける .htaccessでベーシック認証

EC-CUBEの管理画面へBasic認証をかける .htaccessでベーシック認証

EC-CUBE管理画面のアドレスにhtaccessベーシック認証をかける

EC-CUBEに限らず管理画面のログイン画面は通常誰でもアクセスすることができます。 このご時世少しでもセキュリティを高めたほうが越したことはありません。

そのような場合は http://www.ドメイン名.com/admin/ のアドレス開こうとすると.htaccessの単純なベーシック認証の設定をするだけで2段階認証になりかなりセキュリティは高まります。

万が一EC-CUBEのバグなどで管理画面のID・PWでログインされる状態になったとしてもその前にベーシック認証のログインもクリアしないとアクセスできませんので重要な顧客情報を扱うネットショップには最適なセキュリティ設定の一つですね。

基本的に管理画面は誰でも見えるとアタック掛けられる心配があるので、ベーシック認証を掛けときます。

ベーシック認証ページは、クローラーからアクセスされない(出来ない)為、インデックスされません。

結果、管理画面はベーシック認証とフォーム認証の2段階認証となります。

それでは手順ですが、私の環境では、管理画面のパスは以下になります。

1 /var/www/html/eccube/html/admin

上記ディレクトリまで移動して、

1 2 3 # htpasswd .htpasswd ユーザーID New password: パスワード Re-type new password: パスワードの確認入力

これで.htpasswdファイルが出来ます。

今度は、vi .htaccess と打ってドットエイチティーアクセスファイルを作成します。

内容は、以下です。

1 2 3 4 5 6 7 8 9 AuthType Basic AuthName "ID and password input please" AuthUserFile /var/www/html/eccube/html/admin/.htpasswd AuthGroupFile /dev/null require valid-user   <Files ~ "^.(htpasswd|htaccess)$"> deny from all </Files>

AuthUserFileは先ほど作った.htpasswdファイルのフルパスを指定します。

.htpasswdと.htaccessは全てのアクセスを拒否するように設定します。

(ターミナル上でしか編集付加)

では、確認します。

ベーシック認証画面

ベーシック認証画面

EC-CUBE管理画面

EC-CUBE管理画面ベーシック認証のページが表示され、IDとPASSを入れて管理画面が出ればOK。

.htaccessでベーシック認証 管理画面にアクセス制限を設定する方法

.htaccessでベーシック認証 管理画面にアクセス制限を設定する方法

.htaccessでベーシック認証 管理画面にアクセス制限を設定する方法

BASIC認証とは .htaccessファイルを使って特定のファイルの閲覧を制御する方法の ことで、特定のアドレスからの閲覧を拒否したり、特定の人にだけ閲覧を許可することなどが 簡単にできるものです。

公開前のWebサイトなどに簡単なアクセス制御として、「.htaccess」でベーシック認証を利用している方も多いのではないでしょうか? 簡単に「.htaccess」を作成できる「.htaccess Editor」なんて便利なツールもあるので、ひとつひとつの詳しい意味が分からなくても簡単に認証をかけることができますよね。 …が、何かの時に役立つかもしれないので、この「.htaccess Editor」で作成されたファイルの意味を解説したいと思います。

まず、「.htaccess Editor」で、作成した「.htaccess」に記述する内容が以下です。 ユーザー名、パスワードともにichikawaで作成いたしました。

<Files ~ "^.(htaccess|htpasswd)$">
deny from all
</Files>
AuthUserFile /home/foo/bar/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user 
order deny,allow

まずは1~3行目。

<Files ~ "^.(htaccess|htpasswd)$">  deny from all  </Files>

こちらは、「「.htaccess」「.htpasswd」というファイルは、すべてのアクセス(all)を拒否(deny)する。」という意味です。 次に4行目。

AuthUserFile /home/foo/bar/.htpasswd

これはユーザー名とパスワードが書かれた.htpasswdファイルの絶対パスが記入されています。 .htpasswdファイルは、可能であればドキュメントルートより上の階層(ブラウザからアクセスできない領域)に置くのが望ましいです。

AuthGroupFile /dev/null

こちらはグループごとのアクセスを制御している部分です。 この記述は、グループごとでのアクセス制限はしないという意味です。

AuthName "Please enter your ID and password"

ここで指定された文字列が、認証の際に出てくるダイアログに出てくる文字列です。

AuthType Basic

こちらでベーシック認証を指定しています。

require valid-user

「.htpasswd」にはユーザ名とパスワードが対で書かれていますが、複数のユーザーとそのパスワードを書くことができます。 この「require valid-user 」という指定では、ユーザ名とパスワードが対で合致していればどのユーザ名でもアクセスを許可します。 もし特定のユーザ名だけを許可したい場合には、「require user ○○(例:ichikawa)」として下さい。

order deny,allow

ここでは特に指定していませんが、IPアドレスによる拒否・もしくは特定のIPアドレスのみを許可する場合などに使用します。 たとえば…

order allow,deny  allow from all  deny from 123.45.67.89

「order allow,deny」は、すべてのアクセスを許可(allow)してから、特定のIPアドレス(例:123.45.67.89)を拒否(deny)する書き方です。 反対に、特定のIPアドレスからのアクセスだけを許可する時は以下のように書きます。

order deny,allow  deny from all  allow from 123.45.67.89

上とは順番が逆です。 すべてのアクセスを拒否(deny)してから特定のIPアドレスのみ許可(allow)します。

簡単ですが、以上が「.htaccess」の解説です。より詳しいことを知りたい時はぜひ上記の本などを参照されることをお勧めします。

管理画面にアクセス制限を設定する方法

ECサイトには個人情報が満載です。 なので、今回は手軽にセキュリティを強化する方法をご紹介します。

Basic認証を設定する

ECサイトの動きをちょっと見ればEC-CUBEを使って作ったことはすぐわかりますね。

/admin/などのURLにアクセスするとそのまま管理画面のログインが見えてしまいます。もちろん、そこからIDとパスワードがないと管理画面には入れないのですが、入り口が見えてしまうよりは見えないほうがよいですよね。

そこで、まず紹介するのは、特定の場所へアクセスする際にIDとパスワードを使ってユーザーを認証するBasic認証です。 例えばEC-CUBEの管理画面へアクセスしたときに、認証を要求するようにしたい場合、以下の手順で設定します。

まず、認証するためのアカウントが記述されたファイルを作成します。 コマンドが実行できる環境であれば、html/adminディレクトリに移動して次のようなコマンドを実行します。 ※この場合、カレントディレクトリ(html/admin)に.htpasswdというファイルが作成されます。

# htpasswd -c .htpasswd ユーザーID  New password: パスワード  Re-type new password: パスワードの確認入力

複数のアカウントを作成する場合、2回目以降のhtpasswdコマンドは-cオプションを付けずに実行します。

もし、コマンドが実行できなくても、インターネットで「Basic認証 パスワード生成」などのキーワードで検索すると、 パスワード生成ツールがたくさん紹介されるので、生成した文字列をhtpasswdに記述すればOKです。

次にhtml/adminディレクトリに「.htaccess」というファイルを作成し、作成したファイルに以下の内容を記述します。

AuthType Basic  AuthName 認証時に表示されるメッセージなど  AuthUserFile  .htpasswdファイルの場所  require valid-user

IPアドレス制限を設定する

IDとパスワードが分かれば、どこからでも管理画面へアクセスできてしまうのでは心配、という方にはIPアドレス制限がオススメです。 特定のIPアドレスからしか管理画面へアクセスできないようにしておけば安全性が高くなります。 (プロバイダなどで固定IPを利用できるサービスを利用していない場合は、IPアドレスが変わってしまうのでこの方法は利用できません。)

設定は簡単。 html/adminディレクトリに「.htaccess」というファイルを作成し、以下の内容を記述するだけです。

order deny,allow  deny from all  allow from 127.0.0.1  allow from 許可するIPアドレス  allow from 許可するIPアドレス       :

ここで注意しなければいけないのが、クレジット決済モジュールを利用する場合です。 決済モジュールを利用する場合は、モジュールが通信するためのIPアドレスもアクセスを許可するように設定する必要があります。 クレジット以外にも利用しているモジュールやサービスによっては、その対象となるIPアドレスを許可する必要がありますので、その点はご注意ください。

EC-CUBE プラグインの作り方 最近チェックした商品の履歴プラグイン 作成事例 Amazon

EC-CUBE プラグインの作り方 最近チェックした商品の履歴プラグイン 作成事例

EC-CUBE プラグインの作り方 最近チェックした商品の履歴プラグイン 作成事例 ECCUBE最近チェックした商品の履歴プラグインを作ってみました。

EC-CUBEは万能ではありません

Amazonまで高機能までとはいいませんがEC-CUBEでも同様の買い物サイトが構築できます。 さてEC-CUBEで最近みた商品履歴を表示するにはどうすればよいのでしょうか? amazon

※じつはEC-CUBEの標準機能ではAmazonのような最近みた商品履歴を表示することができません。 しかしEC-CUBEにはプラグイン機能が存在しており、必要な機能を追加することが可能です。 今回は実際にプラグインを作成しながらEC-CUBEのカスタマイズ方法について学んでいきたいとおもいます。

 

まずはつかえるプラグインをさがしてみましょう!

オーナーズストア http://www.ec-cube.net/owners/ ECキューブの拡張プラグインが数多く公開されています。無料のプラグインにも結構いけているものがそろっています。もちろん履歴表示するプラグインも存在しています!! 『最近チェックした商品ブロック』 プラグインのダウンロード人気も高いし、コメント評価も高いし、安心してつかえそうです。 が。。 スマフォには対応していない、他のプラグインと競合するケースがあるというコメントが気になります。 プラグインの作成ってそんなに難しいのでしょうか? 自作してしまえば機能やデザインも自由自在ですし。。 今回はカスタマイズの勉強なのであえて自作していくことにします。

ためしにプラグインをつくってみましょう!

プラグイン機能仕様書をチェックします plugin.pdf hook_point.pdf

 

・作成する仕様をきめます。

要件 仕様
履歴のデータ保存方法 非会員向けを想定しているためDBには記録できませんのでcookieを利用します。
履歴データの保存タイミング 商品詳細を表示したときにcookieに書き込みます。
履歴データの表示方法 最近みた履歴ブロックを作成して任意のページで表示可能とします。 ※cookieに保存しているためガラケーはすておき、PCとスマフォに対応します。
履歴の保存件数の設定 プラグインの設定画面を利用することにします。

 

プラグイン名をきめます。 RecentAccessBlock

 

・ファイル構成をきめます。

フォルダ ファイル名 説明
RecentAccessBlock (メインディレクトリ)
logo.png プラグインアイコン
plugin_info.php プラグイン情報
plugin_update.php プラグインアップデート用クラス.
RecentAccessBlock.php プラグインメインクラス
LC_Page_FrontParts_Bloc_RecentAccessBlock.php プラグイン処理クラス
config.php 設定画面メインクラス
LC_Page_Plugin_RecentAccessBlock_Config.php 設定画面処理クラス
./block (サブディレクトリ)
recent_access.php プラグイン実行クラス
./media (サブディレクトリ)
recent_access.css PC用CSS
recent_access_sp.css スマフォ用CSS
tit_bloc_recent_access.png デザインアイコン
recent_access_config.css 設定画面用CSS
./templates (サブディレクトリ)
header.tpl CSS読み込み切り替え用テンプレート
recent_access.tpl PC用テンプレート
recent_access_sp.tpl スマフォ用テンプレート
config.tpl 設定画面用テンプレート

 

ざっとこんな形でしょうか?

最低限必要なものだけ作成して動かしてみましょう

用意するファイルは2つだけです。 さっそく書いてみましょう。

 

plugin_info.php (プラグイン情報)

 <?php
/**
 * ユーザーが最近見た商品表示プラグインの情報クラス.
 */
class plugin_info{
    /** プラグインコード(必須):プラグインを識別する為キーで、他のプラグインと重複しない一意な値である必要があります */
    static $PLUGIN_CODE       = "RecentAccessBlock";
    /** プラグイン名(必須):EC-CUBE上で表示されるプラグイン名. */
    static $PLUGIN_NAME       = "ユーザーが最近見た商品";
    /** プラグインバージョン(必須):プラグインのバージョン. */
    static $PLUGIN_VERSION    = "0.1";
    /** 対応バージョン(必須):対応するEC-CUBEバージョン. */
    static $COMPLIANT_VERSION = "2.12.3";
    /** 作者(必須):プラグイン作者. */
    static $AUTHOR            = "株式会社フォーミックス";
    /** 説明(必須):プラグインの説明. */
    static $DESCRIPTION       = "ユーザーが最近見た商品を表示するブロックを追加します。(PC/スマホのみ)";
    /** プラグイン作者URL:プラグイン毎に設定出来るURL(説明ページなど) */
    static $AUTHOR_SITE_URL   = "http://www.fourmix.co.jp/";
    /** クラス名(必須):プラグインのクラス(拡張子は含まない) */
    static $CLASS_NAME       = "RecentAccessBlock";
    /** ライセンス */
    static $LICENSE = "LGPL";
}
? > 

 

RecentAccessBlock.php (プラグインメインクラス)

 

<?php
/*
 * 最近見た商品表示プラグイン
 * プラグインのメインクラス
 */
class RecentAccessBlock extends SC_Plugin_Base {
    // コンストラクタ
    public function __construct(array $arrSelfInfo) {
        parent::__construct($arrSelfInfo);
    }
    //インストール
    function install($arrPlugin) {
        //TODOインストール処理の実装
    }
    // アンインストール
    function uninstall($arrPlugin) {
        //TODOアンインストール処理の実装
    }
    //アップデート
    function update($arrPlugin) {
        // nop
    }
    //プラグインを有効
    function enable($arrPlugin) {
        //TODO プラグインを有効にした処理の実装
    }
    //プラグインを無効
    function disable($arrPlugin) {
        //TODO プラグイン停止した処理の実装
    }
    //処理の介入箇所とコールバック関数を設定
    function register(SC_Helper_Plugin $objHelperPlugin) {
        //TODO プラグインインスタンス生成時処理の実装
    }
}
?>

処理については記述していないスケルトンコードの状態ですがインストールは可能です。 ためしにEC-CUBEで動かしてみますが、これらのファイルは 圧縮(tar形式かtar.gz形式)してひとまとめにしないとインストールすることができません。 windows環境であればlhaplusなどでファイルをRecentAccessBlock.tarにかためてください。 出来上がったファイルをEC-CUBE管理サイト:オーナーズストア>プラグイン管理よりプラグイン登録してみましょう。 201304052232_1.png 処理は記述していないので動作はしませんがまずまず順調ですね。 ここで気になるのは。。 圧縮しないとEC-CUBEにインストールできない!!

なにかファイルを変更するたびに圧縮して管理サイトからプラグインをアップデートしないと変更が反映されないのは面倒ですよね。 デバックするにもひと手間となりますし。。 ソースを直接変更しながら実際の挙動を確認しつつ実装をすすめることはできないのでしょうか?

 

ファイル圧縮しないでプラグインを実装するには

プラグインをインストールした時点で、実行ソースは下記フォルダに展開されます。

/data/downloads/plugin/プラグイン名/xxxx.php

 

DBにもデータがinsertされます。 ・dtb_plugin(プラグイン情報) ・dtb_plugin_hookpoint(プラグイン内で利用しているフックポイント) 結局のところ展開されているphpソースが毎回実行されるので、開発中はソースを直接編集しながら作業をすすめて、完成した時点でtar.gz形式にアーカイブするほうが効率的です。 ただしインストール時にDBに追加されたデータや、EC-CUBE独自のキャッシュ情報については、 ソースを変更しただけでは実行結果には反映されてきませんので注意が必要です。 役立ちそうな対応方法を記載しておきます。

項目 役立ちそうな対応方法
フックポイントの定義 メインクラスのregisterメソッドに定義しますが実際にはdtb_plugin_hookpointテーブルのデータが利用される
あまりおすすめできませんが、dtb_plugin_hookpointにデータを追記しdtb_plugin_plugin_id_seqをインクリメントでも対応できます
管理サイトのテンプレート smartyのキャッシュをクリアしないと反映されません
/data/Smarty/templates_c/admin/ 配下のファイルを削除すれば反映されます
mtb_xxxテーブルの値 キャッシュされている/data/cache/mtb_xxx.serialファイルの値を使用する
該当する/data/cache/mtb_xxx.serialファイルを削除 ※mtb_xxxデータ参照時にmtb_xxx.serialファイルが作成されるので削除してもOK
パラメータ設定 mtb_constantsに保存されている値 ※mtb_xxx系のテーブルですが、mtb_constantsだけは特殊なうごきをします。 /data/cache/mtb_constants.phpにキャッシュされいます。
mtb_constantsにデータをinsertしたあとに、管理サイト:システム設定>パラメーター設定画面を開いてそのまま「この内容で登録する」ボタンをクリックでOK

 

まずはプラグイン設定(管理サイト側)から作成していたいと思います。

 

EC-CUBEの管理サイトに機能を追加する

EC-CUBEの管理サイトで設定情報を登録しておく方法はいくつかあります。 実装コストの高い順にならべみました。

種類 操作 実装方法
専用管理画面 新設メニュー 専用管理画面を作成する
プラグイン設定 管理サイト:オーナーズストア>プラグイン設定 主にdtb_pluginテーブルのfree_field1~4を更新
マスターデータ 管理サイト:システム設定>マスターデータ管理 プレフィクス(mtb_)のテーブルを作成(id,Value)
パラメーター設定 管理サイト:システム設定>パラメーター設定 mtb_constantsに設定値を保存(Key,Value)

今回は「プラグイン設定」を作成してみることにします。

プラグイン設定をつくってみる

プラグイン設定は管理サイトのプラグイン管理から表示されるポップ画面となります。 必要な機能実装は、画面表示、データ更新となります。 設定データの保存先はdtb_pluginテーブルを利用することにします。 dtb_pluginテーブルはインストールされているプラグインを管理するためのテーブルでプラグインをインストールした際にレコードが1行追加されま す。フリー項目カラムはプラグインが自由に使える項目として提供されており最大4個まで値を保持できます。(free_field1~4) ※それ以上の設定情報を保存する場合は新規にテーブルを用意するなどが必要となります。 今回はfree_field1を表示商品数に利用します。

 

プラグイン設定で最低限必要なファイルは3つです。 前回おつたえした直接ファイルを更新する方法でやってみましょう。 プラグインインストールで作成されたフォルダ(/data/downloads/plugin/RecentAccessBlock)に 下記3つのファイルを作成します。(※templatesフォルダは作成してください。)

 

templates/config.tplsmartyテンプレート)

<!--{include file="`$smarty.const.TEMPLATE_ADMIN_REALDIR`admin_popup_header.tpl"}-->
<script type="text/javascript">
</script>

<h2><!--{$tpl_subtitle}--></h2>
<!--{foreach from=$arrErr item=error}-->
<p class="red"><!--{$error}--></p>
<!--{/foreach}-->
<form name="form1" id="form1" method="post" action="<!--{$smarty.server.REQUEST_URI|h}-->">
<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
<input type="hidden" name="mode" value="edit">
<table border="0" cellspacing="1" cellpadding="8" summary=" ">
    <tr >
        <td bgcolor="#f3f3f3">表示商品数</td>
        <td>
            <!--{assign var=key value="free_field1"}-->
            <input type="text" name="free_field1" value="<!--{$arrForm[$key]}-->" maxlength="4">
        </td>
    </tr>
</table>

<div class="btn-area">
    <ul>
        <li>
            <a class="btn-action" href="javascript:;" onclick="document.form1.submit();return false;"><span class="btn-next">この内容で登録する</span></a>
        </li>
    </ul>
</div>

</form>
<!--{include file="`$smarty.const.TEMPLATE_ADMIN_REALDIR`admin_popup_footer.tpl"}-->

 

config.php (設定画面メインクラス)

<?php
require_once PLUGIN_UPLOAD_REALDIR .  'RecentAccessBlock/LC_Page_Plugin_RecentAccessBlock_Config.php';
$objPage = new LC_Page_Plugin_RecentAccessBlock_Config();
register_shutdown_function(array($objPage, 'destroy'));
$objPage->init();
$objPage->process();
? > 

 

LC_Page_Plugin_RecentAccessBlock_Config.php (設定画面処理クラス)

 <?php
// {{{ requires
require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';

/**
 * 商品詳細マトリクス表示の設定クラス
 */
class LC_Page_Plugin_RecentAccessBlock_Config extends LC_Page_Admin_Ex {
    
    var $arrForm = array();

    /**
     * 初期化する.
     * @return void
     */
    function init() {
        parent::init();
        $this->tpl_mainpage = PLUGIN_UPLOAD_REALDIR ."RecentAccessBlock/templates/config.tpl";
        $this->tpl_subtitle = "ユーザーが最近見た商品 設定画面";
    }
    /**
     * プロセス.s
     * @return void
     */
    function process() {
        $this->action();
        $this->sendResponse();
    }
    /**
     * Page のアクション.
     * @return void
     */
    function action() {
        $objFormParam = new SC_FormParam_Ex();
        $this->lnitParam($objFormParam);
        $objFormParam->setParam($_POST);
        $objFormParam->convParam();
        
        $arrForm = array();
        
        switch ($this->getMode()) {
        case 'edit':
            $arrForm = $objFormParam->getHashArray();
            $this->arrErr = $objFormParam->checkError();
            // エラーなしの場合にはデータを更新
            if (count($this->arrErr) == 0) {
                // データ更新
                $this->arrErr = $this->updateData($arrForm);
                if (count($this->arrErr) == 0) {
                    $this->tpl_onload = "alert('登録が完了しました。');";
                }
            }
            break;
        default:
            // プラグイン情報を取得.
            $plugin = SC_Plugin_Util_Ex::getPluginByPluginCode("RecentAccessBlock");
            $arrForm['free_field1'] = $plugin['free_field1'];
            break;
        }
        $this->arrForm = $arrForm;
        $this->setTemplate($this->tpl_mainpage);
    }
    /**
     * デストラクタ.
     * @return void
     */
    function destroy() {
        parent::destroy();
    }
    /**
     * パラメーター情報の初期化
     * @param object $objFormParam SC_FormParamインスタンス
     * @return void
     */
    function lnitParam(&$objFormParam) {
        $objFormParam->addParam('表示商品数', 'free_field1', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK', 'ZERO_CHECK'));
    }
    /**
     * プラグイン情報の更新
     * @param type $arrData
     * @return type 
     */
    function updateData($arrData) {
        $arrErr = array();
            
            $objQuery =& SC_Query_Ex::getSingletonInstance();
            $objQuery->begin();
            // UPDATEする値を作成する。
            $sqlval = array();
            $sqlval['free_field1'] = $arrData['free_field1'];
            $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
            $where = "plugin_code = 'RecentAccessBlock'";
            // UPDATEの実行
            $objQuery->update('dtb_plugin', $sqlval, $where);
            
            $result = $objQuery->commit();
        return $arrErr;
    }
}
 ? > 

 

ファイルを配置しただけで動作する

はたしてファイルを配置しただけで動作するのでしょうか? この状態で管理サイトをみてみると。。 ​201304162249_3.png プラグイン設定のリンクが有効になっています!! プラグイン設定リンクをクリックすると。。 201304162249_4.png 設定画面がポップアップ表示されまました。 今回のソースはそんなに難しいものではありませんが、 すこし解説しましょう。

 

/templates/config.tplsmartyテンプレート)の解説

form1の値をsubmitでPOSTするだけのsmartyテンプレートです。

<input type="text" name="free_field1" value="<!--{$arrForm[$key]}-->" maxlength="4">

EC-CUBEのデフォルト設定ではsmartyタグは{}ではなく<–{ }–>となりますが中身は普通のsmartyテンプレートです。 dtb_pluginテーブルを更新するパターンであればほぼこの形でおきまりといえます。 free_field1で利用しているブロックをインクリメントして増やせばfree_field2~4も動作するようになります。 

config.php (設定画面メインクラス)の解説

※このファイルが存在すると、管理サイトでプラグイン設定のリンクが有効になります。 プラグイン設定のリンクがリクエストされたときにどのクラスを実行するかを記述します。

$objPage = new LC_Page_Plugin_RecentAccessBlock_Config();

このサンプルではLC_Page_Plugin_RecentAccessBlock_Config.phpを実行するように記述してあります。 

LC_Page_Plugin_RecentAccessBlock_Config.php (設定画面処理クラス)の解説

クラスはお決まりのパターンとしてLC_Page_Admin_Exを継承してつくります。 各メソッドを簡単に説明すると。。 ■function init() テンプレートファイルの指定と、画面に表示するプラグイン名を記述しています。

$this->tpl_mainpage = PLUGIN_UPLOAD_REALDIR ."RecentAccessBlock/templates/config.tpl";  $this->tpl_subtitle = "ユーザーが最近見た商品 設定画面";

■function process() おきまりのソースです。

$this->action();  $this->sendResponse();

■function action() これもEC-CUBEのおきまりパターンです テンプレートではリクエストパラメータ(mode)に処理内容を指定されています

<input type="hidden" name="mode" value="edit">

POSTされたパラメータはSC_FormParam_Ex返して受け取ってバリデーションを行います。

$objFormParam = new SC_FormParam_Ex();  $this->lnitParam($objFormParam);  $objFormParam->setParam($_POST);  $objFormParam->convParam();

処理を分岐します(search/edit/confirm/confirm_return/complete/deleteなど)

switch ($this->getMode()) {  case 'edit':

■function lnitParam リクエストパラメータをバリデーションするおきまりパターンです。 チェックしたい項目をキー毎に指定しています。

$objFormParam->addParam('表示商品数', 'free_field1', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK', 'ZERO_CHECK'));

※指定可能なバリデーションの種類や内容は/data/class/SC_CheckError.phpをのぞいてみてください。 ■function updateData($arrData) データを更新しています。

$objQuery =& SC_Query_Ex::getSingletonInstance();   :  $objQuery->update('dtb_plugin', $sqlval, $where);

SQLを記述せずにクエリーを実行しています。

実は今回のソースにEC-CUBEの基本処理パターンがすべて含まれていた!

作成した設定画面は要件も単純で実装したコードも簡単ですが基本動作はひととり存在しております。 もっと難しい処理を実装する場合も、このパターンを応用すれば対応することができます。

1.アクセスのあったURLからクラスに処理を引き渡す。
config.phpで処理クラスLC_系クラスをNewしてコールする
2.パラメータの値を取得する
処理クラスのactionメソッドでSC_FormParam_Exを利用してとりだします。
3.パラメータの値の入力チェックを行う
処理クラスにlnitParamメソッドを作成してaddParamでチェックする内容を定義します。
4.パラメータにより処理を分岐する
処理クラスのactionメソッドでmodeを利用して分岐
5.DBの値を参照・更新する
各SC系のクラスを利用できます
機能 SC系クラス名
プラグイン設定情報 SC_Plugin_Util_Ex
マスタ系テーブル(mtb_xx) SC_DB_MasterData_Ex
商品系テーブル SC_Product_Ex
会員系テーブル SC_Customer_Ex
SQLを独自に生成して実行する場合はSC_Query_Exなどが利用できます。
6.テンプレートを表示する
LC_Pageクラスに$this->xxxxxで設定した変数を smartyテンプレートから呼び出す
 

まとめ

オープンソースは言葉のとおり処理内容が公開されています。 今回の基本パターンを手掛かりにして実際のEC-CUBEの処理クラスを眺めてみてください。 /data/class/SC系のクラス /data/class/pages/機能名フォルダ/LC系のクラス おのずとカスタマイズの方法がみえてきますよ。

次回は処理のフックに挑戦します。。