为什么不保存以下选项?
因为数据库选项名称(的第二个参数register_setting()
) 是aa_myoption
, 因此输入name
必须是aa_myoption
或在数组表示法中,如aa_myoption[my_field]
:
<input name="aa_myoption"> <!-- like this -->
<input name="aa_myoption[my_field]"> <!-- or this -->
其次,当您检索选项值时,以及当它是一个设置数组时(如第二个
<input>
与任何其他数组一样,在尝试使用该值之前,应该检查数组键是否存在:
<?php
$options = (array) get_option( \'aa_myoption\', array() );
$my_field = isset( $options[\'my_field\'] ) ? $options[\'my_field\'] : \'\';
// Then for example when using checked():
?>
<input name="aa_myoption[my_field]" type="checkbox" value="myvalue"<?php checked( $my_field, \'myvalue\' ); ?>>
<?php
// Or you can also use wp_parse_args() to make sure all KEYS are set:
$options = wp_parse_args( get_option( \'aa_myoption\', array() ), array(
\'my_field\' => \'\',
) );
// Then for example when using checked():
?>
<input name="aa_myoption[my_field]" type="checkbox" value="myvalue"<?php checked( $options[\'my_field\'], \'myvalue\' ); ?>>
附加注释
$my_field = isset( $options[\'my_field\'] ) ? $options[\'my_field\'] : \'\';
空字符串不一定是空的,我们只是给
$my_field
当数组键/项
my_field
还不存在,您甚至可以使用PHP 7格式&mdash;
$my_field = $options[\'my_field\'] ?? \'\';
它的作用与上面的相同。=)
$options = (array) get_option( \'aa_myoption\', array() );
一点解释:我在说get_option()
如果该选项尚不存在,即数据库查询,则返回空数组WHERE option_name = \'aa_myoption\'
未返回任何结果。
我正在对数组进行类型转换,以确保它确实是一个数组,因为WordPress选项(自定义选项和核心选项都是admin_email
) 可以通过插件和您自己的代码轻松过滤。。e、 g.通过option_<option name>
hook, 插件(或自定义代码)可能返回非数组值。
当然,最佳实践是过滤器回调始终返回正确类型的值。
我从这个答案中删除了示例测试用例,但您可以随时检查它们here. ;)
此外,我可能会使用wp_parse_args()
, 但我可能会创建一个my_theme_get_options()
函数或类似函数,它返回一个包含数据库选项的数组,并与默认值合并。:)