カテゴリー: CMS・ブログツール

【EC-CUBE】ページのURLを静的HTMLで表示するには。

SEOに有効な静的HTML表示にPHPページのURLを変換する。

1)/products/以下に「.htaccess」ファイルを設定する。
mod_rerwiteを利用するので、「.htaccess」ファイルに、下記のように記述して、FTPで/productsディレクトリにアップロードする。

RewriteBase /products ←これは、要らないサーバもある。
RewriteEngine on
RewriteRule ^detail([0-9]+).html+ products/detail.php?product_id=$1 [L]
RewriteRule ^list([0-9]+).html+ products/list.php?category_id=$1 [L]

http://www.ドメイン/products/detail.php?product_id=○○

というURLを

http://www.ドメイン/products/detail○○.html

と変換して、どちらのURLでアクセスしても、同じページが表示されるようにすることになる。
変換されるほうのURLの表示を変えたいときは、RewriteRuleの表記を変えればOK。

例えば、
RewriteRule detail\/([0-9]+)\/? products/detail.php?product_id=$1[L]
とすれば、「products/detail/○○」となる。

この時点で、
http://www.ドメイン/products/detail○○.html

でアクセスできていれば、ここまでの設定はOK。
もし、アクセスできなければ、サーバの設定を確認するなどで、対応。

2)EC-CUBEの管理画面で、システム管理メニューからパラメータを変更する。

半分より下あたりに「DETAIL_P_HTML」という文字列があるので探す。検索したほうが早い;

「DETAIL_P_HTML」の初期値で入っている、
『URL_DIR . “products/detail.php?product_id=”』 を
『URL_DIR . “products/detail”』 に書き換える。

3)テンプレ変更

/data/Smarty/templates/default/list.tpl
/data/Smarty/templates/default/bloc/best5.tpl
/data/Smarty/templates/default/bloc/category.tpl
/data/Smarty/templates/default/mypage/history.tpl

を変更するけれど、管理画面から変更できるので、確認しながらやるべし。
ローカルでファイルを修正してFTPでアップロードする場合は、アップロードしてから、デザイン管理→テンプレート設定の画面で、「この内容で登録する」ボタンをクリックして、テンプレを適用させること。(FTPアップロードしただけでは反映されない)

該当する「/products/detail.php?product_id=」の部分を、「details」に変え、その変数の後ろに「.html」を挿入し。DETAIL_P_HTMLが入っているところも同じように変更。さらに、「/products/list.php?category_id=」も。検索しながら良く見て変更すること。

デザイン管理→ページ詳細設定→「商品一覧ページ」を選択してコードを表示させ、修正。
DETAIL_P_HTMLのある場所を検索して、その後ろの変数の後に、「.html」を追加。3箇所ある。(ver.2.3rc1の場合、L97,L117,L130)

終わったら、「商品詳細ページ」も同様に修正。4箇所ある。(同じく、L324,L330,L349,L359)

<a href=”<!–{$smarty.const.DETAIL_P_HTML}–><!–{$arrProducts[cnt].product_id}–>.html“ ←追加。

「MYページ」はなぜか管理画面から変更できないので、後で直接ファイルを変更してFTPで上げる。

/data/Smarty/templates/default/mypage/history.php
(ver.2.3rc1の場合、L53)

<td><a href=”<!–{$smarty.const.URL_DIR}–>products/detail.php?product_id=<!–{$arrDisp.product_id[cnt]}–>”>

これを↓↓↓へ。

<td><a href=”<!–{$smarty.const.URL_DIR}–>products/detail<!–{$arrDisp.product_id[cnt]}–>.html”>

次に、管理画面のブロック編集へ。「カテゴリ」ブロックを開く。(ver.2.3rc1の場合、L46)

最後に、「オススメ商品」も。4箇所修正。(ver.2.3rc1の場合、L37,L42,L68,73)

<a href=”<!–{$smarty.const.URL_DIR}–>products/detail.php?product_id=<!–{$arrBestProducts[cnt].product_id}–>”>

これを↓↓↓へ。

<a href=”<!–{$smarty.const.URL_DIR}–>products/detail<!–{$arrBestProducts[cnt].product_id}–>.html”>

以上。その他に同様の修正が必要なところがあれば(バージョンアップなどで発生する可能性もあるし。)同じように修正する。

<a href=”<!–{$smarty.const.URL_DIR}–>products/list.php?category_id=<!–{$arrTree[cnt].category_id}–>”

これを↓↓↓へ。

