Elisseii
@Elisseii
Пишу музыку и код.

Страница кастомных настроек для Wordpress не хочет сохранять пустые checkbox. Что делать?

Друзья, не пойму что за баг. Может я что-то упустил или не знаю в PHP? Нужна помощь.

Есть кастомная страничка настроек в админке, с множеством чекбоксов:
4323b83f716d442c999bd4674823b45b.PNG

Но проблема в том, что если все чекбоксы не отмечены как unchecked (без галочки) то при сохранении вылезает Warning ошибка.
Illegal string offset

Выглядит это так:
c7fc2047cf6349cca2f570548757bce1.PNG

Прикладываю весь PHP код функций вывода этой страницы настроек. Может увидите ошибку.

<?php
//Настройки панели администрирования
//Регистрация функции настроек
function theme_settings_init(){
    register_setting( 'theme_settings', 'theme_settings' );
}
// Добавление настроек в меню страницы
function add_settings_page() {
add_menu_page( __( 'Опции темы' ), __( 'Опции темы' ), 'manage_options', 'settings', 'theme_settings_page');
}
//Добавление действий
add_action( 'admin_init', 'theme_settings_init' );
add_action( 'admin_menu', 'add_settings_page' );
//Сохранение настроек
function theme_settings_page() { 
global $select_options; if ( ! isset( $_REQUEST['settings-updated'] ) ) $_REQUEST['settings-updated'] = false;
?>
<div>
<h2 id="title">Настройка темы</h2>
<?php if ( false !== $_REQUEST['settings-updated'] ) : ?>
<div id="message" class="updated">
<p><strong>Настройки сохранены</strong></p>
</div>
<?php endif; ?>
<form method="post" action="options.php">
<?php settings_fields( 'theme_settings' ); ?>
<?php $options = get_option( 'theme_settings' ); ?>
<table>

<tr valign="top">
<td>Чекбокс 1:</td>
<td><input type="checkbox" name="theme_settings[show_block_1]" id="theme_settings[show_block_1]" value="1"<?php if($options[show_block_1]=='1') echo ' checked="checked"';?> /></td>
</tr>

<tr valign="top">
<td>Чекбокс 2:</td>
<td><input type="checkbox" name="theme_settings[show_block_2]" id="theme_settings[show_block_2]" value="1"<?php if($options[show_block_2]=='1') echo ' checked="checked"';?> /></td>
</tr>

<tr valign="top">
<td>Чекбокс 3:</td>
<td><input type="checkbox" name="theme_settings[show_block_3]" id="theme_settings[show_block_3]" value="1"<?php if($options[show_block_3]=='1') echo ' checked="checked"';?> /></td>
</tr>

<tr valign="top">
<td>Чекбокс 4:</td>
<td><input type="checkbox" name="theme_settings[show_block_4]" id="theme_settings[show_block_4]" value="1"<?php if($options[show_block_4]=='1') echo ' checked="checked"';?> /></td>
</tr>


</table>
<p><input name="submit" id="submit" class="button button-primary" value="Сохранить" type="submit"></p>
</form>
</div>
<?php } ?>


Может что то не так с базой данных? Где хранятся эти настройки? Но вроде как потестил уже на разных wp сайтах, везде всё тоже самое...
Что здесь не так?
  • Вопрос задан
  • 755 просмотров
Решения вопроса 2
deniscopro
@deniscopro Куратор тега WordPress
WordPress-разработчик, denisco.pro
Попробуйте добавить перед каждым чекбоксом соответствующий input type="hidden"
<input type="hidden" name="theme_settings[show_block_1]" value="0">


P.S. Для вывода checked="checked" есть встроенная функция checked().
Ответ написан
@MrTimon
Вообще у Вас в каждом выводе чекбокса
<td><input type="checkbox" name="theme_settings[show_block_2]" id="theme_settings[show_block_2]" value="1"<?php if($options[show_block_2]=='1') echo ' checked="checked"';?> /></td>

ошибка здесь $options[show_block_2]=='1' должно быть так $options['show_block_2']=='1') поидеи, тоить добавте кавычки в масиве.

И да, чтобы сохранить 0 для этих значений вам нужно добавить
<input type="hidden" name="theme_settings[show_block_1]" value="0">

перед каждым чекбоксом
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
maxxannik
@maxxannik
Сайты на WordPress + Интернет магазины WooCommerce
1. Как уже было сказано тут лучше использовать Customizer API
2. Если уж очень хочется в панели, то надо детальней изучать Settings API. У вас не правильно формируется страница настроек. Вообще. Ни одной правильной строки нет. Надо с нуля всю матчасть изучать.
Ответ написан
Вы используете ACF. Используйте их полностью. В PRO версии можно делать страницы с настройками. Там есть все элементами ACF.

Лицензия позволяет скачать бесплатно - https://github.com/wp-premium/advanced-custom-fiel...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы