Regarding where to store widgets (Options, Posts, or a new table): This looks like a good opportunity to use an Object Relational Mapping (ORM) pattern to forever hide these low level schema alternatives from higher level code.

When the schema and/or higher level object model changes, the Object Relational Mapper(s) would be updated. By this changes in the schema or object models don't affect the other -- but only the mapper in between needs to be updated, thereby greatly localizing (potentially) breaking changes.

While there are fancy/high price ORM packages, I've had great success just hard coding the mappers. While it might be a bit more manual (grunt) work, it's easy, and the mapping remains performant.