4

我为 WordPress 插件创建了一个设置页面。

然后我为同一页面创建了两个设置部分:

add_plugins_page(
    __('API Settings', 'api'),
    __('API Settings', 'api'),
    'administrator',
    'api',
    array('API', 'settings_display')
);

// add general settings section
add_settings_section(
    'api_general',
    __('General Settings', 'api'),
    array('API', 'section_callback'),
    'api'
);

// add page section
add_settings_section(
    'api_pages',
    __('Set API pages', 'api'),
    array('API', 'section_callback'),
    'apis'
);

然后使用 add_settings_field() 将各种字段添加到不同的部分。

处理页面呈现的函数如下所示:

<!-- Create a header in the default WordPress 'wrap' container -->
<div class="wrap">
    <!-- Add the icon to the page -->
    <?php screen_icon(); ?>
    <h2><?php _e('API Settings', 'api'); ?></h2>
    <!-- Make a call to the WordPress function for rendering errors when settings are saved. -->
    <?php settings_errors(); ?>
    <!-- Create the form that will be used to render our options -->
    <form method="post" action="options.php">
        <?php settings_fields('api_pages'); ?>
        <?php settings_fields('api_general'); ?>
        <?php do_settings_sections('api'); ?>
        <?php submit_button(); ?>
    </form>
</div><!-- /.wrap -->

然后当我尝试保存页面设置时,它只会保存 api_general 设置。

我发现 settings_fields() 实际上只是为了输出特定部分的 nonce、action 和 option_page 字段。因此,当我为两个不同的部分调用它时,一个部分的输出基本上会忽略前一部分。

我做了一些研究并查看了教程,但我还没有找到一个显示必须同时保存多个部分的教程。但是由于 do_settings_sections() 输出页面的所有部分,因此必须有一种方法可以同时保存所有部分。

我唯一的其他办法是将所有字段合并到同一部分或创建单独的页面,如果可能的话我想避免这些页面。

4

3 回答 3

2

也许这会有所帮助....根据此法典:settings_fields

settings_fields 函数的第一个参数应该是在 register_setting 中声明的设置组。

但看起来您正在使用设置部分的名称,所以我什至不确定它是如何工作的。

一个页面上可以有两个或多个部分,但所有设置(即选项),无论它们位于哪个部分,都必须属于表单中的同一设置组。组的隐藏字段(单数)通过神奇的“settings_field”函数插入到表单的顶部。

但是,您也可以在一个页面上拥有多个表单,每个表单都有自己的提交按钮和 settings_fields('optiongroup'),但我个人认为页面上的多个提交按钮会让用户感到非常困惑。

据我了解,限制因素是之间存在 1 对 1 对 1 的对应关系:

  • 页面上的表单
  • 该表单中的提交按钮
  • 该表单中的 settings_fields

settings_fields() 确定将在幕后保存的内容。使用一系列选项而不是单个选项更有效。我还没有尝试过,但是为了从逻辑上拆分表单上的部分,将一组选项与每个设置部分相关联是有意义的。然后每个部分 (n) 将有自己的 get_options('section-(n)') 来获取其所有字段的值数组。但仍然(有过度重复的风险),当每个页面上的一个表单按下一个提交按钮时,包含每个部分中所有字段值的每个选项数组都会立即保存。

哇!:-)

于 2013-03-29T12:05:42.730 回答
0

据我了解,不可能在一页上有多个设置部分并保存所有部分的数据。一个解决方案是使用标签,http://wp.smashingmagazine.com/2011/10/20/create-tabs-wordpress-settings-pages/应该让你开始使用标签。

于 2013-11-22T13:44:46.720 回答
0

我实际上能够让它工作。对我来说,关键是确保 register_setting() 对组使用相同的 slug,即使部分不同。本质上,我将第一部分的 slug 用作第一个参数,而不是每个部分的 slug。在我的设置中,这是使用我所谓的“页面”变量,因为我用它来定义选项页面。

我的部分和字段定义如下:

$sections=>array(
...

    'page_vars'=>array(
      'slug'=>'page_vars',
      'label'=>'Page Layout Variables',
    ),
    'display_defaults'=>array(
      'slug'=>'display_defaults',
      'label'=>'Display Defaults',
      'page' =>'page_vars',
    ),
    'blog_defaults'=>array(
      'slug'=>'blog_defaults',
      'label'=>'Blog Display Defaults',
      'page' =>'page_vars',
    ),


...
);

对应的字段:

