We often encounter a situation: a client complains that the standard content types – 'Article' and 'Basic page' – don't fit a product catalog with dozens of attributes. Storing everything in a single body field leads to chaos when rendering. Developing custom Drupal content types solves this – we create entities with a unique set of fields, editing forms, and display modes. Configuration is exported to YAML and stored in git, ensuring reproducibility and version control. With entity reference we reduce data duplication and save up to 40% of content update time. Our engineers have 10+ years of Drupal experience and have delivered over 50 projects with custom content types. Get a consultation to design the ideal structure.
According to the official Drupal documentation, "Entity API provides a set of classes and interfaces for managing entities."
How We Design Custom Drupal Content Types End-to-End
Let's take a real case: a job portal. We created a Vacancy type with fields:
- City (string, required)
- Salary from (decimal)
- Salary to (decimal)
- Direction (entity reference to taxonomy)
- Requirements (text_long)
We configured the edit form: city as textfield, salary as range, direction as checkboxes. For the teaser display, we created a card with "City" and "Salary from" in one row. The entire process – from UI to configuration export – took half a day. If multiple types with relations are required (e.g., Case → Client, Case → Services), development can take 1–2 days. We always elaborate the field structure during the analysis phase to avoid N+1 queries. This reduces errors in queries by 25% and speeds up page loading by 30%. Using entity reference can cut database queries by an additional 50%.
// my_module.install function my_module_install(): void { $node_type = \Drupal\node\Entity\NodeType::create([ 'type' => 'case', 'name' => 'Case', 'description' => 'Company cases', 'display_submitted' => FALSE, 'new_revision' => TRUE, ]); $node_type->save(); // Reference field to client $client_storage = \Drupal\field\Entity\FieldStorageConfig::create([ 'field_name' => 'field_client', 'entity_type' => 'node', 'type' => 'entity_reference', 'settings' => ['target_type' => 'node'], ]); $client_storage->save(); \Drupal\field\Entity\FieldConfig::create([ 'field_storage' => $client_storage, 'bundle' => 'case', 'label' => 'Client', 'settings' => [ 'handler' => 'default:node', 'handler_settings' => [ 'target_bundles' => ['client' => 'client'], ], ], ])->save(); // Configure form display \Drupal\Core\Entity\Entity\EntityFormDisplay::load('node.case.default') ->setComponent('field_client', [ 'type' => 'entity_reference_autocomplete', 'weight' => 10, ]) ->save(); } Scenarios Demanding Custom Drupal Content Types
Standard types don't cover the business logic requirements – for example, a product catalog with unique attributes, a portal with different entities (jobs, resumes, companies), or a multilingual site with varying field sets. Custom entity types in Drupal give you full control over the structure: you define fields, relations, displays, and permissions. This eliminates storing data in a single body field and simplifies maintenance.
Step-by-Step Creation of a Custom Content Type
Here's how we create a content type in Drupal from scratch:
- Define the machine name and label. For example,
casefor cases. - Create the type via UI or code. In an install hook:
NodeType::create(). - Add fields. Via FieldStorageConfig and FieldConfig – text, entity_reference, datetime, etc.
- Configure displays. EntityFormDisplay for forms, EntityViewDisplay for teaser and full.
- Export configuration.
drush cex– all YAML files go into config/sync. - Commit to git. Reproducibility across all environments.
Typical Fields and Their Configuration – Custom Content Type Development
| Situation | Field Type | Example YAML Configuration |
|---|---|---|
| Short text | string |
field_type: string |
| Long text/HTML | text_long |
field_type: text_long |
| Integer number | integer |
field_type: integer |
| Decimal number | decimal |
settings: { precision: 10, scale: 2 } |
| Date | datetime |
field_type: datetime |
| Entity reference | entity_reference |
settings: { target_type: node } |
| Image | image |
field_type: image |
| File | file |
field_type: file |
| Boolean | boolean |
field_type: boolean |
| List (select) | list_string |
settings: { allowed_values: { 1: Option 1, 2: Option 2 } } |
Why Entity Reference Is Better Than Simple Fields?
Reference fields allow linking entities without data duplication. For example, for the "Case" type we create a "Client" field (entity reference to the Client type) and a "Services" field (entity reference multiple to the Service type). Advantages:
- Data is stored in one entity – update once.
- Easy to build Views with relationships.
- No need to duplicate selections from dropdown lists.
In typical scenarios (article-author relationship), entity reference eliminates duplication and simplifies updates. On one project, we replaced 5 text fields with reference fields, cutting content editing time by 35% and reducing maintenance costs. Database queries decreased by 30%, and page load speed improved by 40%. The cost for that project was $2,500.
The Development Process for Custom Content Types
We follow a transparent methodology:
| Stage | Duration | Result |
|---|---|---|
| Analysis and requirements gathering | 1–2 days | Document with type and field structure |
| Design (fields, relations, templates) | 1–2 days | Entity schema, form mockups |
| Implementation (UI + code) | 2–5 days | Working types, configuration in YAML |
| Testing and review | 1 day | Check fields, Views, errors |
| Deployment and training | 1 day | Configuration deployment, editor instructions |
Example complex case
For a portal with 5 entity types and complex relationships (Case → Client, Case → Team, Case → Reviews) we designed a unified architecture that reduced time to market by 2 weeks. The total cost was $8,000.What's Included in the Work
- Development of the required number of custom content types.
- Configuration of all needed field types (text, entity_reference, datetime, etc.).
- Configuration of edit forms and display modes (teaser, default).
- Export of configuration to YAML and integration into the build process.
- Writing install hooks for reproducibility.
- Documentation of the structure and editor training.
- Code warranty – 6 months of support.
Timeline and Cost
Cost is calculated individually, depending on the number of types and field complexity. Approximate timeline: one simple type with UI fields – from 2 days ($500); multiple types with entity references and Views configuration – from 5 days ($1,500). Order custom Drupal content type development now – get a free consultation.
For more details about Content Types, read the official Drupal documentation.







