日頃からお世話になっているACFで、絵文字利用前提のフィールドを作ったものの、なぜか保存できない問題に遭遇。
調べてみると、どうやら update_post_meta
や update_user_meta
でデータベースの postmeta
テーブルに絵文字を含むデータを保存しようとすると、絵文字部分が空白に変換されてしまう模様。
参考:【WordPress】絵文字を含むカスタムフィールド値のDB更新について
解決策としては参考リンクにある通り、保存前にデータをHTML数値エンティティにエンコードし、読み込む際はデコードする、という手順を踏めば良い模様。
ACFのドキュメントを読むと、値の保存前に何かする用のフックと、値の読み込み後に何かする用のフックが、それぞれ用意されていた。
詳細はそれぞれ公式ドキュメントを参照。
acf/update_value
:https://www.advancedcustomfields.com/resources/acf-update_value/
acf/load_value
:https://www.advancedcustomfields.com/resources/acf-load_value/
実装
以下を function.php
に追記。
参考元リンクのコードを、ほとんどそのまま流用させていただきました。(ありがとうございます)
// 保存前にエンコード
function my_acf_update_value( $value ) {
return stripslashes(esc_attr(mb_encode_numericentity($value, [0x10000, 0x10FFFF, 0, 0xFFFFFF], 'UTF-8')));
}
// 読み込み後にデコード
function my_acf_load_value( $value ) {
return esc_attr(mb_decode_numericentity($value, [0x10000, 0x10FFFF, 0, 0xFFFFFF], 'UTF-8'));
}
// acf/update_value、acf/load_valueともに
// 修飾子が使えるので、必要なフィールドタイプを指定する。
add_filter('acf/update_value/type=text', 'my_acf_update_value', 10, 1);
add_filter('acf/load_value/type=text', 'my_acf_load_value', 10, 1);
// フィールド名もしくはフィールドキーも修飾子として使用可能
// add_filter('acf/update_value/name=example_text', 'my_acf_update_value', 10, 1);
// add_filter('acf/update_value/key=field_123abcf', 'my_acf_update_value', 10, 1);
ちなみに
『ACF 絵文字 保存できない』とかでググると、
「function.php
に add_filter( 'run_wptexturize', '__return_false' );
を追記すればOK!」
みたいな言説のページがちょくちょく出てくるのだけど、これは the_title()
とか the_content()
とかで使われているWordPressの自動文字変換機能を全部無効にするやつ。
テキストの無害化なども wptexturize
で担っているので、あまり考え無しに使って良いものではないと思われる。
というかそもそもとして、これでは絵文字含みのデータが保存されない問題は一切解決しない。
WordPressに関しては、こういう「検索上位に出てくるけど実際は解決しない」という罠情報が結構あるので気をつけたい…
(最初これに引っかかって1時間ぐらい悩んでた)