2021.05.09

【WordPress】絵文字を含むカスタムフィールド値のDB更新について

こんにちは、webエンジニアのゾノ( @ozonosho )です。

本日はWordPressのカスタムフィールドで絵文字を扱う際の小ネタです。
※検証不十分の可能性ありますw

カスタムフィールドの値を更新する関数でおなじみの「update_post_meta」や「update_user_meta」。

実は、この関数を利用して絵文字を含むデータをpostmetaテーブルに挿入しようとすると、失敗して空白値が入ります。
(絵文字対応しているバージョンのDBでも更新できません)

これはなかなか困った仕様で、、、ユーザーが自由にプロフィール登録できるようなサイトの場合、絵文字入力されると更新できないんですよね。

そんなわけでどうするのかというと、

  1. 絵文字を含むデータをDBに入れる場合には絵文字を一度エンコードして実体参照にしてから保存する
  2. 「get_post_meta」や「get_user_meta」で取り出す時にはデコードして絵文字を復元する

というステップを踏む必要があります。

①絵文字のエンコード

絵文字のエンコードは下記のような関数を挟めばOKです。

function emoji_encode($str) {
  return mb_encode_numericentity($str, [0x10000, 0x10FFFF, 0, 0xFFFFFF], 'UTF-8');
}

※使ったことないけれどWordPressにも「wp_encode_emoji」という絵文字エンコード用関数があるみたいです

DBの更新は受け取った送信情報を元におこなう場合がほとんどで、
・送信情報はエスケープする必要がある
・↑のほうの記事で紹介したようにWPはリクエスト情報にシングルクォーテーション等があると勝手にバックスラッシュを挿入してしまう
という2つの事情があるため、

最終的には、

$name = (isset($_POST['name'])) ? stripslashes(esc_attr(emoji_encode($_POST['name'])));
update_user_meta(ユーザーID, 'name', $name) : '';

みたいにして情報を更新してあげます。

これで絵文字を含む文字列をエスケープして保存できます。

②絵文字のデコード

絵文字のデコードは下記のような関数を挟めばOKです。

function emoji_decode($str) {
  return mb_decode_numericentity($str, [0x10000, 0x10FFFF, 0, 0xFFFFFF], 'UTF-8');
}

出力する時には、エスケープ処理も加えて下記のように利用します。

$name = get_user_meta(ユーザーID, 'name', true);
echo esc_attr(emoji_decode($name));

 
上記①②の対応を加えることで、WordPressの関数を利用したまま絵文字入りのカスタムフィールド値を保存・取得できるようになります。

おわりに

以上、今回の記事では絵文字を含むカスタムフィールド値のDB更新を紹介させていただきました。

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

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

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

→この記事を読む