【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更新を紹介させていただきました。

つくりばのことが気になりましたか?

つくりばは、ココトモ・未来地図を自社で10年以上運営してきた知見をもとに、相談・コミュニティの開発と運営を支援しています。いきなりのご相談でなくて大丈夫です。まずは私たちの実績や考え方をご覧ください。

つくりばについて知る

← WordPressの一覧へ戻る

Webサービスの課題を、まずは無料相談で整理しませんか。

既存サービスの改善、新規立ち上げ、運用サポート、予算内での優先順位づけなど、今の状況に合わせてじっくりお話を伺います。まだ形になっていない段階のご相談も大丈夫です。

  • videocamオンライン対応
  • forum課題整理だけでも歓迎
  • payments概算費用の目安がわかる
無料相談を申し込む