设置接口-如何手动更新多个选项?

时间:2013-10-29 作者:Wordpressor

我正在使用设置API存储所有选项:

function registerSettings() {

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\', \'text_input\', \'page1\', \'theme_options\', \'XX_Option1\' );
add_settings_field( \'XX_Option2\', \'Option 2\', \'text_input\', \'page1\', \'theme_options\', \'XX_Option2\' ); 

};

add_action(\'admin_init\', \'registerSettings\');
假设我想手动更新所有选项(不是使用表单,而是通过PHP),我应该怎么做?

对于一个设置,此更新就是这样的:

$my_options= get_option(\'XX_theme_settings\');//retrieve all options
$my_options[\'XX_Option2\'] = \'my new value\'; //amend value in array(s)
update_option(\'XX_theme_settings\', $my_options); //update option array
我完全不知道如何使它适用于多个(最初我有50多个)设置字段。

我一直在这样尝试:

$current_options = get_option(\'XX_theme_settings\');
$imported_options = array_merge($current_options , array_intersect_key($_POST["import"], $current_options ));
// $imported_options = $_POST["import"]; - simplified
update_option(\'XX_theme_settings\', $imported_options);
当然,“import”不是一个字符串,而是一个数组。

这里有一个相关的(我自己的)问题:Settings API - how to update options manually?

我想我仍然需要创建一个PHP foreach循环并循环所有设置,然后列出它们,然后通过update\\u选项添加每个设置?如何操作?它会很慢吗,因为它听起来很慢?

UPDATE

此代码似乎没有更新设置:

$current_options = get_option( \'XX_theme_settings\', array() );
$desired_options = array("existing_field" => "new value");
// $desired_options = array("XX_theme_settings" => array("existing_field" => "new value")); tried this one, but also no luck
$merged_options = wp_parse_args( $current_options, $desired_options );
update_option( \'XX_theme_settings\', $merged_options );

UPDATE II

这更奇怪。

我把上面的代码放在第页。php(仅出于测试原因):

    $current_options = get_option( \'XX_theme_settings\', array() );
    $desired_options = array("existing_field" => "new value");
    $merged_options = wp_parse_args( $current_options, $desired_options );
    update_option( \'XX_theme_settings\', $merged_options );
我刷新其中一页。什么都没发生。然后我将代码更改为:

    $current_options = get_option( \'XX_theme_settings\', array() );
    $desired_options = array("existing_field" => "new value");
    $merged_options[] = wp_parse_args( $current_options, $desired_options ); //here\'s the change
    update_option( \'XX_theme_settings\', $merged_options );
另一次刷新,“existing\\u field”现在是emtpy。

然后,我再次粘贴第一个代码,并第三次刷新,结果一切正常。

提示:也许我应该在更新字段之前删除字段值?

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

获取当前选项,如果为空,请确保返回数组:

$current_options = get_option( \'option_name\', array() );
确保所需选项位于阵列中:

$desired_options = array( /* whatever you need goes here */ );
使用合并它们[wp_parse_args()]1:

$merged_options = wp_parse_args( $current_options, $desired_options );
更新

update_option( \'option_name\', $merged_options );
当然,您的窍门是确保使用所需的选项处理阵列。也许可以这样做:

$desired_options = array( $_POST[\'import\'] );
(请注意,请做一些卫生处理。$_POST 数据本身不可信

编辑我有大约30个选项,输入、布尔和文本区域。它们都存储在XX\\u theme\\u设置下,其中一个名为existing_field

只需遵循上述流程:

获取当前选项,如果为空,请确保返回数组:

$current_options = get_option( \'XX_theme_settings\', array() );
确保所需选项位于阵列中:

$desired_options = array( \'existing_field\' => \'your string here\' );
使用合并它们[wp_parse_args()]1:

$merged_options = wp_parse_args( $current_options, $desired_options );
更新

update_option( \'XX_theme_settings\', $merged_options );

结束

相关推荐

Multi Upload In Theme Options

我需要在主题选项页面上使用WordPress媒体上传。它需要能够在一个页面上有多个字段。我在网站上看到了一些使用搜索的东西,但没有最新的,也没有我能找到的工作。有人能告诉我一个简单的方法吗。确实希望使用新的库样式,从媒体库中选择图片,或选择上载。