所以我可以理解为什么你;“定制”;(即使用您自己的版本)do_settings_sections()
和do_settings_fields()
函数-因为您想使用div
而不是table
, 正当
但如果只是关于样式,实际上可以使用CSS来设置表格的样式,使其看起来不像表格;然而,你必须自己尝试这样做。WordPress将来可能会更改全局变量(它们的名称和/或数据结构),因此请记住这一点,即您必须确保您的代码与当前WordPress版本中的原始函数同步。
使表单正常工作(例如,字段保存在正确的数据库选项中)
正如我在评论中所说的,表单应提交到
options.php
(即。
<form action="options.php" ...>
) 和电话
register_setting()
在代码中注册表单或其设置组,以及数据库选项(该函数的第二个参数)。
在amna_theme_options_page()
, 没有必要打电话给amna_do_settings_fields()
因为它已经被调用,应该只被调用amna_do_settings_sections()
它呈现设置窗体的所有字段,其中每个字段都应属于特定的部分。因此,请致电settings_fields()
以便WordPress知道选项/设置页面是什么以及要更新的数据库选项:
settings_fields( \'amna-fields-group\' ); // do this
//amna_do_settings_fields(\'amna-fields-group\', \'theme_amna\'); // not this
我注意到的另一个问题是
amna_do_settings_fields()
, 如果
label_for
arg不是空的,那么该字段实际上不会被渲染,因为
call_user_func()
只在
else
部分
所以应该是这样的:
echo \'<p>\';
if ( ! empty( $field[\'args\'][\'label_for\'] ) ) {
echo \'<label for="\' . esc_attr( $field[\'args\'][\'label_for\'] ) . \'">\' . $field[\'title\'] . \'</label>\';
} else {
echo $field[\'title\'];
}
call_user_func( $field[\'callback\'], $field[\'args\'] );
echo \'</p>\';
此外,您应该将设置页面的slug传递给
settings_errors()
, e、 g。
settings_errors( \'theme_amna\' );
如果子弹是
theme_amna
. 如果不这样做,则可能会看到相同的设置错误/消息打印两次。
此外,还有管理样式表文件(.css
) 应通过admin_enqueue_scripts
hook. 例如,要仅在设置页面排队,请执行以下操作:
add_action( \'admin_enqueue_scripts\', \'my_plugin_load_styles\' );
function my_plugin_load_styles( $hook_suffix ) {
if ( $hook_suffix === get_plugin_page_hook( \'theme_amna\', \'\' ) ) {
wp_enqueue_style( \'theme-options-css\',
get_template_directory_uri() . \'/inc/admin/assets/css/theme-options-css.css\' );
}
}
工作示例
You can find it on GitHub.
这是一个完整的工作示例,为您提供了设置页面→ 测试。