1. Option: Paragraphs
Check out Paragraphs module.
Instead of putting all your content in one WYSIWYG body field, your content will exist of a paragraph field containing multiple paragraph items. Paragraph items can contain multiple fields and have different types of field sets(bundles),
You create a few paragraphs bundles with fields, and then add one paragraphs field to the page content type.
2. Option: Nestedbox + Inline entity form + Entity reference
An alternative to Paragraphs is Nestedbox in combination with Inline entity form. There is an issue discussing the differences to Paragraphs.
Nestedbox itself just defines an entity type. You could use regular nodes or any other entity type instead. but the benefit of nestedbox is that this entity type has no other side effects.
3. Option: Bean + Inline entity form + Entity reference.
Instead of the nestedbox entity type, some people might prefer Bean for the entity type. The downside is that every bean is also a block, so it would spam the form at admin/structure/block.
The benefit is that you can reuse the same bundles definitions.
Common techniques with all these options
Field types that are very useful in paragraphs / nestedbox (besides the basic field types):
- Block reference to embed blocks.
- View reference to embed views displays.
- The paragraphs field type itself, which allows you to embed paragraphs within a paragraph. E.g. for a multi column layout.
- Or instead, the entityreference field type, allowing you to embed nestedbox entites within a nestedbox entity.
For the paragraphs or nestedbox display you can use Display suite. You can create custom layouts to achieve e.g. multi-column sections. Field formatters are also a thing you should play with. And Field templates are awesome.
You can export paragraphs and nestedbox and bean bundles with Features, so you can reuse them on another site.