Khi soạn thảo nội dung bài viết có chứa ký tự biểu cảm Emoji, một số trường hợp khi lưu vào bài viết sẽ gặp lỗi “Updating failed. Could not update post in the database” hoặc với tiếng Việt thì là “Cập nhật thất bài. Không thể lưu bài viết vào cơ sở dữ liệu“.

Nguyên nhân là do một số máy chủ Web Hosting/VPS cài đặt phần mềm MySQL/MariaDB sử dụng bảng mã utf8 nên Emoji sử dụng Unicode 4 byte sẽ không thể lưu vào. Vì vậy giải pháp ở đây là sẽ cần chuyển các biểu tượng emoji thành các ký tự HTML để có thể lưu vào cơ sở dữ liệu.
Để khắc phục, bạn sẽ cần chèn đoạn mã dưới đây vào tập tin functions.php của theme đang sử dụng trong WordPress:
function( $data, $postarr ) {
if ( ! empty( $data['post_content'] ) ) {
$data['post_content'] = wp_encode_emoji( $data['post_content'] );
}
return $data;
}
Sau khi chèn đoạn trên, nội dung bài viết có chứa emoji sẽ sẽ được lưu bình thường.
Nếu bạn muốn có thể chèn emoji vào nhiều nơi hơn thì sử dụng đoạn mã dưới đây:
// Mã hóa emoji trước khi lưu bài viết hoặc trang
add_filter( 'wp_insert_post_data', function( $data, $postarr ) {
if ( ! empty( $data['post_content'] ) ) {
$data['post_content'] = wp_encode_emoji( $data['post_content'] );
}
if ( ! empty( $data['post_title'] ) ) {
$data['post_title'] = wp_encode_emoji( $data['post_title'] );
}
if ( ! empty( $data['post_excerpt'] ) ) {
$data['post_excerpt'] = wp_encode_emoji( $data['post_excerpt'] );
}
return $data;
}, 99, 2 );
// Mã hóa emoji trước khi lưu Site Title và Description
add_filter( 'pre_update_option_blogname', 'encode_emoji_for_options', 10, 2 );
add_filter( 'pre_update_option_blogdescription', 'encode_emoji_for_options', 10, 2 );
function encode_emoji_for_options( $new_value, $old_value ) {
return is_string( $new_value ) ? wp_encode_emoji( $new_value ) : $new_value;
}
// Mã hóa emoji khi tạo/sửa Taxonomy (Category, Tag,...)
add_filter( 'pre_insert_term', function( $term ) {
return is_string( $term ) ? wp_encode_emoji( $term ) : $term;
}, 10, 1 );
add_filter( 'pre_update_term', function( $term ) {
return is_string( $term ) ? wp_encode_emoji( $term ) : $term;
}, 10, 1 );
// Nếu dùng Custom Fields (post meta), bạn có thể hook vào update_post_meta
add_filter( 'update_post_metadata', function( $check, $object_id, $meta_key, $meta_value ) {
if ( is_string( $meta_value ) ) {
return wp_encode_emoji( $meta_value );
}
return $meta_value;
}, 10, 4 );
Chúc các bạn thành công.