Wordpress同时保存多个设置部分

时间:2012-11-13 12:32:36

标签: wordpress

我已经为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()输出页面的所有部分,因此必须有一种方法可以同时保存所有部分。

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

3 个答案:

答案 0 :(得分:2)

根据此法典代码,可能会有所帮助.... settings_fields

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

但看起来你正在使用设置部分的名称,所以我甚至不确定它是如何工作的。“/ p>

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

但是你也可以在一个页面上有多个表单,每个表单都有自己的提交按钮和settings_fields('optiongroup'),但我个人认为页面上的多个提交按钮对用户来说非常混乱。

据我了解,限制因素是:

之间存在1对1比1的对应关系
  • 页面上的表单
  • 该表单中的提交按钮
  • 该表单中的settings_fields

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

呼! : - )

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

$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');

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