描述
您不需要序列化值。如果该值需要序列化,则在将其插入数据库之前将对其进行序列化。请记住,资源不能序列化或作为选项添加。
如果该选项不存在,将创建它。
此函数设计用于登录或未登录用户一同使用。在安全方面,插件开发人员应该在更新任何选项之前检查当前用户的能力。
参数
- $option
-
(string)(必填) 要更新的选项的名称,预期不会进行SQL转义。
- $value
-
(mixed)(必填) 选项值,如果不是标量,则必须是可序列化的。预期不会进行SQL转义。
- $autoload
-
(string|bool)(可选) WordPress启动时是否加载该选项。对于现有选项,
$autoload
只有在$value
也发生更改的情况下使用update_option()
进行更新。接受 'yes'|true 表示启用,或接受 'no'|false 以禁用。对于不存在的选项,默认值是 'yes'。默认值: null
返回
(bool) 如果值已更新,则为true,否则为false。
源码
更新日志
版本 | 描述 |
---|---|
4.2.0 | 添加了 $autoload 参数。 |
1.0.0 | 开始引入 |
使用示例
根据WordPress Codex(以及我使用WP开发的经验),请注意此处返回值中的一个重要细微之处:
如果选项值已更改,则为true,如果未更改或更新失败,则为false。在一些论坛上还建议通过代码检查选项的存在:
if ( ! get_option('my_option') ) ...
但是当选项存在并且我将 my_option 设置为bool FALSE时,我发现这不起作用!
为了处理选项存在性的所有检查,我利用了 update_option 的细微之处:
if (FALSE === get_option('my_option') && FALSE === update_option('my_option',FALSE)) add_option('my_option',$default_value);
当将选项设置为FALSE时,第二个检查结果为FALSE,不会产生任何变化……因此,如果该值确实不存在,则将添加(在我的情况下)所需的 $default_value。
我知道这似乎有些极端,但据我所知,这是我能够在插件选项上保留bool FALSE并根据自定义选项的实际存在断言有效操作的唯一方法。
由于第271行的 get_option 在选项不存在的情况下返回false,所以不可能使用 update_option 创建一个布尔值为false的新选项,因为 update_option 会错误地认为(第307行)该选项确实存在但没有变化。一个变通方法是用整数1和0代替布尔值。
仅在第一次安装时更新选项一次
下面的代码将允许用户在设置新选项后更改选项。function my_switch_theme() { update_option( 'thumbnail_size_w', 320 ); update_option( 'thumbnail_size_h', 180 ); } add_action('switch_theme', 'my_switch_theme');
如果我们使用
after_setup_theme
,它将阻止选项并阻止用户更改它。用法
<?php update_option( $option, $new_value, $autoload ); ?>
示例:更新核心选项
将默认注释状态设置为“closed”:<?php update_option( 'default_comment_status', 'closed' ); ?>
此选项通常在设置 > 讨论管理面板中设置。有关WordPress Core使用的选项的完整列表,请参阅选项参考。
注意:使用get_option()确认选项值。
<?php echo get_option( 'default_comment_status' ); ?>
示例:更新自定义选项
您还可以创建自己的自定义选项。此示例使用值255更新选项'my_custom_option'
:<?php update_option( 'my_custom_option', 255 ); ?>
如果该选项不存在,则会自动添加该选项(并设置该选项的值)。
如果您不希望自定义选项在WordPress启动时自动加载,请使用add_option()。此示例更新该选项(如果该选项已存在),如果不存在,则使用
add_option()
将$autoload
设置为'no'
。<?php $option_name = 'my_custom_color_option' ; $new_value = 'red'; if ( get_option( $option_name ) !== false ) { // The option already exists, so update it. update_option( $option_name, $new_value ); } else { // The option hasn't been created yet, so add it with $autoload set to 'no'. $deprecated = null; $autoload = 'no'; add_option( $option_name, $new_value, $deprecated, $autoload ); } ?>
注意
通过WordPress函数检索的选项值被缓存。如果在选项API之外修改选项,然后尝试更新缓存的选项,则更新将失败并返回false。在尝试获取或更新同一请求的选项之前,请使用以下方法清除选项缓存:<?php wp_cache_delete ( 'alloptions', 'options' ); ?>
使用 wp_load_alloptions() 打印所有选项的列表:
<?php $alloptions = wp_load_alloptions(); var_dump( $alloptions ); ?>
注意
请避免将$value
传递为null
,对于false-y值只需使用0
、false
甚至空字符串,null
值可能会导致潜在的错误和副作用。保存布尔值true将保存为(字符串)“1”的选项值
保存布尔值为false时,选项值为空(字符串)“”$value = true; update_option( 'some_option', $value );
获取布尔值将返回:
a)如果保存的布尔值为true,则返回字符串“1”
b)如果保存布尔值为false,则返回空字符串“”
c)如果该选项不存在,则返回布尔值false$get_value = get_option( 'some_option', true );
要检查某个选项是否已启用,并且默认情况下应该启用(我们不关心该选项是否已存在):
$check = ! empty( $get_value );
要检查某项功能是否已启用,但仅当该选项存在时:
$check = ( '1' === $get_value );
如果新值与旧值相同,则update_option将返回false。
$opt_name = ( ! empty($_POST['opt_name'] ) ) ? $_POST['opt_name'] : 'wpdocs'; $opt_value = ( ! empty($_POST['opt_value'] ) ) ? $_POST['opt_value'] : ' '; $existing_val = get_option( $opt_name ); if ( false !== $existing_val ) { // option exist if ( $existing_val === $opt_value ) { echo "new value is same as old."; } else { echo "new value is different."; update_option( $opt_name, $opt_value ); } } else { // option not exist add_option( $opt_name, $opt_value ); }
更新选项存储在多维数组中
更新多维数组并检索整个数组。
//store in one variable $multidimensional_options = array( 'inner_array'=>array( 'foo' => 'bar', 'hello' => 'world', ), ); //Update entire array update_option('my_multi_options', $multidimensional_options); //Get entire array $my_multi_options = get_option('my_multi_options');