In my web development practice, one of the most important missing features in current WordPress is the capacity to define relationships between content objects – the kind of situation the Posts 2 Posts plugin has been solving since 2010.
While thinking about strategies of implementing relationships in an upcoming project, I have been wondering: how does WP handle existing relationships between objects ?
Here are some of the object relationships we already have in WP core:
- Comments, that are linked to posts
- Child-pages, that are linked to a parent page
- Attachments, that are attached to posts
- Featured images, that are attached to posts
Let’s have a look at the inner workings:
Comments
Comments are a special type of content: they are stored in the "wp_comments"
table in the database.
There’s a "comment_post_ID"
column, that contains the ID of the related Post.
It’s a comment -> post (child -> parent) relationship.
Child-pages
Child pages, just as pages and posts, are stored the "wp_posts"
table.
For child pages, the "post_parent"
column holds the parent ID.
It’s a child -> parent relationship.
Attachments
Attachments are also stored in the the "wp_posts"
table.
Just as for child-pages, the ID of the parent post (where the file was uploaded to) is stored in the "post_parent"
field.
It’s a child -> parent relationship.
Featured images
If we define a “featured image” (ID 7537) for a page (ID 8089), what changes in the database?
The change occurs in the “wp_postmeta” table, the entry looks like this:
meta_id: 4953
post_id: 8089
meta_key: _thumbnail_id
meta_value: 7537
Basically, when defining the “featured image”, a custom field is created, that stores the ID of the image, under the _thumbnail_id
field.
It’s a parent -> child
relationship.
Conclusion
In WP core, there are two methods of registering content relationships.
- “post_parent” field : for simple relationships: the “post_parent” field of the wp_posts table can store the parent ID.
- “a custom field” : For more complicated cases, a custom field can store the ID of the linked item.