设置API验证回调

时间:2012-03-01 作者:Wordpressor

在Chip Bennet的大力帮助下,我终于为Settings API创建了有效的验证回调,只有一个小故障我不知道如何修复。

下面是我的验证函数中的foreach循环:

    foreach ($settings as $setting) {
        $id = $setting[\'id\'];  
        $type = $setting[\'type\'];
        $option = get_option(\'XX_theme_settings\');

       if($type == \'textarea\') {
           $valid_input[$id] = wp_filter_nohtml_kses($input[$id]);
       } 
    }
我正在循环使用许多$设置,上面的代码并不像预期的那样工作,如果我的设置中有10个文本区域,并且我只编辑一个文本区域,那么其他9个的$输入[$id]将为空,并且它们将立即被删除。

我试图通过其他输入检查来解决这个问题,例如:

//if there is no input for given field leave the old value
if($type == \'textarea\' && empty($input[$id])) {
   $valid_input[$id] = wp_filter_nohtml_kses($option[$id]);
} 

//if there\'s input sent change setting\'s value
else if($type == "textarea" && !empty($input[$id])) {
   $valid_input[$id] = wp_filter_nohtml_kses($input[$id]);
}   
它基本上可以工作,但无法擦除选项。例如,如果我有一个名为“welcome\\u text”的选项,并且附加了值“welcome People”,我就不能删除所有符号并将此字段留空,因为第一个if语句正在触发。因此,“welcome\\u text”值可以是“welcome fol”或“W”,但决不能是“”。

我可以看出我的第一种方法非常有效in here, 我不知道为什么。

谢谢:)

1 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

如果您有一个选项页(应该在一个表单中),那么所有数据都将从该表单发送,无论选项是否已更改。

接收验证的数组是从表单(您的部分)接收的数据。如果数据为“空”,则是因为数据未发送。通常这是因为用户故意不发送任何数据(即清空文本区域)。

如果您试图在一个数组中存储来自不同页面的选项,那么您需要确定空白数据是故意的,还是因为它不在提交的页面上而没有发送。

仅处理预期数据实际上您需要确定的是您期望接收的数据是什么?在您的情况下,这将取决于您提交数据的页面:

//The \'ids\' of data that is expected on the respective page
$page1_options = array(\'textarea_on_page_1\',\'checkbox_1\',\'another_textarea_1\');
$page2_options = array(\'someinput_2\',\'another_textarea\');

//An array of arrays of option names the plugin accepts:
$expected =array(\'page1\'=>$page1_options,\'page2\'=>$page2_options);
然后,如果从第1页提交数据,我们希望收到的数据是$expected[\'page1\'].

所以我们只validate 这些选项和filter everything else out 这样我们就可以$valid_input 其中包含all and only 列出的键$page1_options. 然后,我们将当前选项与新的有效输入合并,以获得新的设置数组:

$option_array = get_option(\'XX_theme_settings\');
$option_array = array_merge($option_array,$valid_input);
//Return this $option_array to be saved to database
确定页面要确定要发送的页面,请在每个页面上添加另一个“选项”,该选项实际上是隐藏输入,其值设置为上面提到的页面ID(例如。\'page1\'). 这将与选项一起发送。

更好的方法是将每个页面的设置保存为数据库中单独的一行(因此您有X个页面的X(数组)选项),这是一种更简单的方法。

结束

相关推荐

从wp_Options解构序列化数据数组

我正在尝试解构(并重新创建)wp\\U选项中名为“my\\u options”的序列化选项值如何构建数组以重新创建“my\\u options”当前存在的option\\u值?update\\u option(\'my\\u options\',?)更新后,wp options表格将保存“my\\u options”的此值:a:3:{s:12:\"my_widget-1\";a:2:{ etc...