Как сохранить параметры чекбоксов на странице настроек плагина

Вопрос или проблема

Прежде всего: я действительно новичок. Поэтому я использовал шаблон для своей страницы настроек и пытался его настроить (пока работает довольно хорошо).

О моем плагине:
Он создает два типа записей и несколько метабоксов внутри них. Метабоксы имеют несколько полей, и сохранение полей пока работает довольно хорошо.

Теперь я перехожу к тому моменту, когда я хочу, чтобы мои настройки не только отображались на странице настроек, но и сохранялись значения, которые были введены.

Я пробую это с помощью “короткого отрывка”, так как все остальные опции работают так же.

<?php
add_action( 'admin_menu', 'my_admin_menu' );
function my_admin_menu() {
add_options_page( __('Nutri+', 'nutriplus' ), __('Nutri+', 'nutriplus' ), 'manage_options', 'my-plugin', 'my_options_page' );
}
add_action( 'admin_init', 'my_admin_init' );

function my_admin_init() {
register_setting( 'my-settings-group', 'my-plugin-settings' );
add_settings_section( 'section-1', __( 'Общие настройки', 'nutriplus' ), 'section_1_callback', 'my-plugin' );
add_settings_field( 'field-1-1', __( 'Включить тип записи "Еда"', 'nutriplus' ), 'field_1_1_callback', 'my-plugin', 'section-1' );
add_settings_field( 'field-1-2', __( '- Включить метабокс "Пищевая информация"', 'nutriplus' ), 'field_1_2_callback', 'my-plugin', 'section-1' );
add_settings_field( 'field-1-3', __( '- Включить метабокс "Дополнительная информация"', 'nutriplus' ), 'field_1_3_callback', 'my-plugin', 'section-1' );
add_settings_field( 'field-1-4', __( 'Включить тип записи "Диета"', 'nutriplus' ), 'field_1_4_callback', 'my-plugin', 'section-1' );

function my_options_page() {
?>
  <div class="wrap">
      <h2><?php _e('Настройки Nutri+', 'nutriplus'); ?></h2>
      <form action="options.php" method="POST" class="np-options">
      <?php settings_fields('my-settings-group'); ?>
      <?php do_settings_sections('my-plugin'); ?>
      <?php submit_button(); ?>
      </form>
  </div>
<?php }

function section_1_callback() {
_e( 'Здесь вы можете настроить Nutri+ для каждого типа записи и включить/выключить функции.', 'nutriplus' );
}
function field_1_1_callback() {

$settings = (array) get_option( 'my-plugin-settings' );
$field = "field_1_1";
$value = esc_attr( $settings[$field] );
 echo "<input id='enable_food_post_type' name="my-plugin-settings[$field]" type="checkbox" value="true" checked />";
}
function field_1_2_callback() {

$settings = (array) get_option( 'my-plugin-settings' );
$field = "field_1_2";
$value = esc_attr( $settings[$field] );
 echo "<input id='enable_nutition_meta_box' name="my-plugin-settings[$field]" type="checkbox" value="true" checked />";
}
function field_1_3_callback() {

$settings = (array) get_option( 'my-plugin-settings' );
$field = "field_1_3";
$value = esc_attr( $settings[$field] );
 echo "<input id='enable_additional_meta_box' name="my-plugin-settings[$field]" type="checkbox" value="true" checked />";
}
function field_1_4_callback() {

$settings = (array) get_option( 'my-plugin-settings' );
$field = "field_1_4";
$value = esc_attr( $settings[$field] );
 echo "<input id='enable_diet_post_type' name="my-plugin-settings[$field]" type="checkbox" value="true" checked />";
}

function my_settings_validate_and_sanitize( $input ) {

$settings = (array) get_option( 'my-plugin-settings' );

    if ( $some_condition == $input['field_1_1'] ) {
    $output['field_1_1'] = $input['field_1_1'];
    } else {
    add_settings_error( 'my-plugin-settings', 'invalid-field_1_1', __('Ошибка в поле "Включить тип записи "Еда"', 'nutriplus'), 'error' );
    }
    if ( $some_condition == $input['field_1_2'] ) {
    $output['field_1_2'] = $input['field_1_2'];
    } else {
    add_settings_error( 'my-plugin-settings', 'invalid-field_1_2', __('Ошибка в поле "Включить метабокс "Пищевая информация"', 'nutriplus'), 'error' );
        }
    if ( $some_condition == $input['field_1_3'] ) {
    $output['field_1_3'] = $input['field_1_3'];
    } else {
    add_settings_error( 'my-plugin-settings', 'invalid-field_1_3', __('Ошибка в поле "Включить метабокс "Дополнительная информация"', 'nutriplus'), 'error' );
    }
    if ( $some_condition == $input['field_1_4'] ) {
    $output['field_1_4'] = $input['field_1_4'];
    } else {
    add_settings_error( 'my-plugin-settings', 'invalid-field_1_4', __('Ошибка в поле "Включить тип записи "Диета"', 'nutriplus'), 'error' );
    }

return $output;
}
  1. Я не знаю, нужно ли очищать или проверять флажки…
  2. Я не знаю, как сохранить текущее значение и, конечно, загрузить его по умолчанию. Я нашел примеры с функциями php вместо value = “xxx”, но не знаю, как это включить.
  3. И да… я знаю… атрибут checked не должен быть там, когда текущее значение должно появиться 🙂

Может быть, кто-то может мне помочь

Я не знаю, нужно ли очищать или проверять флажки…

Да, вы должны очищать. В противном случае зловредные пользователи или коды могут изменить значения в вашей базе данных. Ознакомьтесь с документацией sanitize_option.

Проверка зависит от вас. Если опции необходимо проверять по какой-то причине (например, по крайней мере 2 опции проверены), вы должны проверить это и предоставить обратную связь пользователям.

Я не знаю, как сохранить текущее значение и, конечно, загрузить его по умолчанию. Я нашел примеры с функциями php вместо value = “xxx”, но не знаю, как это включить.

Ознакомьтесь с документацией add_option, чтобы понять, как создавать новые опции (а также обновлять их).

Чтобы загрузить их по умолчанию, сначала вы должны получить их значение с помощью get_option. Затем вы должны использовать встроенный метод checked(), предоставленный WordPress.

И да… я знаю… атрибут checked не должен быть там, когда текущее значение должно появиться 🙂

Я думаю, что я уже ответил выше

Ответ или решение

Чтобы сохранить параметры чекбоксов на странице настроек плагина WordPress, вам нужно понимать, как правильно управлять значениями этих чекбоксов, а также их корректным отображением на странице. Рассмотрим шаги, которые помогут вам в этом.

1. Создание структуры настроек

Вы уже создали основную структуру для страницы настроек плагина с использованием функций WordPress. Для начала вы привязали страницу к меню администратора с помощью add_options_page, зарегистрировали настройки с помощью register_setting, и добавили секцию и поля настроек с помощью add_settings_section и add_settings_field.

2. Работа с значениями чекбоксов

Каждое из полей должно правильно представлять текущее значение в базе данных, когда пользователь открывает страницу настроек. В вашем коде, когда вы создаете чекбокс, используйте функцию checked() для проверки значения чекбокса.

Вот как можно отобразить чекбоксы с текущими значениями:

function field_1_1_callback() {
    $settings = (array) get_option('my-plugin-settings');
    $field = 'field_1_1';
    $checked = isset($settings[$field]) ? 'checked' : ''; // Проверяем сохранённое значение
    echo "<input id='enable_food_post_type' name='my-plugin-settings[$field]' type='checkbox' value='true' {$checked} />";
}

Такой же подход используйте для других чекбоксов. Убедитесь, что вы задаете значение checked в зависимости от того, сохранено ли значение в базе данных.

3. Сохранение и обработка данных

Когда пользователь отправляет форму, нужно правильно сохранить значения чекбоксов. Когда чекбокс не отмечен, данных для этого поля не будет в массиве $_POST. Поэтому мы должны явно задавать false, если оно не установлено.

Вам нужно обновить функцию для валидации и сохранения данных:

function my_settings_validate_and_sanitize($input) {
    $output = []; // Создаем пустой массив для возвращаемых данных

    // Обрабатываем каждый чекбокс
    $output['field_1_1'] = !empty($input['field_1_1']) ? 'true' : 'false';
    $output['field_1_2'] = !empty($input['field_1_2']) ? 'true' : 'false';
    $output['field_1_3'] = !empty($input['field_1_3']) ? 'true' : 'false';
    $output['field_1_4'] = !empty($input['field_1_4']) ? 'true' : 'false';

    return $output; // Возвращаем обработанные данные
}

4. Валидация и санитация

Да, чекбоксы следует санировать, чтобы избежать нежелательного изменения данных вашей базы. Можно использовать функцию sanitize_text_field() для обработки значений, полученных из чекбоксов. Здесь вы можете также добавить валидацию по своему усмотрению — например, проверка на обязательность некоторых полей.

Пример валидации:

if ($output['field_1_1'] === 'false' && $output['field_1_2'] === 'false') {
    add_settings_error('my-plugin-settings', 'invalid-fields', __('You must enable at least one option.', 'nutriplus'), 'error');
}

5. Дефолтные значения

Чтобы иметь возможность устанавливать дефолтные значения для вашего плагина, используйте функцию add_option() во время активации плагина:

register_activation_hook(__FILE__, 'my_plugin_activate');

function my_plugin_activate() {
    $default_settings = [
        'field_1_1' => 'false',
        'field_1_2' => 'false',
        'field_1_3' => 'false',
        'field_1_4' => 'false',
    ];
    add_option('my-plugin-settings', $default_settings);
}

Заключение

Теперь, когда вы знаете, как сохранить значения чекбоксов на странице настроек вашего плагина, вы можете адаптировать предоставленные примеры к другим элементам вашего плагина. Не забывайте о важности валидации и санитации данных, чтобы гарантировать безопасность и корректность работы вашего плагина. Если у вас есть дополнительные вопросы или вам нужна дальнейшая помощь, не стесняйтесь обращаться к сообществу разработчиков WordPress, которое всегда готово помочь.

Оцените материал
Добавить комментарий

Капча загружается...