Февраль
24
2012

WordPress хранение объекта в БД

WordPress хранение объекта в БД

При разработке своего плагина TI Stat я решил воспользоваться всеми преимуществами ООП и описал большую часть функционала в виде классов, а для ускорения и удобства хранить эти объекты в базе данных в виде свойств (options). Удобный метод, но в некоторых ситуациях он вызывает ошибки.

PHP Fatal error: admin_ti_stat_options() [function.admin-ti-stat-options]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition «Yauth» of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition

Особенности сериализации

Для хранения в базе данных объект сериализируется (serialize) при этом сохраняется название класса и данные, а методы опускаются.

При восстановления объекта (unserialize) создается новый экземпляр класса, куда экспортируются все данные объекта. А методы берутся из объявления класса.

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

Autoload

В большинстве случаев для успешной работы с объектами в wordpress хватает использования соответствующих функций update_option() и get_option(). При этом класс должен быть описан до вызова функции get_option(). Но в некоторых случаях такой подход дает сбой, например мой прекрасный код на одном из сайтов в упор не хотел работать.

Установить конкретного виновника мне не удалось, так как ошибка на моем сервере не воспроизводилась, но есть подозрение что она связана с модулями для ускорения базы данных WordPress. Хотя вины их особой нет.

Ошибка заключалась в том, что для создания записи в опциях использовалась стандартная функция update_option(), стандартным для которой является выставлять значение $autoload=yes. При таком поведении настройки достаются из базы данных все сразу, во время первого обращения, а при использовании ускорителя БД до инициализации плагина и объявления соответствующего класса. Как итог неполный экземпляр класса, с отсутствие методов.

Для отключения такого поведения следует создавать новые записи в опциях функцией add_option(), с обязательным указанием $autoload=’no’.

Я поместил этот код в функцию активации плагина, чтобы он срабатывал единожды при первой активации.

Это работает только когда запись не существует. Если же запись создана ранее, то следует удалить ее и активировать плагин снова.

Неправильная раскладка: цщквзкуыы [hfytybt j,]trnf d ,l

Понравилась статья? Посоветуйте друзьям!

PHP WordPress


Понравилась статья? Подпишись на рассылку по E-Mail или в RSS.
  • Спасибо! Вы упрощаете нашу работу! :)
  • Автор молодец, докопался у меня б терпения не хватило б