2022.02.21

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のカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む