WordPressでカスタムフィールドに登録するデータをまとめて圧縮してみる
こんにちは、webエンジニアのゾノ( @ozonosho )です。
今回の記事ではWordPressでカスタムフィールドに登録するデータをまとめて圧縮する方法をご紹介いたします。
大量データを扱っているクライアント企業より「なるべくDBのデータを増やしたくない…」という相談を受けて実装してみました。
たとえばユーザー情報をカスタムフィールドに登録する場合、「年齢」「職業」「趣味」などはそれぞれ1レコードずつ保存されますが、これらをまとめたうえで圧縮して1レコードに保存しちゃおうって話です。
カスタムフィールドに登録するデータをまとめて圧縮する方法
下記のようにPHPのgzcompress関数を利用して圧縮します。
//まとめて圧縮したいカスタムフィールドを配列として格納
$user_meta = array();
$user_meta['user_age'] = {年齢};
$user_meta['user_jop'] = {職業};
$user_meta['user_hobby'] = {趣味};
//圧縮(画像等のバイナリデータに対応させるにはbase64_encodeも追加)
$user_meta_zip = base64_encode(gzcompress(serialize($user_meta)));
//保存
update_user_meta({ユーザーID}, {カスタムフィールド名}, $user_meta_zip);
シリアライズ化するだけでも1レコードに保存できますが、保存するデータ量を削減するために圧縮したうえで保存します。
取り出すときは逆の手順で取り出します。
$user_meta_zip = get_user_meta({ユーザーID}, {カスタムフィールド名}, true);
//解凍
$user_meta = ($user_meta) ? unserialize(gzuncompress(base64_decode($user_meta))) : null;
$user_age = ($user_meta && array_key_exists('user_age', $user_meta)) ? $user_meta['user_age'] : '';
$user_job = ($user_meta && array_key_exists('user_job', $user_meta)) ? $user_meta['user_job'] : '';
$user_hobby = ($user_meta && array_key_exists('user_hobby', $user_meta)) ? $user_meta['user_hobby'] : '';
たとえば「1ユーザーにつきカスタムフィールドが100項目」「ユーザー数が10,000人」というようなサイトの場合、そのままカスタムフィールドを保存するとwp_user_metaテーブルには100万レコードのデータが発生しますが、この方法を利用すれば約99%のデータ圧縮が可能です。
圧縮しないほうが良いケース
今回ご紹介したカスタムフィールドの圧縮は、検索機能で使いたい項目には利用しないほうが良いです。
検索機能は一般的にSQLでDBから一致するものを取得しますが、圧縮したデータはDB内に圧縮文字列として格納されるのでSQLで取り出すことができません。
そのため検索機能に使わない項目を対象に利用してください。
たとえば、僕がこの機能を実際したのは下記のようなケースでした。
- 圧縮を活かせるケース
-
ユーザーがイベント情報を投稿できるサイト。
イベント情報にはカスタムフィールド項目が100程度あり、毎回ユーザーに投稿内容を入力させるのは大変なのでユーザーごとによく投稿する内容をテンプレートとして登録&読込できるようにしてあげたい。
このようなケースでは、(よく投稿する内容をカスタムフィールドに登録するときに)圧縮して1レコードにすることでデータ量を節約することができます。
おわりに
以上、今回の記事でWordPressでカスタムフィールドに登録するデータをまとめて圧縮する方法を紹介させていただきました。
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。