如何使用自定义小节函数保存自定义设置API字段

时间:2020-06-27 作者:Atif Aqeel

我正在一个选项页面上创建wordpress主题。我已经自定义了默认的do\\u settings\\u字段和do\\u settings\\u sections函数。我的字段显示良好,但当我试图保存它时,它不会保存。

function amna_theme_options_page () {
wp_enqueue_style( \'theme-options-css\', get_template_directory_uri() . \'/inc/admin/assets/css/theme-options-css.css\' );
settings_errors(); 
?>
<div class="wrap flex-tab">
    <form action=\'\' method=\'post\' class="amna-fields">
        <?php 
        amna_do_settings_fields(\'amna-fields-group\', \'theme_amna\');
        amna_do_settings_sections(\'theme_amna\'); 
        
        submit_button();
        ?>
    </form>
</div>
<?php }
这些是我用来覆盖显示字段的函数

function amna_do_settings_sections($page) {
global $wp_settings_sections, $wp_settings_fields;

if ( !isset($wp_settings_sections) || !isset($wp_settings_sections[$page]) )
    return;

foreach( (array) $wp_settings_sections[$page] as $section ) {
    echo "<h3>{$section[\'title\']}</h3>\\n";
    call_user_func($section[\'callback\'], $section);
    if ( !isset($wp_settings_fields) ||
         !isset($wp_settings_fields[$page]) ||
         !isset($wp_settings_fields[$page][$section[\'id\']]) )
            continue;
    echo \'<div class="settings-form-wrapper">\';
    amna_do_settings_fields($page, $section[\'id\']);
    echo \'</div>\';
}
}

function amna_do_settings_fields($page, $section) {
global $wp_settings_fields;

if ( ! isset( $wp_settings_fields[ $page ][ $section ] ) ) {
    return;
}

foreach ( (array) $wp_settings_fields[$page][$section] as $field ) { ?>
    <div class="settings-form-row flex-tab">
        
        <?php if ( !empty($field[\'args\'][\'label_for\']) )
            echo \'<p><label for="\' . $field[\'args\'][\'label_for\'] . \'">\' .
                $field[\'title\'] . \'</label><br />\';
        else
        call_user_func($field[\'callback\'], $field[\'args\']);
        echo \'</p>\';
    echo \'</div>\';
}
}

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

所以我可以理解为什么你;“定制”;(即使用您自己的版本)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.

这是一个完整的工作示例,为您提供了设置页面→ 测试。

SO网友:Atif Aqeel

我张贴了我自己问题的答案,因为有人参考,并没有在任何地方找到解决方案。

基本上,如果您正在更改默认do\\u settings\\u section();和do\\u settings\\u fields();“提交”按钮将找不到提交数据的位置,因为默认功能已被新功能覆盖。在这种情况下,您必须编写提交按钮函数来执行代码并将字段数据保存到数据库中。

因此,不要使用submit\\u按钮();我已经写了我的按钮

<p class="submit"><input type="submit" class="button-primary" value="<?php _e( \'Save changes\', \'amna_save_settings\' ); ?>" /></p>
然后保存按钮代码

if(($_SERVER[\'REQUEST_METHOD\'] == \'POST\') && (isset($_POST[\'amna_fields\']))) {
            update_site_option( \'amna_fields\', $_POST[\'amna_fields\'] );
}

相关推荐

在发送到options.php之前分析表单值

我正在开发一个自定义插件,它需要为远程API输入身份验证数据,并且需要保存这些数据。我想在保存到db之前对其进行加密。我添加了一个设置页面,其中包含:<form method=\"post\" action=\"options.php\"> <!-- form fields here... --> </form> 而不是将每个选项保存为{wp_table_prefix}_options 表中,我希望它们仅保存为一行中的对象,因此name 属