Like many other WordPress terms, the idea of a “post” can be confusing at first. In WordPress, a post is both a content item and part of a wider data model stored in the database. Historically this happened because WordPress started as a blogging platform and later expanded to support many more kinds of content.
In the WordPress database there are several main groups of data, including posts, users, comments, and links. In this article we will focus on posts, introduce the idea of post types, and look at how posts relate to other records.
What a post means in WordPress
At the database level, each row in wp_posts is a stored content item, and the post_type field tells WordPress what kind of content it is. That value may be post, page, or any custom post type.
At the same time, “post” is also the name of the built-in blog post content type. That overlap in terminology is part of what makes the concept feel confusing to newcomers.

Post types in WordPress
WordPress includes several built-in post types by default:
- Post
- Page
- Attachment
- Revision
- Navigation Menu Item
Beyond those, developers can register custom post types with register_post_type(). That means WordPress can store many kinds of structured content while still using the same wp_posts table schema.
When building custom queries, the key parameter is usually post_type. For example, this query targets regular posts:
'post_type' => 'post'
Changing the value lets you query another content type, such as a custom book post type:
'post_type' => 'book'
Understanding the built-in post types
Custom post types can behave very much like the built-in content types, except for a few special cases such as attachments. Each post type can have its own admin UI and its own query behavior while still sharing the same underlying storage model.
Relationships between posts
The post_parent field is especially important because it stores parent-child relationships between post records. WordPress uses it for several different scenarios:
- Parent pages and child pages
- Post revisions linked to the original post
- Attachments linked to the post or page they belong to
For example, when querying child pages of a specific page, you use the post_parent parameter:
'post_parent' => 'ID'
You can also use the same idea to query attachments that belong to a post, or unattached media by setting post_parent to 0:
'post_parent' => 0
WordPress also supports array-based parent lookups with parameters such as post_parent__in, which is useful when querying child pages for several parent posts at once.
Summary
Understanding the wp_posts table is an essential step toward understanding the WordPress database as a whole. It stores both built-in post types and custom post types, and it represents hierarchy through fields such as post_parent. Once that model becomes clear, many other parts of WordPress data handling start to make much more sense.
