求助:Flatsome UX Builder更新时删除自定义Post Meta问题
解决自定义Metabox在UX Builder更新后被删除的问题
核心原因
UX Builder在提交保存时,要么没把自定义metabox的字段包含在POST数据里,要么其保存逻辑会清空非自身创建的元数据。如果你的自定义meta保存代码没做判断,直接用update_post_meta传入空值(因POST里无对应字段),就会导致原有meta被删除。
具体解决方案
1. 修正保存逻辑,避免空值覆盖
检查你的save_post回调代码,确保只在POST字段存在时才更新meta,不存在就跳过(不要主动删除):
function save_custom_post_meta($post_id) { // 跳过自动保存、修订版,权限检查 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (wp_is_post_revision($post_id)) return; if (!current_user_can('edit_post', $post_id)) return; // 关键:仅当POST中存在该字段时才更新 $meta_key = 'your_custom_meta_key'; // 替换成你的meta键名 if (isset($_POST[$meta_key])) { $clean_value = sanitize_text_field($_POST[$meta_key]); update_post_meta($post_id, $meta_key, $clean_value); } // 注意:不要在这里写 delete_post_meta,除非你明确需要删除逻辑 } add_action('save_post_post', 'save_custom_post_meta');
2. 用register_meta注册元数据(推荐)
WordPress原生的register_meta会帮你处理元数据的保存、REST API访问等逻辑,多数页面Builder(包括UX Builder)会尊重通过这种方式注册的元数据,不会轻易删除:
function register_custom_meta_field() { $meta_key = 'your_custom_meta_key'; // 替换成你的meta键名 register_meta('post', $meta_key, array( 'show_in_rest' => true, // 开启REST API支持,Builder常用REST保存数据 'single' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'auth_callback' => function() { return current_user_can('edit_posts'); } )); } add_action('init', 'register_custom_meta_field');
之后你的metabox输入框正常渲染即可,取值用get_post_meta($post->ID, $meta_key, true)填充。
3. 针对UX Builder的保存动作恢复元数据
如果上面两种方法无效,说明UX Builder主动清空了非自身的元数据,可以在保存完成后恢复你的meta值:
function restore_custom_meta_after_ux_save($post_id, $post_after, $post_before) { // 识别UX Builder的保存动作(根据实际POST字段调整,可通过var_dump($_POST)查看) if (isset($_POST['ux_builder_save']) || isset($_POST['ux_builder_action'])) { $meta_key = 'your_custom_meta_key'; $old_value = get_post_meta($post_before->ID, $meta_key, true); // 如果原有值存在,且保存后被清空,就恢复 if (!empty($old_value) && !get_post_meta($post_id, $meta_key, true)) { update_post_meta($post_id, $meta_key, $old_value); } } } add_action('post_updated', 'restore_custom_meta_after_ux_save', 10, 3);
内容的提问来源于stack exchange,提问作者luis8h
相关产品推荐
相关产品推荐

