插件选项保存的常见误区:为什么你的配置项总被覆盖?

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 104 浏览 15 回复

很多开发者在处理插件选项保存时都踩过这个坑:当插件有多个配置项时,如果直接使用update_option逐个保存,会导致其他配置项被意外覆盖。来看这段典型错误代码:

// ❌ 错误写法
add_action('admin_init', function() {
    if(isset($_POST['option1'])){
        update_option('myplugin_settings', sanitize_text_field($_POST['option1']));
    }
    if(isset($_POST['option2'])){
        update_option('myplugin_settings', sanitize_text_field($_POST['option2']));
    }
});

上面代码的问题在于每次update_option都会完全替换整个选项值。当用户只修改option2时,option1的值会被覆盖成空值。正确的做法应该是先获取现有配置,再合并新值:

// ✅ 正确做法
add_action('admin_init', function() {
    $current = get_option('myplugin_settings', []);
    
    if(isset($_POST['option1'])){
        $current['option1'] = sanitize_text_field($_POST['option1']);
    }
    if(isset($_POST['option2'])){
        $current['option2'] = sanitize_text_field($_POST['option2']);
    }
    
    update_option('myplugin_settings', $current);
});

更健壮的实现建议加上nonce验证和权限检查,核心要点是:永远先get_option获取完整配置数组,修改对应字段后再整体update_option,这才是WordPress选项保存的标准姿势。

评论15
回复 · 15
KateStar
KateStar 初级 · #15 ·
感谢分享!
LuckyStar
LuckyStar 初级 · #14 ·
学到了,顶一下
神秘的企鹅
神秘的企鹅 新手 · #13 ·
感谢分享!
SkyWalker
SkyWalker 新手璃海华章 · #12 ·
感谢分享!
不期而遇的企鹅
不期而遇的企鹅 新手 · #11 ·
学到了,顶一下
温柔的少年
温柔的少年 新手 · #10 ·
同求,期待更新
Paul
Paul 新手 · #9 ·
写得很清楚,收藏了
刘涛桂
刘涛桂 初级 · #8 ·
已解决,谢谢楼主
NoahLee
NoahLee 新手 · #7 ·
已解决,谢谢楼主
Nina
Nina 初级 · #6 ·
写得很清楚,收藏了
Yuki
Yuki 新手净世白羽 · #5 ·
学到了,顶一下
DrewChen
DrewChen 新手赏金猎人 · #4 ·
同求,期待更新
FinnLeaf
FinnLeaf 新手星灿心语 · #3 ·
同求,期待更新
Blake
Blake 新手赏金猎人 · #2 ·
写得很清楚,收藏了
安然77
安然77 初级心屿荧途 · #1 ·
感谢分享!
微信客服 微信客服