我想在插件设置页面上保存一个复选框,这让我抓狂。
现在,作为一个模板,我正在学习下面给出的一个很好的示例:Settings API with arrays example
我还提到了一个非常有用的教程https://www.smashingmagazine.com/2016/04/three-approaches-to-adding-configurable-fields-to-your-plugin/ 详细的git位于https://github.com/rayman813/smashing-custom-fields/blob/master/smashing-fields-approach-1/smashing-fields.php
我也读过大约六篇有类似问题的帖子,但都没有我的答案,至少我能找到并理解。
我想我在checked()函数的语法上遇到了障碍。
--- Updated code ---
以下是关键代码:
调用register\\u setting()、add\\u settings\\u section()和add\\u settings\\u字段的函数中的总体数据
$option_name = \'rpq_plugin_option_name\'; // free to choose this name
// Fetch existing options.
$option_values = get_option( $option_name );
$default_values = array (
\'number\' => 500,
\'color\' => \'blue\',
\'long\' => \'\',
\'activity\' => array(
\'baseball\' => \'\',
\'golf\' => \'\',
\'hockey\' => \'\')
);
$data = shortcode_atts( $default_values, $option_values );
复选框的add\\u settings\\u字段()
add_settings_field(
\'section_2_field_2\',
\'Checkboxes\',
\'rpq_plugin_render_section_2_field_2\', // callback to render html
\'rpq-default-settings\', // menu slug
\'section_2\',
array (
\'label_for\' => \'label4\', // makes the field name clickable,
\'name\' => \'activity\', // value for \'name\' attribute
\'value\' => array_map( \'esc_attr\', $data[\'activity\'] ) ,
\'options\' => array (
\'baseball\' => \'Baseball\',
\'golf\' => \'Golf\',
\'hockey\' => \'Hockey\'
),
\'option_name\' => $option_name
)
);
用于呈现html的回调:
function rpq_plugin_render_section_2_field_2( $args )
{
$options_markup = \'\';
$iterator = 0;
$values = $args[\'value\'];
$options = $args[\'options\'];
rpq_plugin_debug_var( $options, \'Options: \' );
rpq_plugin_debug_var( $values, \'Values: \' );
foreach ( $args[\'options\'] as $key => $title ) {
rpq_plugin_debug_var( $key, \'Key: \' );
rpq_plugin_debug_var( $title, \'Title: \' );
$checked = checked((in_array($title, $values)), true, false);
rpq_plugin_debug_var($checked, \'Checked: \');
$iterator ++;
$options_markup .= sprintf(
\'<label for="%1$s_%6$s"><input id="%1$s_%6$s" name="%1$s[%2$s]" type="checkbox" value="%3$s" %4$s /> %5$s</label><br/>\',
$args[\'option_name\'],
$args[\'name\'],
$key,
$checked,
$title,
$iterator
);
}
printf( \'<fieldset>%s</fieldset>\', $options_markup );
//print \'</select>\';
rpq_plugin_debug_var( $values, \'Values: \');
}
初始变量调试转储的输出如我所料:
Options: = array (
\'baseball\' => \'Baseball\',
\'golf\' => \'Golf\',
\'hockey\' => \'Hockey\',
)
Values: = array (
\'baseball\' => \'\',
\'golf\' => \'\',
\'hockey\' => \'\',
)
Key: = \'baseball\'
Title: = \'Baseball\'
Checked: = \'\'
Key: = \'golf\'
Title: = \'Golf\'
Checked: = \'\'
Key: = \'hockey\'
Title: = \'Hockey\'
Checked: = \'\'
尝试保存后,我得到:
Values: = NULL
我尝试了多种方法来设置cjhecked,但无法保存复选框。
SO网友:user41091
我终于得到了这个。我将为任何其他像我这样没有经验的人编写解决方案,他们在使用一个选项数组时试图处理复选框数组。
首先,我在问题顶部链接了两篇文章,这两篇文章有助于学习该主题的基本知识。
解决方案-第一部分:
我使用了一个选项数组和所有可能的选项,以及一个值数组来保存选中的项目。我创建的值数组不正确。与其说它是一个关联数组,不如说它只是一个“常规数组”,只包含选项数组中的键。
因此,在我的设置中,不是将默认设置中的“活动”设置为
array (
\'baseball\' => \'\',
\'golf\' => \'\',
\'hockey\' => \'\'
),
我只想
array ()
解决方案-第二部分
如果未选中任何复选框,则保存设置时,$values数组将变为NULL。但我需要使用需要数组的函数来进行验证和评估复选框的测试。所以我需要确保$值始终是一个数组。所以我需要
if (is_null($data[\'activity\'])) {
$data[\'activity\'] = array();
}
解决方案-第3部分
我的checked()函数错误。如前所述修复数组后,我将搜索$选项数组中的当前$键是否是$值数组中的值。
$checked = checked((in_array($key, $values)), true, false);
解决方案-第4部分
由于“activities”是选项值的子数组,我需要在checkbox语句中设置name变量来反映这一点。
所以我用
name="%1$s[%2$s][]"
产生
name="rpq_plugin_option_name[activity][]"
现在,我的复选框将更新并保存。