Craft 3 Documentation

Sections and Entries

Introduction here

Entries #

Entries hold the content that you want to display on your web pages. Each entry has an Author, a Post Date, an Expiration Date (if desired), a status (enabled or disabled), and of course, content.

You can also create drafts of entries that live alongside the current live version of the entry.

Typically each entry will have a stake in its own primary URL on your site, though Craft can fetch any entry from anywhere if your template needs it.

Sections #

Before you can create entries, you must create Sections to contain them. In each Section you can define the following:

If you’re using Craft with multiple sites then you can also define in your Section:

To create a new section, go to Settings → Sections and click the “New Section” button.

Section Types #

Not all sections are created equal. Craft has three different types of sections:

Singles #

Singles are used for one-off pages that have unique content requirements, such as:

Unlike the other section types, Singles only have one entry associated with them, and they don’t have an editable Author, Slug, Post Date, or Expiration Date.

Channels #

Channels are used for streams of similar content, such as:

Structures #

Structures are good for times when you need to store multiple similar entries, and sort them into a specific order. They can also be hierarchical. Examples include:

Entry URI Formats #

Channel and Structure sections can choose whether their entries should be assigned URLs in the system, by filling in the “Entry URI Format” setting.

Entry URI Formats are mini Twig templates, which will be rendered each time an entry in the section is saved. The rendering result will be saved as the entry’s URI in the system.

The entry being saved will be available to the template as an object variable, and each of the entry’s properties and custom field values will also be available as their own variables. So something like this is possible:

{{ author.username }}/{{ slug }}

A shortcut syntax is also available for output tags that reference a property on the entry:


Structure sections may wish to have an Entry URI Format that differs depending on whether it’s a top-level entry or a nested one:

{% if level == 1 %}docs{% else %}{parent.uri}{% endif %}{slug}

With that Entry URI Format, a top-level entry might end up with the URI docs/templating, whereas a nested entry might end up with the URI docs/templating/tags.

The same template could also be expressed with this syntax:

{parent.uri ?? 'docs'}/{slug}

Entry Types #

Both Channel and Structure sections let you define multiple types of entries using Entry Types.

You can manage your sections’ Entry Types by clicking the “Edit Entry Types” link beside the section’s name in Settings → Sections. That’ll take you to the section’s entry type index. Clicking on an entry type’s name takes you to its settings page:

Entry Type Edit Settings

Entry types have the following settings:

Dynamic Entry Titles #

If you want your entries to have auto-generated titles rather than requiring authors to enter them, you can uncheck the “Show the Title field?” checkbox. When you do, a new “Title Format” setting will appear, where you can define what the auto-generated titles should look like.

The Title Format is a full-blown Twig template, and it will get parsed whenever your entries are saved.

The entry is passed to this template as a variable named object. You can reference the entry’s properties in two ways:

Note that the shortcut syntax only has one set of curly braces.

If Craft finds any of these in your Title Format, it will replace the { with {{object. and the } with }}, before passing the template off to Twig for parsing.

You can use Twig filters in both syntaxes:

{{ object.postDate|date('M j, Y') }}
{postDate|date('M j, Y')}

Craft’s global variables are available to these templates as well:

{{ now|date('Y-m-d') }}
{{ currentUser.username }}

Conditionals are also fair game. There’s no shortcut syntax for those, so if you want to use a conditional on one of the entry’s properties, you will need to reference it with the object variable:

{% if object.postDate %}{postDate|date('M j, Y')}{% else %}{{ now|date('M j, Y') }}{% endif %}

Editing Entries #

If you have at least one section, there will be an “Entries” tab in the primary CP nav. Clicking on it will take you to the entry index. From there you can navigate to the entry you wish to edit, or create a new one.

You can perform the following actions from the Edit Entry page:

If you leave the Post Date blank, Craft will automatically set it the first time an entry is saved as enabled.