<a href=”<!–{$smarty.const.URL_DIR}–>products/list<!–{$arrTree[cnt].category_id}–>.html”
 

さらに。

4)GOOGLEサイトマップ用のXMLサイトマップも静的HTMLで出力したい。

GOOGLEサイトマップ用のXMLサイトマップ作成機能についても、同じように、「.html」の拡張子で表示させたい。

/data/class/pages/LC_Page_Sitemap.php

の240行目。(Ver.2.3RC1の場合。)

            // :TODO: カテゴリの最終更新日を取得できるようにする
            $page = array(“url” => SITE_URL . sprintf(“%sproducts/list.php?category_id=%d”, $mobile, $result[$i][‘category_id’])); ←これを変更。
            $arrRet[$i] = $page;

↓↓↓このように変更。

            // :TODO: カテゴリの最終更新日を取得できるようにする
            $page = array(“url” => SITE_URL . sprintf(“%sproducts/list%d.html“, $mobile, $result[$i][‘category_id’]));
            $arrRet[$i] = $page;

264行目も。

        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’]);

↓↓↓このように変更。

        for ($i = 0; $i < count($result); $i++) {
            $page = array(“url” => SITE_URL. sprintf(“%sproducts/detail%d.html“, $mobile, $result[$i][‘product_id’]),
                          “update_date” => $result[$i][‘update_date’]);

これで、GOOGLE用のXMLサイトマップもリンクは全て静的URLで書き出されます。

10ブログエンジン レビュー

http://www.smashingmagazine.com/2008/08/29/10-weblog-engines-reviewed/

  1. WordPress
  2. Movable Type
  3. ExpressionEngine
  4. Drupal
  5. Textpattern
  6. Joomla
  7. b2evolution
  8. Nucleus
  9. Serendipity
  10. Mephisto blogging software

一部B豚個人の意見も入ってるので、純粋に上記サイトの翻訳ではない旨、ご了承ください。m(^^)m

最近、ブログエンジンにも色んなものがあって、選ぶだけでも大変。(といっても、ブログ用途だけなら、やることも限られているので、要は、デザインのカスタマイズが簡単かどうか、っていうのが一番気になるところだったりするんだけど。)

どういうポイントでエンジンを選ぶか。

  • プログラミング言語
  • 機能 -例えば、機能の拡張性。柔軟な構造か、使いたいプラグインが豊富にあるか、デザインの自由度は高いか、場合によっては、他のブログからの乗り換え機能がないと厳しいこともあると思う。
  • コミュニティの大きさ -カスタマイズやバグの対応など、不明なことが出たときに、相談できるコミュニティやサポート体制がしっかりしていれば、対応も早く、重大なセキュリティバグなどへもいち早く気づくことができる。
  • プログラムの成熟度 -上記とも関連するけれど、あまり新しいシステムは、バグやセキュリティホールなどの洗い出しが充分ではなく、不安定だったりすることも多い。
  • 拡張性 -これはプログラムの、というよりは、コンテンツの拡張性。ずら~と同じテーマのコンテンツが徐々に増えていくようなサイトでは、エントリーを増やしていけるブログシステムは使いやすいし、カテゴライズするときの柔軟性なども気になってくると思う。

WORDPRESS

オープンソース。インストールも簡単で、PHP+テンプレートベースなので、デザインのカスタマイズもしやすい。もっとも広く使用され、世界的にも業界標準となっている。コミュニティによる議論や開発活動も活発。アップデートも簡単であったり、デザインテーマやプラグインも豊富に入手できることから、人気が高い。

MOVABLE TYPE

WORDPRESSが台頭してくるまでは業界標準であった。有償になったことから、だんだん利用者離れしてきて、プラグインなども、どこかの企業が有償で提供するものが多くなってきたので、だんだんユーザーが離れてったのね;一応、オープンソースプロジェクトも走っていて(MOTSという)こちらは、無料で使える、実は。機能も製品版と変わらない、というか、オープンソースな分、リリースはやい。日本では、金儲け主義に走って、海外では標準でなくても国内ではまだまだ売れるので、オープンソースプログラムへのリンクは隠されてる。情報も少ないというセコさ。(この辺、気に入らんわ~。)
多くの独自変数が用意されていて、ずっと使っている開発者には、使いやすい。でも、初めまして、で使い始めるには、この多い変数を覚えるだけでも大変なのですよ;その辺もMTがユーザー離れを起こしてる原因だわね。最近オープンソースのほうで再び活発になりつつあるけど、また、それで良くなったら、有償にするんじゃないのぉ?と疑ってしまう、私の中では前科持ちっぽい位置づけ;
複数ブログを一度に管理できたりするところは○。

EXPRESSIONENGINE

有償であるが、個人ユースは、無料。(MTといっしょ。)しっかりしたエンジン。複数ブログを、サブドメインや別ドメインで運用できるらしく、これって製品発売したらその都度ブログ立ち上げてるような企業では欲しい機能かも。運用更新もしやすいように工夫されていて、カテゴリーを選んで、テンプレートを選んで、って企業向けには、使いやすいかもしれないですね。

DRUPAL

最近人気ですね、これ。コミュニティ向けブログってところでしょうか。
フォーラムも比較的活発ですし、色々なプラグインも出てきています。日本語のものはまだ少ないですが、海外のものでは、ECサイトモジュールなんかもあります。つまり、ブログ書いて、その画面から買い物させるってことが比較的簡単にできる。ソフトウエア単体では非常にシンプルで、モジュールを追加していくとリッチな機能のサイトもできるよ、ってことでしょうね。

TEXTPATTERN

非常にシンプルな構造で、WYSIWYGエディタもない。基本構造は、EXPRESSIONENGINEと似ている。(らしい)

JOOMLA

DRUPALと似ている。DRUPALがコミュニティサイト向けの方向へシフトしているのに対し、JOOMLAはEコマース向けになってきている。ブログを作成するということでは、両者にほとんど違いはない。JOOMLAでもブログを書いて、その中から購入動線を作る、ということができる。

B2EVOLUTION

バックエンドは初心者にも分かりやすい。コミュニティがいまひとつ活発でないので、プラグインや機能に成長性がないのが残念。

NUCLEUS

こっちは、日本国内で結構使われてきてますね。1つには、マルチブログ、複数の寄稿者によるマルチユーザーブログとしての機能の強さにあるんじゃないでしょうか。機能面では、B2EVOLUTIONとも似ており、さらに有用なプラグインやテーマが揃っている。
制作会社で、複数担当者のいるような中・大規模企業向けにこちらを使うことが増えている。

SERENDIPITY

初心者に優しい。プラグインの自動バージョンアップ機能(WORDPRESSにもありますね)やライブラリなども豊富。マルチブログ機能はないが、複数ユーザーの投稿はサポートしている。

MEPHISTO

ビルトインのテンプレートエディタがあったり、操作が、より直感的。

このサイト内でも、その他にも色々紹介されているけど、いっぱいあるものだなぁ、と。。。

【EC-CUBE】カテゴリーごとのキャプションをつけるカスタマイズ

システムバージョン:2.3.0-rc1

その1)データベースのdtb_categoryテーブルに2つのフィールドを追加する
カテゴリーの情報が登録されているdtb_categoryテーブルに新しく2つのフィールドを追加する。

