Closed sergey-s-betke closed 10 years ago
Санитизация значений опций при сохранении выполняется только после вызова register_setting
. Но только - при изменении значения (update_option
). При чтении никакой дополнительной обработки кроме десериализации не выполняется.
Сериализация будет выполнена для нескалярных типов. И десериализация - аналогично.
Итого, для сложных опций (массивы, объекты) при чтении и так всё будет замечательно. А вот для простых скалярных - получим строку и всё.
При изменении опций на странице настроек плагина мы всегда получаем строки. Они проходят санитизацию, и именно результат санитизации отправляется в базу данных через maybe_serialize
. Указанная функция сериализует только массивы и объекты.
Обойти это ограничение можно (у меня bool опции, и хотелось бы их получать после чтения именно как bool), перехватив фильтр 'pre_update_option_' . $option
... Нет - нельзя. Если мы принудительно фильтром сериализуем скалярное значение, WordPress его повторно сериализует перед отправкой в БД, а при чтении - десериализует лишь один раз, в итоге - мы получим сериализованное значение при чтении.
Напрашивалось бы решение: при санитизации оборачивать скалярные типы в объектную обёртку. Но тогда мы и при чтении получим эту обёртку, а не то значение, которое ожидаем...
Однако, если мы договоримся читать и писать опции только через наши обёртки - тогда вполне можно действительно писать и читать только объекты. Но санитизатор будет получать строковое значение (в частности - при изменении значения свойства через страницу настроек), а возвращать уже должен объект.
Итак, на таком варианте и остановимся:
Leave a comment
Целесообразно создать базовый абстрактный класс коллекции свойств, от которого унаследовать классы для коллекции опций плагина, и метаданных плагина.