Magentoの柔軟さを支える重要な要素であり、導入・構築時に頭を悩ませる原因でもあるもの。それが商品属性です。
Magentoをベースにしたネットショップを構築する際は、取り扱う商品がどんな情報を持っているかをよく考えながら、商品属性の定義を行っていく必要があります。

ところが、商品属性の定義の際には注意をしておかないと思わぬ落とし穴にハマることがあります。
このエントリでは商品属性に格納できる文字数について解説し、取れる対策について説明します。

文字数を気にしなければならない商品属性とは

Magentoの標準で利用できる属性のうち、いくつかの属性はデータベース側の定義としてvarchar型(可変長文字列)とtext型を利用するものがあります。どの属性がどのデータ型を使うかは以下のとおりです。

属性の種類データ型
テキストフィールド varchar(255)
テキストエリア text
日付 datetime
Yes/No int(11)
複数選択 varchar(255)
ドロップダウン int(11)
価格 decimal(12,4)
メディアイメージ varchar(255)
Fixed Product Tax decimal(12,4)

それぞれの属性には表の通り指定のデータ型が設定されるようになっていて、varchar型は255文字、intつまり整数型は11桁というようにデータサイズがあらかじめ決められています。
まずここに注意が必要です。

varchar型を使う属性で気をつけること

varchar型を使う属性は定義上255文字までの文字列を格納できます。
商品名やちょっとした名称などであれば255文字も入力することはないと思いますが、テキストフィールドの場合はHTMLタグを含めることもできます。
この場合、ちょっとしたHTMLを書いていくと255文字を簡単にオーバーしてしまう可能性があるので注意が必要です。

複数選択の場合は、1つの属性に対して1つ以上のオプションを選ぶことができます。
選んだオプションの内容はオプションIDという数字の形で格納されていくのですが、選んだ値はカンマ(,)で区切られて格納されていきます。
さらにオプションIDはシステム内部で自動採番されるようになっているため、複数選択やドロップダウンを多用していると、オプションIDの桁数が3桁4桁というように増えていきます。そこに複数選択の場合は必要なだけオプションを選ぶことができるわけですから、油断していると255文字を超える場合が出てくる可能性があります。

text型を使う属性で気をつけること

text型を使う属性はテキストフィールドだけなのですが、テキストフィールドは商品説明文のようなまとまった文量のテキストを扱うために使用される事が多い属性です。
必然的にHTMLを含んだ形で利用されることも多いため、Magento側としても十分なデータサイズをあらかじめ確保してくれています。
ところが、この文字数は65,535文字という制限があります。

MySQLには4つのtext型があり、短いものは255文字。最も長いものは4,294,967,295文字のテキストを格納できます。
text型というのは短い方から数えて2つ目のデータ型です。

65,535文字というのは一見すると相当な文字数のように感じるのですが、HTML文書として見た場合は、タグの定義だけでなく、画像のURLやハイパーリンクの文字数も含んでくるため、場合によっては足りなくなるおそれが出てきます。

超過した文字はどうなるのか

もし、属性のデータを格納するフィールドの文字数を格納しようとするデータが超過してしまったらどうなるでしょう?
答えは「超過分が消えてなくなる」です。
そのため、データベースの列定義よりも長い文字列のデータを登録しようとすると、超過したぶんのデータだけが消えてなくなります。
なので頑張って書いたテキストが超過した分だけごっそり消えるという切ない思いをすることになります。

文字数の超過を防ぐには

というわけで、文字数が超過するとデータが消えるわけですから、文字数の超過はできる限り避ける必要があります。
それにはどうしたら良いのでしょうか?

1つのテキストエリア属性を複数に分割する

やはり長いテキストを格納することそのものが問題になるため、適当な単位で1つのテキストエリア属性の内容を複数のテキストエリア属性に分割します。
あるいはある程度固定で利用するものであれば、静的ブロックなどに切り出して、テンプレート上で呼び出すという方法が使えます。
こうしておけば管理も楽になります。 

HTMLタグによる装飾やインデントなどをできる限り排除する

最近のHTMLマークアップではほぼ当たり前になってきていますが、HTMLマークアップで装飾を指定するような記述を避けることで、文字数を削ることができます。
また、タグのインデントの文字もカウントされるので、インデントや改行文字も取り除くことで文字数を削ることができます。

こういう地道な努力でどうにもならない時は活路が開けることもあります。

まとめ

  • 商品属性が利用するデータベースのデータ型に注意する
  • テキストフィールドやテキストエリア、複数選択の文字数に気をつける
  • 格納できる文字数がフィールドの文字数をオーバーすると、オーバーした分は消える
  • 文字数がオーバーしそうなときは属性を分割するか、静的ブロックに切り分ける
  • 不要なタグや改行、インデントなどを取り除いて文字数を少しでも減らす