category_info(タイプ: text デフォルト: NULL 空の値:OK(NULL))
info_flg(タイプ: smallint デフォルト: 0 空の値:OK(NULL))

 ↓こんな風に追加して、

 ↓こうなっていればOK。

その2)「/data/Smarty/templates/default/admin/products/category.tpl」 を編集
管理画面のテンプレートにカテゴリの説明文を記述できる textarea と親カテゴリの説明文を引き継ぐかどうかのチェックボックスを追記。一番上のカテゴリの場合は親カテゴリは無い為、親カテゴリの説明文を引き継ぐかどうかのチェックボックスを表示しない。

128行目あたり(Ver.2.3の場合)に2行追加。

<input type=”text” name=”category_name” value=”<!–{$arrForm.category_name|escape}–>” size=”30″ class=”box30″ maxlength=”<!–{$smarty.const.STEXT_LEN}–>”/>
<input type=”submit” name=”button” value=”登録”/><span class=”red10″> (上限<!–{$smarty.const.STEXT_LEN}–>文字)</span>

↑この記述の下に、↓これを2行追加。

<textarea name=”category_info” cols=”80″ rows=”10″><!–{$arrForm.category_info|escape}–></textarea><br />

<!–{if $arrForm.level != “1” && $arrForm.parent_category_id != “0”}–><input type=”checkbox” name=”info_flg” id=”info_flg” value=”1″<!–{if $arrForm.info_flg}–> checked=”checked”<!–{/if}–> /><label for=”info_flg” class=”fs10n”>親カテゴリの説明を引き継ぐ</label>  <!–{/if}–><span class=”red10″> (上限<!–{$smarty.const.LLTEXT_LEN}–>文字)</span>

その3)「/data/class/pages/admin/ products/LC_Page_Admin_Products_Category.php」に追記

110行目あたり(Ver.2.3の場合)。

// 編集項目のカテゴリ名をDBより取得する。
//$oquery = new SC_Query(); ←コメントアウト
$this->objQuery = new SC_Query();
$where = “category_id = ?”;

//$cat_name = $this->oquery->get(“dtb_category”, “category_name”, $where, array($_POST[‘category_id’])); ←コメントアウト
$col = “category_name, category_info, info_flg, level”;
$arrRet = $this->objQuery->select($col, “dtb_category”, $where, array($_POST[‘category_id’]));

// 入力項目にカテゴリ名を入力する。
//$this->arrForm[‘category_name’] = $cat_name; ←コメントアウト
$this->arrForm[‘category_name’] = $arrRet[0][‘category_name’];
$this->arrForm[‘category_info’] = $arrRet[0][‘category_info’];
$this->arrForm[‘info_flg’] = $arrRet[0][‘info_flg’];
$this->arrForm[‘level’] = $arrRet[0][‘level’];
// POSTデータを引き継ぐ
$this->arrForm[‘category_id’] = $_POST[‘category_id’];

256行目あたり(Ver.2.3の場合)。

// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval[‘create_date’] = “Now()”;
$sqlval[‘update_date’] = “Now()”;
$sqlval[‘creator_id’] = $_SESSION[‘member_id’];
$sqlval[‘parent_category_id’] = $parent_category_id;
$sqlval[‘rank’] = $rank;
$sqlval[‘level’] = $level;

//追記:親の設定を引き継ぐ時
if($sqlval[‘info_flg’]) {
$sqlval[‘category_info’] = lfGetParentInfo($objQuery, $parent_category_id);
}

// INSERTの実行
$objQuery->insert(“dtb_category”, $sqlval);

$objQuery->commit(); // トランザクションの終了
}

// カテゴリの編集
function lfUpdateCat($category_id) {
$objQuery = new SC_Query();
// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval[‘update_date’] = “Now()”;
$where = “category_id = ?”;

//追記:親の設定を引き継ぐ時
if($sqlval[‘info_flg’]) {
$parent_category_id = $objQuery->get(“dtb_category”, “parent_category_id”, $where, array($category_id));
$sqlval[‘category_info’] = lfGetParentInfo($objQuery, $parent_category_id);
}
$objQuery->update(“dtb_category”, $sqlval, $where, array($category_id));
}

// カテゴリの取得
function lfGetCat($parent_category_id) {
$objQuery = new SC_Query();

if($parent_category_id == “”) {
$parent_category_id = ‘0’;
}

$col = “category_id, category_name, level, rank”;
$where = “del_flg = 0 AND parent_category_id = ?”;
$objQuery->setoption(“ORDER BY rank DESC”);
$arrRet = $objQuery->select($col, “dtb_category”, $where, array($parent_category_id));
return $arrRet;
}

/* パラメータ情報の初期化 */
function lfInitParam() {
$this->objFormParam->addParam(“カテゴリ名”, “category_name”, STEXT_LEN, “KVa”, array(“EXIST_CHECK”,”SPTAB_CHECK”,”MAX_LENGTH_CHECK”));

$this->objFormParam->addParam(“カテゴリ情報”, “category_info”, LLTEXT_LEN, “KVa”, array(“SPTAB_CHECK”,”MAX_LENGTH_CHECK”));
$this->objFormParam->addParam(“引き継ぎ”, “info_flg”, INT_LEN, “n”, array(“MAX_LENGTH_CHECK”, “NUM_CHECK”));

} ←これ、注意!「}」は、追加していない。
/* 入力内容のチェック */
function lfCheckError($array)

コードの一番最後(Ver.2.3の場合)に追加。

// 追記:親のcategory_infoを取得する
function lfGetParentInfo($objQuery, $pid) {
$where = “category_id = ?”;
$parent_info = $objQuery->get(“dtb_category”, “category_info”, $where, array($pid));
return $parent_info;
}

その4)/data/class/pages/products/LC_Page_Products_List.php」に追記

115行目あたり(Ver.2.3の場合)。

// タイトル編集
$tpl_subtitle = “”;
if ($_GET[‘mode’] == ‘search’) {
$tpl_subtitle = “検索結果”;
} elseif (empty($arrCategory_id[0])) {
$tpl_subtitle = “全商品”;
} else {
$tpl_subtitle = $objDb->sfGetCatCombName($arrCategory_id[0]);
}

