我正在使用设置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。
然后,我再次粘贴第一个代码,并第三次刷新,结果一切正常。
提示:也许我应该在更新字段之前删除字段值?
最合适的回答,由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 );