$fields=>arry(
....
  'max_page_width'=>array(
      'slug'=>'max_page_width',
      'label'=>'Maximum width for page (Including header images - include unit)',
      'section'=>'page_vars',
      'args'=>array('default'=>'100vw'),
    ),
    'xl_max_body_width'=>array(
      'slug'=>'xl_max_body_width',
      'label'=>'Default content width for XL Screens (include unit)',
      'section'=>'page_vars',
      'args'=>array('default'=>'1600px'),
    ),
    'lg_max_body_width'=>array(
      'slug'=>'lg_max_body_width',
      'label'=>'Default content width for LG Screens (include unit)',
      'section'=>'page_vars',
      'args'=>array('default'=>'95vw'),
    ),
    'md_max_body_width'=>array(
      'slug'=>'md_max_body_width',
      'label'=>'Default content width for MD Screens (include unit)',
      'section'=>'page_vars',
      'args'=>array('default'=>'95vw'),
    ),
    'sm_max_body_width'=>array(
      'slug'=>'sm_max_body_width',
      'label'=>'Default content width for SM Screens (include unit)',
      'section'=>'page_vars',
      'args'=>array('default'=>'95vw'),
    ),
    'xs_max_body_width'=>array(
      'slug'=>'xs_max_body_width',
      'label'=>'Default content width for XS Screens (include unit)',
      'section'=>'page_vars',
      'args'=>array('default'=>'95vw'),
    ),
    'display_header'=>array(
      'slug'=>'display_header',
      'label'=>'Display auto-generated page heading by default',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'display_title'=>array(
      'slug'=>'display_title',
      'label'=>'Display auto-generated page title by default',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'display_meta'=>array(
      'slug'=>'display_meta',
      'label'=>'Display auto-generated page meta by default',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'display_thumb'=>array(
      'slug'=>'display_thumb',
      'label'=>'Display thumbnail at top of post',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'display_page_comments'=>array(
      'slug'=>'display_page_comments',
      'label'=>'Display comments on pages',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'display_post_comments'=>array(
      'slug'=>'display_post_comments',
      'label'=>'Display comments on posts',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'display_sidebar'=>array(
      'slug'=>'display_sidebar',
      'label'=>'Display sidebar by default',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'mobile_sidebar'=>array(
      'slug'=>'mobile_sidebar',
      'label'=>'Display sidebar on Mobile Devices',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'display_footer'=>array(
      'slug'=>'display_footer',
      'label'=>'Display footer by default',
      'section'=>'display_defaults',
      'page' =>'page_vars',
    ),
    'blog_display_header'=>array(
      'slug'=>'blog_display_header',
      'label'=>'Display auto-generated page heading by default',
      'section'=>'blog_defaults',
      'page' =>'page_vars',
    ),
    'blog_display_title'=>array(
      'slug'=>'blog_display_title',
      'label'=>'Display auto-generated page title by default',
      'section'=>'blog_defaults',
      'page' =>'page_vars',
    ),
    'blog_display_filter'=>array(
      'slug'=>'blog_display_filter',
      'label'=>'Display post filter above content',
      'section'=>'blog_defaults',
      'page' =>'page_vars',
    ),
...
);

然后我添加了一些处理函数来添加/注册部分和字段:

    // set up options record in database

  foreach ($sections as $section=>$def){
    $page = (isset($def['page']))? $def['page'] : $def['slug'];
    add_settings_section(
      'trs_harvest_'.$def['slug'],
      __('','trs-harvest'),
      array($this,$def['slug'].'_settings_cb'),
      'trs_harvest_'.$page
    );
  }

  foreach ($fields as $field=>$def){
    $page = (isset($def['page']))? $def['page'] : $def['section'];
    $args = (isset($def['args']))? $def['args'] :null;
    register_setting('trs_harvest_'.$page,'hvst_'.$def['slug'],$args);
    add_settings_field(
      'hvst_'.$def['slug'],
      __($def['label'],'trs-harvest'),
      array($this,$def['slug'].'_cb'),
      'trs_harvest_'.$page,
      'trs_harvest_'.$def['section'],
      array('label_for'=>'hvst_'.$def['slug'])
    );
  }

最后,当我添加选项页面时,我确保 settings_fields() 使用了第一部分(*重要说明是第一部分驱动这里的 nonce 字段)并且只创建了一组 settings_field() 和 _submit_button() 输出这页纸。:

将其用作 $sections:

array('trs_harvest_page_vars','trs_harvest_display_defaults','trs_harvest_blog_defaults')

以及此代码来设置选项页面输出:

        settings_fields( $sections[0]);
        foreach ($sections as $section){
            do_settings_sections( $section);
          }
          echo('</div>');
          submit_button('Save Settings');

这给了我一个包含多个部分的选项页面,我可以使用单个提交按钮保存这些部分。

于 2020-11-02T16:51:00.933 回答