$objQuery = new SC_Query();
$this->category_info = $objQuery->get(“dtb_category”, “category_info”, “category_id = ?”, $arrCategory_id);
$count = $objQuery->count(“dtb_best_products”, “category_id = ?”, $arrCategory_id);

// 以下の条件でBEST商品を表示する
// ・BEST最大数の商品が登録されている。
// ・カテゴリIDがルートIDである。

その5)管理画面から商品一覧ページのメインを修正(list.tpl)

管理画面の「デザイン管理」→「ページ詳細設定」→「商品一覧ページ」で、任意の場所に以下のタグを挿入。

<!–{if $category_info}–><!–{$category_info}–><!–{/if}–>

参考:http://www.eccube-school.jp/products/detail43.html

注意! 「パンくずリストの実装」とアタる!
このやり方(http://www.eccube-school.jp/products/detail43.html)で、LC_Page_Products_List_Ex.phpを使用する場合、下記のパンくず実装を先にやるか、LC_Page_Products_List_Ex.phpで実装しないと、マージされないので注意!すること。
https://bton.papalabs.net/?p=340

この記事のほうは、_EXを使ってないので、同じファイルを上書きすることになるから問題ない。でも、本来は、_EXを使ったほうがいいので、_EXのファイルのほうで、パンくずを実装するってほうがいいのかも。

【EC-CUBE】インストールするときに階層変更が必要だ。

EC-CUBEのデフォルトの階層は、①/data/と②/html/になってるけど、普通にこんな構成で、インストール(つまり、ブラウザでユーザがアクセスしてくるときのトップページの階層が1つ下がる)って、ないってばさ。

普通、「http://www.example.com/」でアクセスしてほしいっしょ。トップページは。「http://www.example.com/html/」じゃないでしょ。(^^;

これ、本当意味分からんわ~。運用の問題?まあいいけど。。。

とりあえず、これは、いつでも、ワタクシ的構造的にキモイので、トップページはルートで表示させたいと思います。(ん?それか、普通にデフォルトのまま、インストールしても、インストールのときの設定で変えられるんかなぁ~?いやいや、ルート階層にindex.phpがなかったら、そもそもアクセスできないしネ。やっぱ、だめだよね。うんうん。)

WEBサーバにアップロードする前に、/html/の中の「define.php」を書き換えます。

<?php
/** HTMLディレクトリからのDATAディレクトリの相対パス */
define(“HTML2DATA_DIR”, “/data/”); ←ここ①

/** DATA ディレクトリから HTML ディレクトリの相対パス */
define(“DATA_DIR2HTML”, “../”); ←あと、ここも②

/*
 * Local variables:
 * coding: utf-8
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */
?>

そんで、FTPでアップロードするとき、/html/の中身は、全部ドキュメントルート(=一番上の階層)にアップロードして、その中に/data/をアップロードするようにする。

これで、普通にユーザーが、ドメインでアクセスしたら、そこがトップページとして表示されるようになる。

【EC-CUBE】郵便番号DB登録のアップデートは。

新しい住所&郵便番号のDBが郵便局サイトでアップされても、そのままだと、登録時にシステムエラーが出まくる。

  1. KEN_ALL.CSVをダウンロードしてきて、秀丸で開く。
  2. 半角カタカナ→全角カタカナに変換。「~」→「-」に変換。他にもおかしな記号があったら変換。(但し、めっちゃ時間掛かるので、放置して。)
  3. 変換できたら、UTF-8で保存する。
  4. FTPでサーバにつないで、EC-CUBEの「/data/downloads/」のなかに、データを入れ替える。
  5. 後はひたすら管理画面で、登録ボタンを繰り返して押していく。これも結構時間が掛かる。ブラウザの画面が白いままで、読み込みアイコンがぐるぐるやってるときは、大体正常に進んでいる。進んでいるかどうか不審に思うときは、PhpMyAdmin(DBがMySQLのときはね)で、DBの一番下のテーブル(mtb_zip)のレコード数が、増えているかどうか確認して、増えていれば、少しずつだけど登録が進んでいる。最終的には、12万ちょい。

もし、新規のインストールではなくて、一回登録したあとで、アップデートするなら、先に登録されているDBのデータは、PhpMyAdminで値だけ一回削除してしまってから、登録したほうがいい。変なの残ってると困るから。