Magentoでサイトを運営しようとする場合、都道府県あるいは州などの地域名称は重要なデータのひとつです。
一見すると、そのデータがなくても支障がないように思えるのですが、正しくセットアップできていないと後々大きな問題に発展することがあります。 

Magentoの都道府県データはどこに入っているのか

原則としてMagentoの都道府県データは、データベースの

  • directory_country_region
  • directory_country_region_name

という2つのテーブルに入っています。
これ以外にも「directory_country」には国のデータが入っています。

directory_country_regionには様々な国の都道府県、州名などが入っています。
そして、directory_country_region_nameには各言語に対応するdirectory_country_regionの名称が入っているのです。

都道府県データがある場合とない場合に起きること 

まず、Magentoの標準状態では、日本の都道府県データは入っていません。
標準状態で入っているのはアメリカやカナダ、ドイツ、フランスといった一部の国だけです。
それ以外の国のデータは入っていないわけで、必要に応じて構築時に入れてやる必要があります。

さて、都道府県データがある場合とない場合とでMagentoは挙動が変わります。
例えば、日本の都道府県データが入っている場合は、図のように都道府県はプルダウンとして表示されます。

都道府県がある場合

ところがデータを持っていない国を選択すると、都道府県入力はテキストボックスになります。

都道府県がない場合

このように都道府県データの有無によってMagento上では表示される入力項目の形式が変わります。すべての国のデータを登録することは非常に大変ですが、少なくとも配送先として選択できる国についてはデータを構築時あるいは配送対象にする前に登録しておく必要があるでしょう。

データがある場合

都道府県データのある国の場合は、入力方法がプルダウンからの選択になり、Magentoは選ばれたオプションの値を住所データに登録します。
この値はdirectory_country_regionテーブルのregion_idを使用します。
つまりユーザーからの入力はすべてプルダウンからの選択になるため、入力内容のブレが生じることはなくなります。 

データがない場合

都道府県データがない国の場合は、Magentoはユーザーから入力されたテキストの内容をそのまま格納します。誤字やタイプミスなどの入力間違いについては一切考慮しません。
(チェック処理を自前実装すれば話は別ですが)
この場合、ユーザーによる入力内容のブレが生じることがあり、後日名寄せやデータ分析をする際に障害になる恐れがあります。

配送料金表を登録する際に都道府県データは必須

標準のMagentoに付属している配送料金表(Table Rates)は配送元の住所と配送先の住所、それに重量または購入金額を元にした配送料金の算出を行うことができる配送方法です。

標準で付属する機能なので、特段のカスタマイズがなくても利用できるのですが、この料金表を登録する際には都道府県データが必須になります。
というのも、配送データの登録や取り出しを担当している「Mage_Shipping_Model_Resource_Carrier_Tablerate」の「_getImportRow」には以下のように書かれています。

protected function _getImportRow($row, $rowNumber = 0)
    {
〜中略〜
        // validate region
        if ($countryId != '0' && isset($this->_importRegions[$countryId][$row[1]])) {
            $regionId = $this->_importRegions[$countryId][$row[1]];
        } elseif ($row[1] == '*' || $row[1] == '') {
            $regionId = 0;
        } else {
            $this->_importErrors[] = Mage::helper('shipping')->__('Invalid Region/State "%s" in the Row #%s.', $row[1], $rowNumber);
            return false;
        }
〜中略〜
    }

この$this->_importRegionsのデータはどこから来ているかというと、同じクラスの中にある「_loadDirectoryRegions」でデータベースから読み込んでいることがわかります。

    protected function _loadDirectoryRegions()
    {
        if (!is_null($this->_importRegions)) {
            return $this;
        }

        $this->_importRegions = array();

        /** @var $collection Mage_Directory_Model_Resource_Region_Collection */
        $collection = Mage::getResourceModel('directory/region_collection');
        foreach ($collection->getData() as $row) {
            $this->_importRegions[$row['country_id']][$row['code']] = (int)$row['region_id'];
        }

        return $this;
    }

つまり、配送料金表にデータをインポートしたい場合は、都道府県データが必ず必要になるというわけです。これがないとそもそもインポートができません。

つまり配送料金表を使いたいのであれば、その配送先の国の都道府県データを先に登録しておけ、ということです。 

Magentoと外部システムを連携する場合の注意

MagentoにはAPIが用意されています。
XML-RPC/SOAPかRESTによるAPIが用意されていて、それぞれ仕様も公開されています。このAPIを利用する外部システムとMagentoを連携させる場合、directory_country_regionとdirectory_country_region_nameテーブルのデータが正しい状態になっていることが求められます。 

まとめ

  • Magentoの都道府県データは、directory_country_regionとdirectory_country_region_nameテーブルに入っている
  • 言語に合わせた表記を使いたいのであれば、directory_country_region_nameテーブルにデータを登録する
  • もしデータが登録されていない場合は、ユーザーの入力がそのままデータベースに入ってしまうので注意が必要
  • 配送料金表を使う場合は、事前に利用する国の都道府県データをdirectory_country_regionとdirectory_country_region_nameテーブルに登録しておく
  • directory_country_regionとdirectory_country_region_nameテーブルのデータが正しくない場合、外部システムとの連携に支障をきたす事がある