Недавно плагин, который я разрабатываю, начал вызывать ошибку всякий раз, когда я удалял параметры плагина (восстанавливал их по умолчанию).
Я использую API-интерфейс настроек в соответствующем подключаемом модуле, а на другой странице я проверяю параметры, назначенные этим параметрам –
$login_settings = get_option('fgw_login', array());
После активации и после того, как я сохранил настройки, это работало нормально, при этом по умолчанию для array()
присваивается значение $login_settings
.
Однако я получал ошибку всякий раз, когда пытался сбросить параметры плагина до своих значений по умолчанию. В основном я хотел удалить пару ключ / значение из базы данных wp_options
.
/** * Sanitize the option on save */ public function on_save_settings($input){ /** Check to see if the options should be restored to default */ if(isset($_POST['delete'])) : delete_option('fgw_login'); return; endif; if(!isset($_POST['submit'])) return; // Ensure the user is supposed to be here {more stuff here, but not relevant} }
Однако казалось, что delete_option('fgw_login');
фактически не удалял пару ключ / значение для опции, а скорее просто значение, оставляя ключ на месте.
Это была проблема, потому что я проверял $login_settings
для определенного значения ключа массива, но поскольку $login_settings
устанавливался как пустая строка, я получал ошибку.
Я мог бы просто добавить чек, чтобы узнать, был ли $login_settings
массивом, но мне было любопытно, поэтому я сделал рытье. Если вы вообще заинтересованы, см. Мой ответ ниже …
Проблема здесь была вызвана тем, что я использовал обратный вызов sanitize, объявленный в функции register_settings()
( on_save_chages()
ниже).
Этот обратный вызов ультимативно обновляет базу данных любым возвращаемым значением, создавая ключ fgw_login
если он не существует.
Чтобы гарантировать, что у меня всегда был пустой пул по умолчанию, если требуется, я сделал следующее простое изменение, возвращая пустой массив, когда параметры были сброшены, а не ничего –
/** * Sanitize the option on save */ public function on_save_settings($input){ /** Check to see if the options should be restored to default */ if(isset($_POST['delete'])) : delete_option('fgw_login'); return array(); /** <-- THIS IS ALL I HAD TO DO */ endif; if(!isset($_POST['submit'])) return; // Ensure the user is supposed to be here {more stuff here, but not relevant} }
В то время как проблема разоблачила мой код для несоблюдения надлежащих проверок, я рад, что мне была предоставлена возможность более подробно углубиться в API настроек и поощрить любых пользователей к этой удивительности сделать то же самое 🙂