插件设置页面复选框未保存-一个选项数组和子数组

时间:2017-07-03 作者:user41091

我想在插件设置页面上保存一个复选框,这让我抓狂。

现在,作为一个模板,我正在学习下面给出的一个很好的示例: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,但无法保存复选框。

1 个回复
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][]"
现在,我的复选框将更新并保存。

结束

相关推荐

ARRAY_MERGE()函数中的非数组参数

我正在构建一个小插件,基本上有一个设置页面,其中包含四个文本字段和两个复选框。一切正常,包括复选框,只要其中一个或两个都打勾。如果没有,我会收到一条错误消息,说:警告:array\\u merge():参数#2不是。。。这将是minevalg\\u hent\\u innstillinger函数中的第二个参数;function minevalg_hent_innstillinger() { $defaults = array(); // define this so