weight-based-shipping-for-woocommerceのデータを直にいじってみる

##愚痴と前書き

WordPressでショップを展開できるWooCommerceというものがありまして、手軽なのとプラグインで多言語化しやすいということで、なんだかんだ文句はあれど使っています。そのプラグインの中でもWeight Based Shipping for WooCommerce（以下wbs）というプラグインがややアレな出来ながらも、細かく重量と送付方法で送料価格設定ができて重宝しておりました。

ところが新型コロナウィルスのおかげで現在海外郵便が壊滅的な有様で、ほとんどの国に荷物を送ることができなくなってしまいました。まさかアメリカにまで送れない状況が生じるとは思ってもみませんでした。それにより設定を大幅に変更する羽目になったのですが、あとで元に戻すときにバックアップ取れない仕様なので嫌だなぁということで、DBをいじったりデータを覗いてみた検証結果（中途半端）を自分のメモ書き代わりに書いておきます。

##前書きはこのぐらいにして

設定は`wp_options`テーブル（WPプラグインの掃きだめと化してないか？）の`wbs_config`というレコード値にあります。作者は設定の直書きはできないとか言っていましたが、DBの1レコード変更でできましたよ。ただ、1行のながーい文字列をトリム/パースしているので、きちんと意味をわかって変更しないと大変なことになる予感はあります。ローカルのWPで試してみるなどした方がよいでしょう。1行の文字列で設定が書いてあるので、末尾に展開したものを例として書いておきます。

中身は{}の前後で改行してみると構造が分かりやすいです。;で1要素の区切りです。基本はアルファベット1文字：数字：ダブルクォーテーションでくくった文字列または配列で1つの要素を表し、パラメータを表す要素と値を表す要素の2つ1組で意味単位となります。アルファベットの意味は下の通り。数字は続く文字列の長さを表します（ブールは0/1のみで後の文字列はなし）。

* a - array（配列）続く数字が配列の要素数を、{}内に要素が入ります。
* b - bool（ブーリアン）0=false, 1=true
* s - string（文字列）続く数字が文字長（UTF-8のバイト数）を表します
* i - int（整数）続く数字がパラメータの値を表します。序数を表すときも。

例：`s:5:"title";s:27:"ゆうメール（150g以内）";`
⇒パラメータ名"title"; "ゆうメール（150g以内）"という意味。S:の後の数字は文字の長さ（UTF-8のバイト数）。

```php5
//wp_optionsテーブルのwbs_configの中身を改行したもの

//配列要素が2つあるの意味
a:2:{
	// プラグイン自体のenabledと思われる。b:1はTrueの意味
	s:7:"enabled"; b:1; 
	//　設定したルールの数が配列の要素数。0から始まるので60個になる。
	//　ここを手書きで間違えるとプラグインのインターフェース上は初期化状態に
	s:5:"rules"; a:59:{
		///　rules[0]
		///　iは配置順。きっとインクリメントでユニーク。
		i:0; a:4:{
			//　0[0] ルールの名称等のメタ情報
			s:4:"meta"; a:4:{
				s:5:"title"; s:27:"ゆうメール(150g以内)"; 
				s:5:"label"; s:27:"ゆうメール(150g以内)"; 
				s:7:"enabled"; b:1; 
				s:7:"taxable"; b:0;
			}
			//　0[1] ルールの条件がこの中身
			s:10:"conditions"; a:3:{
				///conditions[0] 配送先の条件
				s:11:"destination"; a:2:{
					//　? - All allowed: 配送先は条件に含まない
					//　include - Specific: locationに指定した場所を含む
					//　exclude - All except specific: locationにした場所を含まない
					s:4:"mode"; s:7:"include"; 
					s:9:"locations"; a:2:{
						///アルファベット2文字が国名。国コードについては後述。
						i:0; s:2:"JP";
						///アルファベット2文字の後の数字が県や州
						i:1; s:7:"JP:JP03";
					}
				}
				//conditions[1] 重量の条件。詳しくはプラグイン設定のGUIを見てください
				s:6:"weight"; a:1:{
					s:5:"range"; a:4:{
						s:3:"min"; i:1; 
						s:3:"max"; i:150; 
						s:12:"minInclusive"; b:1; 
						s:12:"maxInclusive"; b:0;
					}
				}
				//conditions[2] 
				s:8:"subtotal"; a:3:{
					s:5:"range"; a:4:{
						s:3:"min"; i:0; 
						s:3:"max"; N; 
						s:12:"minInclusive"; b:1; 
						s:12:"maxInclusive"; b:0;
					}
					s:3:"tax"; b:0; 
					s:8:"discount"; b:0;
				}
			}
			//　0[2] 料金の計算条件
			s:7:"charges"; a:3:{
				// 基本の料金。下は180円ということになってますが、
				// 通貨はWooCommerceの設定に準ずるようです。
				s:4:"base"; i:180; 
				s:6:"weight"; a:3:{
					s:4:"cost"; i:0; 
					s:4:"step"; i:1; 
					s:4:"skip"; i:0;
				}
				s:15:"shippingClasses"; a:0:{
				}
			}
			//　0[3] えーっとなんだっけ……
			s:9:"modifiers"; a:1:{
				s:5:"clamp"; a:1:{
					s:5:"range"; a:2:{
						s:3:"min"; N; 
						s:3:"max"; N;
					}
				}
			}
		}

		// i:1は2番目のルールという意味を表す（開始は0）
		// rules[1]
		i:1; a:4:{
			s:4:"meta"; a:4:{
				s:5:"title"; s:28:"ゆうパック(60サイズ)"; 
				s:5:"label"; s:73:"ゆうパック(60サイズ、東北・関東・信越・北陸・東海)";
				s:7:"enabled"; b:1; 
				s:7:"taxable"; b:0;
			}

.....のように続く
```

パースはPHPでやっているようです。これをGUIで入力しようとすると、外国、例えばヨーロッパを入力すると、日本語で検索してクリックして選んで……ということを何十か国もやるわけですよ。えらい手間がかかりますね。

国・地域を表すコードはこちらです。公式のGitHubよりこちらが見やすくまとまってます。
[WooCommerce Country Codes & State Codes List](http://creatingawebstore.com/woocommerce-country-codes-and-state-codes-list.html)

中身をもっと解析することがあったら書き足すかもしれません。本当、大したことのないネタですみません。