设置API-验证复选框的最简单方法?

时间:2012-02-28 作者:Wordpressor

我使用的是设置API,我无法让复选框工作,如果将其设置为“false”,它们甚至都不是$\\u POST,这就是重点。

Stephen Harris & Chip Bennett explained it, 但我相信他们的方法还不够简单(特别是对我来说,根本不是PHP的家伙)。我真的需要为每个表单使用一些定制的PHP函数和定制的命名提交按钮来完成这个简单的工作吗?

我的设置很像:

register_setting(\'XX_theme_settings\', \'XX_theme_settings\', \'setting_validate\' );

add_settings_section(\'theme_options\', \'Theme Options\', \'theme_options_generate\', \'page1\' ); 
add_settings_field( \'XX_Option1\', \'Option 1\', \'checkbox\', \'page1\', \'theme_options\', \'XX_Option1\', $args = array(\'id\' => \'checkbox1\', \'type\' => \'checkbox\') );
add_settings_field( \'XX_Option2\', \'Option 2\', \'checkbox\', \'page1\', \'theme_options\', \'XX_Option2\', $args = array(\'id\' => \'checkbox2\', \'type\' => \'checkbox\') ); 
然后,我使用此回调函数生成复选框:

function checkbox($args) {
    $options = get_option(\'XX_theme_settings\');
    echo \'<input type="checkbox" name="\'. $args[\'id\'] .\'" value="true"\'; if($options[$args[\'id\']]==true) { echo \'checked="checked\'; }; echo \'/>\';
    echo $args[\'type\'];  
}
现在,我需要的就是一个好的验证回调:

function setting_validate($input) {
   // Firstly it should find all fields of type == "checkbox" 
   // (I\'m not sure why should I check which field was just being sent, 
   // is updating all the checkboxes from different sections a big no-no?
   // it is much easier indeed.
   // Now set the ones missing to false/0 and the rest to true/1.
   // Then merge everything like below:

   $options = get_option(\'XX_theme_settings\');
   $merged = array_merge($options, $input);  
   return $merged;  
}
所以问题是:how to list all Settings Api checkboxes and then set the right ones to true?

我想应该是这样的:

$options = array(
        array(
            \'id\' => \'checkbox1\',
            \'type\' => \'checkbox\',
            \'page\' => \'page1\',
         ),
        array(
            \'id\' => \'checkbox2\',
            \'type\' => \'checkbox\',
            \'page\' => \'page1\',
         ),
);

function setting_validate($input) {
   foreach($options as $option) {
     if($option[\'type\'] == "checkbox") { 
        //set it to 1 if sent
     }
   }

   $options = get_option(\'XX_theme_settings\');
   $merged = array_merge($options, $input);  
   return $merged;  
}
谢谢:)

Here\'s how Chip Bennett does it exactly, 但即使有这么多好的评论,我也不知道它到底是如何工作的。

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

如果相关设置为$setting, 并且是复选框类型,您可以这样验证它:

<?php
$valid_input[$setting] = ( isset( $input[$setting] ) && true == $input[$setting] ? true : false );
?>
在这种情况下,$input 是传递给验证回调的表单数据,其中$input 是一个数组。验证方法称为白名单,其中调用当前设置数组(在本例中,为$valid_input), 并且只有在$input[$setting] 通过验证。

使用复选框时,如果未设置复选框,则不会在$input 大堆因此,验证它的第一步是determine if it\'s been set in $input. 第二步是确保设置的值为true (或\'true\', 或\'on\', 或在设置窗体中设置复选框值的任何内容)。如果这两个条件都满足,则返回true; 否则,返回false.

看:真的很简单。:)

编辑以下内容:

function setting_validate($input) {
   foreach($options as $option) {
     if($option[\'type\'] == "checkbox") { 
        //set it to 1 if sent
     }
   }

   $options = get_option(\'XX_theme_settings\');
   $merged = array_merge($options, $input);  
   return $merged;  
}
。。。这不是你想要的方式。要将返回值限制为有效选项;也就是说,您希望显式地返回已知已定义的设置。如果有人可以$input 使用其他数据(即恶意代码),您的方法只需将这些额外数据直接传递到数据库中即可。

不要执行array_merge(). 更新每个$valid_options[$setting] 单独/单独,仅限返回$valid_options.

流程如下:

定义当前有效的数据:

$valid_input = get_option( \'XX_theme_settings\' );
更新当前有效的数据$input 仅当$input 通过验证/消毒如果字段是动态生成的,那么您还应该在验证回调中动态地逐步执行这些字段。这是正确的foreach( $options as $option ).

将所有这些放在一起可能会如下所示:

<?php
function setting_validate( $input ) {
    // Get current setting values
    $valid_options = get_option( \'XX_theme_options\' );
    // Get option parameters array
    // Note: XX_theme_get_option_parameters() function
    // should be defined to return the array you\'ve 
    // defined for $options
    $options = XX_theme_get_option_parameters();
    // Now step through the option parameters,
    // and validate each $input[$option]
    foreach( $options as $option ) {
         // If $option[\'type] is a checkbox
         if( \'checkbox\' == $option[\'type\'] ) { 
             // verify that $input[$option] is set
             // and is set with a valid value;
             // if so, set $valid_input[$option] to 1
             $valid_input[$option] = ( isset( $input[$option] && true == $input[$option] ? 1 : 0 );
         }
     }
     // Return the updated $valid_input array
     return $valid_input;
}
?>

结束

相关推荐

通过PHPMyAdmin将带有自定义元数据的WordPress帖子导入为CSV文件

我一直在通过CSV导入器插件将带有自定义元数据的数据记录作为帖子直接导入Wordpress。它工作正常,但也有一些问题。问题:1) 导入大量的记录需要无数个小时(我花了几十个小时导入了大约5000条记录,还有大约150000条记录要去)。2) 该插件不再受支持,所以我不知道它的稳定性。我希望能找到一种方法,将这些csv格式的记录直接导入phpmyadmin。以下是帖子包含的内容。。。Post titlePost contentplus大约8个自定义字段(我通过一些脚本使其可见,这些脚本添加到我的主题的si