3
2

【WordPress】Advanced Custom Fields(ACF)で絵文字が保存できない問題を解決する

Last updated at Posted at 2024-03-12

日頃からお世話になっているACFで、絵文字利用前提のフィールドを作ったものの、なぜか保存できない問題に遭遇。
調べてみると、どうやら update_post_metaupdate_user_meta でデータベースの postmeta テーブルに絵文字を含むデータを保存しようとすると、絵文字部分が空白に変換されてしまう模様。

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

解決策としては参考リンクにある通り、保存前にデータをHTML数値エンティティにエンコードし、読み込む際はデコードする、という手順を踏めば良い模様。
ACFのドキュメントを読むと、値の保存前に何かする用のフックと、値の読み込み後に何かする用のフックが、それぞれ用意されていた。
詳細はそれぞれ公式ドキュメントを参照。

acf/update_valuehttps://www.advancedcustomfields.com/resources/acf-update_value/
acf/load_valuehttps://www.advancedcustomfields.com/resources/acf-load_value/

実装

以下を function.php に追記。
参考元リンクのコードを、ほとんどそのまま流用させていただきました。(ありがとうございます)

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.phpadd_filter( 'run_wptexturize', '__return_false' ); を追記すればOK!」

みたいな言説のページがちょくちょく出てくるのだけど、これは the_title() とか the_content() とかで使われているWordPressの自動文字変換機能を全部無効にするやつ。
テキストの無害化なども wptexturize で担っているので、あまり考え無しに使って良いものではないと思われる。
というかそもそもとして、これでは絵文字含みのデータが保存されない問題は一切解決しない。

WordPressに関しては、こういう「検索上位に出てくるけど実際は解決しない」という罠情報が結構あるので気をつけたい…
(最初これに引っかかって1時間ぐらい悩んでた)

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2