自定义主题选项未保存单选输入

时间:2020-04-08 作者:Arg Geo

为什么不保存以下选项?已经搜索了很长一段时间,但无法使其运行。

设置代码:

add_settings_section( \'aa_myoption_section\', null, null, \'mypage-options\' );

add_settings_field(
   \'aa_myoption\',
   null,
   \'aa_myoption_interface\',
   \'mypage-options\',
   \'aa_myoption_section\',
);
register_setting ( \'myoptions_group\', \'aa_myoption\' );
aa\\u myoption\\u接口功能:

$options = get_option( \'aa_myoption\' );
echo \'debug: \' . $options;

<input id="first_radio" type="radio" name="radio_group" value="first" <?php checked( $options, \'first\', true ); ?>>
<label for="first_radio">First Radio</label>
<input id="second_radio" type="radio" name="radio_group" value="second" <?php checked( $options, \'second\', true ); ?>>
<label for="second_radio">Second Radio</label>
<input id="third_radio" type="radio" name="radio_group" value="third" <?php checked( $options, \'third\', true ); ?>>
<label for="third_radio">Third Radio</label>
除此之外,我还想知道如何在aa_myoption 并保存多个字段,如get_option(\'aa_myoption\')[\'first_field\'], get_option(\'aa_myoption\')[\'second_field\'] 等等我试图像这样保存文本输入,但出现了一个错误:“警告:‘first\\u field‘非法字符串’”。

提前谢谢。

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

为什么不保存以下选项?

因为数据库选项名称(的第二个参数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() 函数或类似函数,它返回一个包含数据库选项的数组,并与默认值合并。:)

  • 相关推荐

    将选项添加到“Menus”编辑器的“Screen Options”部分

    我正在开发一个向WordPress菜单编辑器添加自定义选项的系统,我想将其与屏幕选项面板集成。在我的研究中,我找不到任何关于修改现有屏幕选项菜单的内容;这可能吗?请参见下面的屏幕截图,以更好地了解我要实现的目标。外观>菜单上的默认“屏幕选项”:外观>菜单上的目标“屏幕选项”: