'delete_option ()' удаляет только значение, а не пару ключ / значение

Недавно плагин, который я разрабатываю, начал вызывать ошибку всякий раз, когда я удалял параметры плагина (восстанавливал их по умолчанию).

Я использую 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 настроек и поощрить любых пользователей к этой удивительности сделать то же самое 🙂