WordPress

Pole wyboru strony ustawień wtyczki nie jest zapisywane – jedna tablica opcji z tablicą podrzędną

  • 3 lipca, 2017
  • 3 min read
Pole wyboru strony ustawień wtyczki nie jest zapisywane – jedna tablica opcji z tablicą podrzędną


Doprowadzam się do szału, próbując uzyskać pole wyboru do zapisania na stronie ustawień wtyczki.

W tej chwili, jako szablon, pracuję nad doskonałym przykładem podanym tutaj: Settings API with arrays example

Odnoszę się również do bardzo przydatnego samouczka na stronie ze szczegółowym git na

Przeczytałem też około pół tuzina postów z podobnymi pytaniami, ale żaden nie ma mojej odpowiedzi, przynajmniej takiej, którą mogę znaleźć i zrozumieć.

Myślę, że natknąłem się na składnię funkcji check().

— Zaktualizowany kod —

Oto kluczowe fragmenty kodu:

Ogólne dane w funkcji wywołującej register_setting(), add_settings_section() i add_settings_fields

   $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_settings_field() dla pól wyboru:

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

Wywołanie zwrotne do renderowania 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: ');
}

Dane wyjściowe ze zrzutu debugowania początkowych zmiennych są zgodne z oczekiwaniami:

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:  = ''

Po próbie zapisania dostaję:

Values: = NULL

Wypróbowałem wiele wariacji sposobów na ustawienie cjhecked, ale nie mogę zapisać pól wyboru.

Warto przeczytać!  terminy - zamówienie niestandardowe get_terms


Źródło