IT-Service-WordPress / WPF

Шаблон плагина для WordPress (CMS)
GNU General Public License v2.0
0 stars 0 forks source link

Чтение и изменение опций - через объект плагина #45

Closed sergey-s-betke closed 10 years ago

sergey-s-betke commented 10 years ago

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

sergey-s-betke commented 10 years ago

Санитизация значений опций при сохранении выполняется только после вызова register_setting. Но только - при изменении значения (update_option). При чтении никакой дополнительной обработки кроме десериализации не выполняется.

Сериализация будет выполнена для нескалярных типов. И десериализация - аналогично.

Итого, для сложных опций (массивы, объекты) при чтении и так всё будет замечательно. А вот для простых скалярных - получим строку и всё.

При изменении опций на странице настроек плагина мы всегда получаем строки. Они проходят санитизацию, и именно результат санитизации отправляется в базу данных через maybe_serialize. Указанная функция сериализует только массивы и объекты.

Обойти это ограничение можно (у меня bool опции, и хотелось бы их получать после чтения именно как bool), перехватив фильтр 'pre_update_option_' . $option... Нет - нельзя. Если мы принудительно фильтром сериализуем скалярное значение, WordPress его повторно сериализует перед отправкой в БД, а при чтении - десериализует лишь один раз, в итоге - мы получим сериализованное значение при чтении.

Напрашивалось бы решение: при санитизации оборачивать скалярные типы в объектную обёртку. Но тогда мы и при чтении получим эту обёртку, а не то значение, которое ожидаем...

sergey-s-betke commented 10 years ago

Однако, если мы договоримся читать и писать опции только через наши обёртки - тогда вполне можно действительно писать и читать только объекты. Но санитизатор будет получать строковое значение (в частности - при изменении значения свойства через страницу настроек), а возвращать уже должен объект.

Итак, на таком варианте и остановимся:

sergey-s-betke commented 10 years ago

Leave a comment