【WordPress】絵文字を含むカスタムフィールド値のDB更新について
こんにちは、webエンジニアのゾノ( @ozonosho )です。
本日はWordPressのカスタムフィールドで絵文字を扱う際の小ネタです。
※検証不十分の可能性ありますw
カスタムフィールドの値を更新する関数でおなじみの「update_post_meta」や「update_user_meta」。
実は、この関数を利用して絵文字を含むデータをpostmetaテーブルに挿入しようとすると、失敗して空白値が入ります。
(絵文字対応しているバージョンのDBでも更新できません)
これはなかなか困った仕様で、、、ユーザーが自由にプロフィール登録できるようなサイトの場合、絵文字入力されると更新できないんですよね。
そんなわけでどうするのかというと、
- 絵文字を含むデータをDBに入れる場合には絵文字を一度エンコードして実体参照にしてから保存する
- 「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のカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。