插件选项数组设置为未定义

时间:2016-03-26 作者:neilgee

如果没有定义插件选项,我想将它们设置为空白,这样我就可以避免PHP注意事项。

编写此代码的更好方法是什么?

$options = get_option(\'plugin_options\');

// Add new plugin options defaults here
  if( !isset( $options[\'plugin_option_1\'] ) ) $options[\'plugin_option_1\'] = \'\';
  if( !isset( $options[\'plugin_option_2\'] ) ) $options[\'plugin_option_2\'] = \'\';
  if( !isset( $options[\'plugin_option_3\'] ) ) $options[\'plugin_option_3\'] = \'\';
  if( !isset( $options[\'plugin_option_4\'] ) ) $options[\'plugin_option_4\'] = \'\';
  if( !isset( $options[\'plugin_option_5\'] ) ) $options[\'plugin_option_5\'] = \'\';
需要在插件的未来更新中添加新选项。

3 个回复
最合适的回答,由SO网友:engelen 整理而成

WordPress提供默认方法,wp_parse_args, 组合一组默认选项和一组用户定义的选项。此方法使用PHP的本机array_merge 对于数组,但当两个选项集中的任何一个是对象或WordPress时也可以使用options string.

您只需提供一个默认选项数组和一个设置选项数组,WordPress就会用默认值填充选项集中缺少的选项。

您可以在下面找到根据您的示例进行调整的代码:

$options = get_option( \'plugin_options\' );
$options_default = array(
    \'plugin_option_1\' => \'\',
    \'plugin_option_2\' => \'\',
    \'plugin_option_3\' => \'\',
    \'plugin_option_4\' => \'\',
    \'plugin_option_5\' => \'\'
);

$options = wp_parse_args( $options, $options_default );

SO网友:Adam

示例:

/**
*  assume $options only has three keys defined
*  
*  array(
*      \'plugin_option_1\',
*      \'plugin_option_2\',
*      \'plugin_option_3\',
*  )
*/
$options = get_options(\'my_options\');

$schema = array(
    \'plugin_option_1\',
    \'plugin_option_2\',
    \'plugin_option_3\',
    \'plugin_option_4\',
    \'plugin_option_5\',
    \'plugin_option_8\',
    \'plugin_option_9\',
    \'plugin_option_10\',
);

foreach ( $schema as $option ) {

    if ( ! array_key_exists($option, $options) ) {
        $options[$option] = \'\';
    }

}
尽管上面的示例向您展示了简化过程的一种方法,但我不理解为什么您要检查是否存在未定义的键,然后为其分配一个空值,除非您特别需要返回一个正常的默认值?

你为什么不能做。。。?

if ( !empty($options[\'some_key\']) ) {
    //do my logic...
}

SO网友:Jevuska

由于您在阵列中有插件选项(带键),让我们假设您的场景如下:

你的old 选项为$old = get_option( \'plugin_options\' );包含以下内容:

$old = array(
    \'plugin_option_1\' => \'1\',
    \'plugin_option_2\' => \'2\',
    \'plugin_option_3\' => \'3\',
    \'plugin_option_4\' => \'4\',
    \'plugin_option_5\' => \'5\'
);
您的new 选项为$new 包含此数组以更新:

$new = array(
    \'plugin_option_2\' => \'9\',
    \'plugin_option_5\' => \'10\'
);
Now on plugin update

foreach ( $old as $key => $value )
    $old[ $key ] = ( ! isset( $new[ $key ] ) ) ? \'\' : $new[ $key ];

update_option( \'plugin_options\', $old );

With PHP 7

foreach ( $old as $key => $value )
    $old[ $key ] = ( $new[ $key ]  ) ?? \'\';

update_option( \'plugin_options\', $old );
Result on print_r( $old ):

Array
(
    [plugin_option_1] => 
    [plugin_option_2] => 9
    [plugin_option_3] => 
    [plugin_option_4] => 
    [plugin_option_5] => 10
)

相关推荐

Save Plugin Options as Array

我正在尝试创建一个简单的选项页面。这些选项由每个用户角色的文本字段组成。但我不想每次添加新用户角色时都编辑代码。因此,我试图;对于每个用户角色并从中生成文本字段。但该值不会保存在选项中。我想我需要在保存之前将值保存在数组中。像这样:add_settings_field( \'weborder_leveranstext\', __( \'Header\', \'weborder\' ), \'weborder_leveranstext_render\', \'plugi