# Orchardcore Content Parts

> Skill for adding and configuring common built-in Orchard Core content parts. Covers selected settings, Liquid rendering, migration patterns, and recipe configuration. Use this skill when requests mention Orchard Core Content Parts, Add and Configure Content Parts, General Pattern for Attaching a Part, TitlePart, TitlePart Settings, TitlePart Migration, or closely related Orchard Core implementation, setup, extension, or troubleshooting work. Strong matches include work with OrchardCore.Title, OrchardCore.Autoroute, OrchardCore.Html, HtmlBodyPartSettings, OrchardCore.Markdown, MarkdownBodyPartSettings, OrchardCore.Lists, OrchardCore.Flows, OrchardCore.Alias, OrchardCore.PublishLater, OrchardCore.ContentLocalization, OrchardCore.Taxonomies, OrchardCore.Seo, OrchardCore.ContentPreview. It also helps with content parts examples, TitlePart Settings, TitlePart Migration, TitlePart with Generated Title, plus the code patterns, admin flows, recipe steps, and referenced examples captured in this skill.

- Skill: `crestapps/orchardcore-content-parts` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add crestapps/orchardcore-content-parts`
- Raw SKILL.md: https://api.skillmd.com/api/skills/crestapps/orchardcore-content-parts/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- License: Apache-2.0
- Author: CrestApps (https://skillmd.com/u/crestapps)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/crestapps/orchardcore-content-parts

---


# Orchard Core Content Parts - Prompt Templates

## Add and Configure Content Parts

You are an Orchard Core expert. Generate migration code and recipes for attaching common built-in content parts.

### Guidelines

- Parts are attached to content types using `AlterTypeDefinitionAsync` in a migration.
- Each part has specific settings that control its behavior.
- Part settings are applied via `.WithSettings(new XxxPartSettings { ... })`.
- Use `.WithPosition("N")` to control the order of parts in the editor.
- Content part editor wrapper placement uses `ContentPart_Edit` with differentiator `{ContentType}-{PartName}` when you need to move or hide the whole editor row.
- Part display shapes and inner `XxxPart_Edit` shapes from part drivers typically use `{PartName}` as the differentiator.
- Third-party modules providing parts (CrestApps, Lombiq, etc.) must be installed as NuGet packages in the web project (the startup project of the solution), not just in the module project.
- Always seal classes.

### General Pattern for Attaching a Part

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("{{PartName}}", part => part
        .WithPosition("{{Position}}")
        .WithSettings(new {{PartName}}Settings
        {
            // Part-specific settings
        })
    )
);
```

---

## TitlePart

Provides a title/display text for a content item. Feature: `OrchardCore.Title`.

### TitlePart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `Options` | TitlePartOptions | `Editable` | Title behavior: `Editable`, `GeneratedDisabled`, `GeneratedHidden`, `EditableRequired`. |
| `Pattern` | string | `""` | Liquid pattern to generate the title (used with `GeneratedDisabled` or `GeneratedHidden`). |
| `RenderTitle` | bool | `true` | Whether to render the title in the content shape. |
| `Placeholder` | string | `""` | Placeholder for the title editor. |

### TitlePart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("TitlePart", part => part
        .WithPosition("0")
        .WithSettings(new TitlePartSettings
        {
            Options = TitlePartOptions.EditableRequired,
            RenderTitle = true
        })
    )
);
```

### TitlePart with Generated Title

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("TitlePart", part => part
        .WithPosition("0")
        .WithSettings(new TitlePartSettings
        {
            Options = TitlePartOptions.GeneratedDisabled,
            Pattern = "{{ ContentItem.Content.{{ContentType}}.Name.Text }} - {{ ContentItem.Content.{{ContentType}}.Date.Value | date: '%Y-%m-%d' }}"
        })
    )
);
```

---

## AutoroutePart

Generates a URL (slug) for a content item. Feature: `OrchardCore.Autoroute`.

### AutoroutePart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `AllowCustomPath` | bool | `false` | Whether users can define a custom path. |
| `Pattern` | string | `"{{ ContentItem.DisplayText \| slugify }}"` | Liquid pattern to generate the slug. |
| `ShowHomepageOption` | bool | `false` | Whether to show the "Set as homepage" option. |
| `AllowUpdatePath` | bool | `false` | Whether to allow re-generating the path on data change. |
| `AllowDisabled` | bool | `false` | Whether to allow disabling autoroute on individual items. |
| `AllowRouteContainedItems` | bool | `false` | Whether to route contained items. |
| `ManageContainedItemRoutes` | bool | `false` | Whether this part manages contained item routes. |
| `AllowAbsolutePath` | bool | `false` | Whether to allow absolute paths for contained items. |

