我已经为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()输出页面的所有部分,因此必须有一种方法可以同时保存所有部分。
我唯一的其他办法是将所有字段组合到同一部分或创建单独的页面,如果可能的话我想避免。
答案 0 :(得分:2)
根据此法典代码,可能会有所帮助.... settings_fields
settings_fields函数的第一个参数应该是register_setting中声明的设置组。
但看起来你正在使用设置部分的名称,所以我甚至不确定它是如何工作的。“/ p>
您可以在一个页面上有两个或更多部分,但所有设置(即选项),无论它们在哪个部分,都必须是表单中相同设置组的一部分。组的隐藏字段(单数)通过魔术“settings_field”函数插入到表单的顶部。
但是你也可以在一个页面上有多个表单,每个表单都有自己的提交按钮和settings_fields('optiongroup'),但我个人认为页面上的多个提交按钮对用户来说非常混乱。
据我了解,限制因素是:
之间存在1对1比1的对应关系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');
这给了我一个选项页面,其中包含多个部分,我可以使用一个提交按钮将其保存。