### AutoroutePart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("AutoroutePart", part => part
        .WithPosition("1")
        .WithSettings(new AutoroutePartSettings
        {
            AllowCustomPath = true,
            ShowHomepageOption = false,
            Pattern = "{{ ContentItem.DisplayText | slugify }}",
            AllowUpdatePath = true
        })
    )
);
```

---

## HtmlBodyPart

Provides a rich HTML body editor. Feature: `OrchardCore.Html`.

`RenderLiquid` and `SanitizeHtml` are independent settings. Liquid can be
rendered while sanitization remains enabled, or both can be disabled when the
content is trusted and must remain unchanged.

### HtmlBodyPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `SanitizeHtml` | bool | `true` | Whether to sanitize HTML content. |
| `RenderLiquid` | bool | `false` | Whether to evaluate Liquid before rendering the HTML. |

### HtmlBodyPart Editors

| Editor | Description |
|---|---|
| *(default)* | Standard rich text editor. |
| `Wysiwyg` | WYSIWYG HTML editor. |
| `Trumbowyg` | Trumbowyg WYSIWYG editor. |
| `Monaco` | Monaco code editor. |

### HtmlBodyPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("HtmlBodyPart", part => part
        .WithPosition("2")
        .WithEditor("Wysiwyg")
        .WithSettings(new HtmlBodyPartSettings
        {
            SanitizeHtml = true,
            RenderLiquid = false
        })
    )
);
```

---

## MarkdownBodyPart

Provides a Markdown body editor. Feature: `OrchardCore.Markdown`.

`RenderLiquid` and `SanitizeHtml` are independent settings. Liquid is
evaluated before Markdown output is rendered, while sanitization controls the
resulting HTML.

### MarkdownBodyPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `SanitizeHtml` | bool | `true` | Whether to sanitize HTML output. |
| `RenderLiquid` | bool | `false` | Whether to evaluate Liquid before rendering Markdown. |

### MarkdownBodyPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("MarkdownBodyPart", part => part
        .WithPosition("2")
        .WithSettings(new MarkdownBodyPartSettings
        {
            SanitizeHtml = true,
            RenderLiquid = false
        })
    )
);
```

---

## ListPart

Makes a content type a container for other content items. Feature: `OrchardCore.Lists`.

### ListPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `PageSize` | int | `10` | Number of items to display per page. |
| `EnableOrdering` | bool | `false` | Whether to allow manual ordering. |
| `ContainedContentTypes` | string[] | `[]` | Content types that can be contained. |
| `ShowHeader` | bool | `true` | Whether to show the list header. |
| `ShowFullPager` | bool | `false` | Whether to render the full pager. |

### ListPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("Blog", type => type
    .WithPart("ListPart", part => part
        .WithPosition("3")
        .WithSettings(new ListPartSettings
        {
            PageSize = 10,
            EnableOrdering = false,
            ContainedContentTypes = new[] { "BlogPost" },
            ShowHeader = true
        })
    )
);
```

---

## FlowPart

Enables a content type to contain a flow of widget content items. Feature: `OrchardCore.Flows`.

### FlowPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `ContainedContentTypes` | string[] | `[]` | Content types that can be added to the flow. |
| `CollapseContainedItems` | bool | `false` | Whether contained editors start collapsed. |
| `DefaultAlignment` | FlowAlignment? | `null` | Default alignment for new flow items. |

### FlowPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("FlowPart", part => part
        .WithPosition("3")
        .WithSettings(new FlowPartSettings
        {
            ContainedContentTypes = new[] { "HtmlWidget", "ImageWidget", "BlockQuote" }
        })
    )
);
```

---

## BagPart

A container part allowing nested content items within a content item. Feature: `OrchardCore.Flows`.

### BagPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `ContainedContentTypes` | string[] | `[]` | Content types that can be added to the bag. |
| `DisplayType` | string | `"Detail"` | Display type for rendering bag items. |
| `ContainedStereotypes` | string[] | `[]` | Stereotypes allowed in the bag. |
| `CollapseContainedItems` | bool | `false` | Whether contained editors start collapsed. |

### BagPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("BagPart", "{{BagPartName}}", part => part
        .WithDisplayName("{{DisplayName}}")
        .WithPosition("4")
        .WithSettings(new BagPartSettings
        {
            ContainedContentTypes = new[] { "Slide", "Testimonial" }
        })
    )
);
```

---

## AliasPart

Provides an alias identifier for a content item. Feature: `OrchardCore.Alias`.

### AliasPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `Pattern` | string | `""` | Liquid pattern to generate the alias. |

### AliasPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("AliasPart", part => part
        .WithPosition("1")
        .WithSettings(new AliasPartSettings
        {
            Pattern = "{{ ContentItem.DisplayText | slugify }}"
        })
    )
);
```

---

## PublishLaterPart

Allows scheduling future publish dates. Feature: `OrchardCore.PublishLater`.

### PublishLaterPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("PublishLaterPart", part => part
        .WithPosition("5")
    )
);
```

---

## LocalizationPart

Enables content localization (translation). Feature: `OrchardCore.ContentLocalization`.

### LocalizationPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("LocalizationPart", part => part
        .WithPosition("6")
    )
);
```

---

## TaxonomyPart

Makes a content type act as a taxonomy container. Feature: `OrchardCore.Taxonomies`.

### TaxonomyPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `TermContentType` | string | `""` | The content type to use for terms. |

### TaxonomyPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{TaxonomyType}}", type => type
    .WithPart("TitlePart", part => part.WithPosition("0"))
    .WithPart("TaxonomyPart", part => part
        .WithPosition("1")
        .WithSettings(new TaxonomyPartSettings
        {
            TermContentType = "{{TermContentType}}"
        })
    )
);
```

---

## SeoMetaPart

Provides SEO metadata (meta title, description, etc.). Feature: `OrchardCore.Seo`.

### SeoMetaPart Settings

| Setting | Type | Default |
|---|---|---|
| `DisplayKeywords` | bool | `false` |
| `DisplayCustomMetaTags` | bool | `false` |
| `DisplayOpenGraph` | bool | `false` |
| `DisplayTwitter` | bool | `false` |
| `DisplayGoogleSchema` | bool | `false` |

### SeoMetaPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("SeoMetaPart", part => part
        .WithPosition("10")
    )
);
```

---

## PreviewPart

Enables content preview. Feature: `OrchardCore.ContentPreview`.

### PreviewPart Settings

| Setting | Type | Default | Description |
|---|---|---|---|
| `Pattern` | string | `""` | Liquid pattern for the preview URL. |

### PreviewPart Migration

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .WithPart("PreviewPart", part => part
        .WithPosition("11")
        .WithSettings(new PreviewPartSettings
        {
            Pattern = "{{ ContentItem | display_url }}"
        })
    )
);
```

---

## Content Type Options

When defining a content type, these options control the content type behavior:

```csharp
await _contentDefinitionManager.AlterTypeDefinitionAsync("{{ContentType}}", type => type
    .DisplayedAs("{{DisplayName}}")
    .Creatable()        // Can be created from the admin
    .Listable()         // Appears in content listings
    .Draftable()        // Supports draft versions
    .Versionable()      // Supports versioning
    .Securable()        // Supports per-content permissions
    .Stereotype("{{Stereotype}}") // Set a stereotype (e.g., "Widget", "MenuItem")
);
```

---

## Installing Third-Party Part Modules

Modules that provide custom parts from external sources (community or third-party modules) must be installed as NuGet packages in the **web project** (the startup project of the solution):

```xml
<Project Sdk="Microsoft.NET.Sdk.Web">
  <ItemGroup>
    <!-- Orchard Core base -->
    <PackageReference Include="OrchardCore.Application.Cms.Targets" Version="3.*" />

    <!-- Third-party modules must be added to the web project -->
    <PackageReference Include="Lombiq.HelpfulExtensions.OrchardCore" Version="1.*" />
  </ItemGroup>
</Project>
```

For local project references to third-party modules:

```xml
<ItemGroup>
  <!-- Local third-party module project reference in the web project -->
  <ProjectReference Include="../ThirdParty.Module/ThirdParty.Module.csproj" />
</ItemGroup>
```

For field settings and editor choices, see `orchardcore-content-fields`. For routing options, see `orchardcore-autoroute`.

